백테스트에서는 제출한 주문 100건 가운데 91건이 체결된 것으로 계산했습니다. 페이퍼 트레이딩에서 같은 전략은 63건을 체결했습니다. 신호 발생부터 주문 확인까지 걸린 시간의 중앙값은 84밀리초였고, 페이퍼에서 체결되지 않은 주문 중 12건은 가격이 닿자마자 체결된 것으로 백테스트가 가정한 지정가 주문이었습니다.
처음에는 28%p 차이가 전략의 문제처럼 보였지만, 주문 결정과 체결 결정을 분리해 보니 달랐습니다. 두 실행에서 전략이 선택한 방향, 수량, 가격은 거의 같았습니다. 차이는 실행 경로에 있었습니다. 일부 주문은 늦게 도착했고, 일부는 미체결 상태로 남았으며, 또 일부는 이미 움직인 시장에서 체결을 시도했습니다.
백테스트와 페이퍼 간 주문 일치도란 무엇인가요?
일치도란 백테스트와 페이퍼 시스템이 동일하게 이용 가능한 정보를 바탕으로 비교 가능한 결정을 내리고, 서로 다른 실행 모델은 명시적으로 반영한다는 뜻입니다. 모든 시뮬레이션 체결이 페이퍼 체결과 일치해야 한다는 의미는 아닙니다. 과거 봉 데이터로는 대기열 내 순서를 재구성할 수 없고, 페이퍼 거래소가 실제 거래소와 다른 매칭 모델을 쓸 수도 있습니다.
유용한 질문은 더 구체적입니다. 전략이 내려고 한 각 주문에 대해 그다음에 무슨 일이 있었는지 설명할 수 있나요? 거래 횟수와 최종 수익률만으로는 너무 많은 정보가 가려집니다. 각 결정에 대해 연결된 기록을 남기고, 신호, 주문, 확인, 취소, 체결 이벤트 전반에 걸쳐 고유한 전략 결정 ID를 유지하세요.
| 비교 항목 | 확인할 수 있는 문제 | 예시 |
|---|---|---|
| 결정 시각과 방향 | 입력 데이터 또는 스케줄링 차이 | 페이퍼 신호가 봉 하나 늦게 발생 |
| 요청 수량과 가격 | 반올림, 리스크 또는 거래소 규칙 | 백테스트는 0.013 BTC를 제출하고, 페이퍼는 0.01로 반올림 |
| 주문 상태 전이 | 제출, 거부, 취소 과정의 차이 | 백테스트는 취소 요청을 취소 완료로 처리 |
| 체결 수량과 가격 | 낙관적인 체결 모델 또는 시장 움직임 | 가격이 닿은 지정가 주문을 백테스트에서는 전량 체결 처리하지만, 페이퍼에서는 체결되지 않음 |
가격이 닿은 지정가 주문이 왜 이렇게 많은 미체결을 차지했을까요?
백테스트는 1분 봉을 사용했습니다. 지정가가 봉의 고가와 저가 사이에 들어오면 주문을 체결된 것으로 표시했습니다. 이 규칙은 해당 1분 동안 시장 가격이 그 가격에 거래된 적이 있는지를 답해 줍니다. 그때 주문이 활성 상태였는지, 대기열의 맨 앞이었는지, 주문 도착 후 충분한 수량이 거래됐는지는 알려주지 않습니다.
페이퍼 로그에서 타이밍 문제가 드러났습니다. 전략은 12:03:00.000에 신호를 계산했지만, 시장 데이터 이벤트는 31밀리초 뒤에 주문 처리 프로세스에 도달했습니다. 리스크 검사에 22밀리초가 더 걸렸고, 거래소 시뮬레이터는 그로부터 31밀리초 후에 주문을 확인했습니다. 시장이 빠르게 움직일 때 과거 봉에서는 어떤 가격에 도달할 수 있었던 것처럼 보여도, 지정가 주문이 도착했을 때는 이미 시장이 그 가격을 벗어났을 수 있습니다.
또 다른 문제가 있었습니다. 백테스트가 이미 다음 단계로 넘어간 시점에도 페이퍼 주문 12건이 열려 있었습니다. 시뮬레이터는 취소 요청을 주문이 즉시 사라진 것처럼 처리했습니다. 페이퍼 시스템에서는 취소 확인이 나중에 도착했고, 그 사이에 주문 3건이 체결됐습니다. 그 결과 다음 신호가 참조하는 포지션이 달라졌습니다.
착시 없이 차이를 어떻게 측정할 수 있나요?
주문 의도별로 묶은 간단한 대조 보고서부터 만드세요. 분모를 명확히 표시해야 합니다. “체결률”은 제출 주문 중 체결된 주문의 비율, 요청 수량 대비 체결 수량의 비율, 또는 거래소에 도달한 주문 중 체결된 주문의 비율을 뜻할 수 있습니다. 각각 다른 질문에 답합니다.
- 사후에 추측한 타임스탬프 대신 결정 ID나 클라이언트 주문 ID로 이벤트를 연결하세요.
- 먼저 결정을 비교하세요. 신호 시각, 방향, 요청 수량, 주문 유형, 지정가를 확인합니다.
- 결정이 일치하는 경우 확인 지연, 거부, 주문 유지 시간, 취소 시각, 체결 수량, 거래량 가중 체결 가격을 비교하세요.
- 주문 유형과 시장 상황별로 비율을 보고하세요. 전체 체결률이 63%여도 시장가 주문은 90%, 지정가 주문은 35%일 수 있습니다.
분류가 서로 겹치지 않도록 명확히 하세요. 거부된 주문은 미체결 주문과 다르고, 부분 체결 주문은 전량 체결 주문과 다릅니다. 부분 체결 후 취소된 주문도 포지션을 바꿉니다. 주문 수와 요청 수량을 모두 집계해 작은 주문이 몰린 탓에 결과가 실제보다 좋아 보이지 않게 하세요.
백테스트에서 무엇을 바꿔야 할까요?
데이터 해상도와 의도한 주문 동작에 맞는 체결 규칙을 사용하세요. 봉 데이터에서 지정가에 가격이 닿았다는 것은 체결 가능성이 있다는 근거일 뿐, 체결을 증명하지는 않습니다. 보수적으로 부분 체결을 모델링하거나, 가격이 지정가를 지나가야 체결로 보거나, 대기열을 추정할 수 없는 지정가 주문을 제외할 수 있습니다. 각각 다른 질문에 답하므로 규칙을 문서화하고, 타당한 규칙을 둘 이상 적용해 결과를 비교하세요.
주문 상태도 모델링하세요. 시스템이 최종 이벤트를 받을 때까지 주문은 유효하며, 취소 요청을 보냈다고 해서 노출이 사라지는 것은 아닙니다. 첫 주문이 대기 중일 때 전략이 두 번째 주문을 낼 수 있다면, 백테스트는 그 경쟁 상황을 반영하거나 설계상 발생하지 않도록 해야 합니다.
체결 모델은 주문이 어떤 결과를 낼 수 있었는지에 대한 가정입니다. 설명할 수 있는 규칙을 정하고, 페이퍼 로그와 대조해 확인하세요.
28%p 차이에서 놀라웠던 점은 분봉 백테스트가 지정가 체결을 과대평가했다는 사실이 아니었습니다. 취소 타이밍을 빼먹은 탓에 다음 결정을 내리기도 전에 전략의 포지션이 달라졌다는 점이었습니다. 주문 상태 모델을 바로잡고 가격이 닿은 모든 지정가를 체결로 처리하지 않자, 페이퍼 비교 결과는 덜 유리해졌지만 더 유용해졌습니다.
이것이 실질적인 일치도의 기준입니다. 시뮬레이션과 페이퍼 동작 사이의 의미 있는 차이마다 기록된 원인이 있고, 백테스트는 데이터로 확신할 수 없는 부분을 확실한 것처럼 주장하지 않습니다.
← 전체 글


