백테스팅과 페이퍼 트레이딩: 실전 자금 투입 전 필수 관문

🌐 English

전략 아이디어가 떠오르면 바로 실전에 넣고 싶어집니다. 그 충동을 막아주는 두 관문이 백테스팅페이퍼 트레이딩입니다. 자동매매 봇을 만들며 이 두 단계를 건너뛰었다가 잃은 시간과 돈에서 배운 것을 정리합니다.

⚠️ 이 글은 교육·정보 제공 목적입니다. 투자 권유가 아니며, 투자 손실 책임은 본인에게 있습니다.

두 관문은 다른 질문에 답한다

  • 백테스팅은 "과거 데이터에서 이 전략이 통했는가?"를 묻습니다.
  • 페이퍼 트레이딩은 "지금 실시간 시장에서, 실제 주문 흐름으로 동작하는가?"를 묻습니다.

백테스트를 통과했다고 실전에서 통하는 것은 아닙니다. 실시간에서는 데이터 지연, 주문 거부, 부분 체결, 호가 증발 같은 일이 벌어지는데, 이건 과거 데이터로는 절대 재현되지 않습니다. 그래서 두 관문은 순서대로 필요합니다.

함정 1: 오버피팅

가장 흔한 실패입니다. 파라미터를 과거 데이터에 맞춰 계속 튜닝하다 보면, 백테스트 수익률은 하늘로 치솟습니다. 하지만 그건 과거의 우연을 외운 것일 뿐, 미래에는 재현되지 않습니다.

방어법은 단순합니다.

  • 파라미터 개수를 줄인다. 진입/청산 임계치 두 개로 되는 전략을, 굳이 열 개로 만들지 않습니다.
  • In-sample / Out-of-sample 분리. 최적화에 쓰지 않은 기간에서 성과가 유지되는지 확인합니다.
  • 의심스러울 만큼 좋은 결과는 의심한다. 승률 95%짜리 백테스트는 대개 버그거나 오버피팅입니다.

실제로 저는 갭 전략의 진입 임계치를 백테스트 데이터가 없는 상태에서 임의값(예: 0.50%)으로 두고 시작했습니다. "모른다"를 인정하고 소액 운영으로 실제 분포를 관측한 뒤 조정하는 편이, 없는 데이터에 파라미터를 억지로 맞추는 것보다 정직합니다.

함정 2: 슬리피지와 수수료를 0으로 두기

백테스트에서 모든 주문이 "원하는 가격에 즉시 전량 체결"된다고 가정하면, 수익률이 극적으로 부풀려집니다. 현실은 다릅니다.

백테스트 이론 손익 = (청산가 - 진입가) × 수량

실전 손익 = (청산가 - 진입가) × 수량

           - 진입 슬리피지 - 청산 슬리피지

           - 매수 수수료 - 매도 수수료 - 세금

특히 유동성이 얕은 종목(상장 초기 ETF 등)은 시장가로 조금만 큰 금액을 밀어도 호가를 훑고 올라가 슬리피지가 커집니다. 갭 차익처럼 한 번에 먹는 수익이 0.1~0.5% 수준인 전략이라면, 수수료와 슬리피지만으로 기대수익이 통째로 사라질 수 있습니다.

백테스트에는 보수적인 비용 가정을 반드시 넣으세요. 애매하면 실제보다 나쁘게 잡는 편이 안전합니다.

함정 3: 미래 참조(look-ahead bias)

계산 시점에 아직 알 수 없는 값을 슬쩍 참조하는 버그입니다. 예를 들어 "그날 시가"로 신호를 만드는데, 백테스트 코드가 실수로 그날 종가를 미리 참조하면 성과가 마법처럼 좋아집니다. 실전에서는 존재하지 않는 정보라 그대로 무너집니다.

방어법은 "그 시점의 봇이 실제로 알 수 있는 값만 쓴다"를 코드로 강제하는 것입니다. 데이터를 시간순으로 흘려보내며 미래 구간을 잘라내고 계산하세요.

페이퍼 트레이딩: 주문만 막고 나머지는 실전처럼

백테스트를 통과했다면, 실시간 데이터로 돌리되 주문 전송만 차단하는 단계를 거칩니다. 실제 봇에서도 매매 함수가 실주문 대신 로그만 남기는 stub 모드를 두었습니다.

// 실주문 대신 로그만 — 페이퍼 트레이딩 모드

logCh <- fmt.Sprintf("[DRY-RUN] BUY %s x%d @ %.0f", code, qty, price)

// orderExecutor 는 여기서 실제 REST 주문을 보내지 않음

이 단계에서 확인할 것: WebSocket이 장중 내내 안 끊기는지, 시그널이 예상 빈도로 나오는지, 강제청산이 정확한 시각에 도는지, 재시작 후 상태가 복구되는지. 코드가 시장의 하루를 온전히 견디는지를 보는 리허설입니다.

정리

순서는 이렇습니다: 백테스트로 아이디어를 거르고 → 보수적 비용을 반영해 다시 검증하고 → 페이퍼 트레이딩으로 시스템을 리허설하고 → 그다음에야 소액으로 실전에 진입합니다. 이 관문들을 건너뛴 "무조건 수익" 같은 전략은 존재하지 않습니다. 관문은 느려 보여도, 결국 가장 빠른 길입니다.

댓글

이 블로그의 인기 게시물

한국투자증권 KIS API로 실시간 시세 받기 (WebSocket 실전)

파이썬으로 업비트 API 연동하기 — 시세 조회부터 주문까지 기초

Go로 자동매매 신호봇 프레임워크 설계하기