전략이 10:00에 지정가 주문을 냅니다. 10:03에 시그널이 바뀝니다. 백테스트는 10:04에 아무 말 없이 주문을 새것으로 바꾸고, 10:05에는 체결된 것으로 계산합니다. 하지만 모의 거래에서는 기존 주문이 거래소에 여전히 남아 있을 수 있습니다. 새 주문도 유효한 상태에서 기존 주문까지 체결되면 전략에는 주문이 2개인데, 포지션 모델은 주문이 하나였던 것처럼 처리하게 됩니다.
미체결 주문에는 자체 상태와 시계가 필요합니다. 백테스트는 각 주문이 언제 제출됐는지, 언제 취소할 수 있는지, 취소 요청이 거래소에 도달했는지, 취소와 체결이 경합하면 어떤 일이 생기는지 알아야 합니다. 다음 3가지 편법은 이런 사실을 자주 지워버립니다.
실수 1: 새 시그널이 나오면 즉시 취소된다고 가정하기
많은 백테스트는 매 봉마다 목표 포지션을 다시 계산한 뒤, 최신 시그널이 원하는 대로 대기 중인 주문을 덮어씁니다. 그러면 전략이 마음을 바꾸는 순간 주문이 사라집니다. 실제 거래소는 그렇게 작동하지 않습니다. 취소 요청에는 시간이 걸리고, 거래소가 요청을 처리하기 전에 주문이 체결될 수도 있습니다.
주당 $50.00에 100주를 매수하는 지정가 주문을 생각해 보겠습니다. 10:03에 시그널이 약해져 전략이 취소 요청을 보냅니다. 10:03:00.080에 주문 중 60주가 체결되고, 10:03:00.110에 취소가 확인됩니다. 나머지 40주는 취소되지만 포지션에는 이미 60주가 들어 있습니다. 10:03에 주문을 삭제하는 봉 단위 백테스트는 체결 수량을 0으로 보고할 수 있습니다. 즉시 취소된다고 가정하면서 이후 체결까지 기록하는 백테스트는 반대 방향의 익스포저를 만들어낸 셈입니다.
주문 상태를 명시적으로 추적하세요. 제출됨, 확인됨, 부분 체결, 취소 대기, 취소됨, 전량 체결 상태를 구분합니다. 취소가 확인되기 전에 발생한 체결은 그대로 반영하세요. 거친 봉 단위 시뮬레이션에서는 한 봉 안에 두 이벤트가 모두 일어날 수 있을 때 보수적인 처리 순서를 정하고 공개하세요.
실수 2: 대기 중인 주문의 유효 기간을 무한대로 두기
10:00 시그널을 바탕으로 정한 지정가는 명시적인 청산 규칙이 없어도 낡은 주문이 될 수 있습니다. 호가창이 움직이고, 변동성이 달라지며, 상품의 시장 가치도 바뀔 수 있습니다. 그런데 체결될 때까지 주문을 활성 상태로 두는 시뮬레이터는 몇 달 뒤의 체결을 더는 유효하지 않은 투자 논리에 따른 것으로 계산할 수 있습니다.
전략에 맞는 주문 유효 기간 정책을 설정하세요. 1-minute 시그널에는 30초 만료를 적용할 수 있고, 일일 리밸런싱 주문은 장 마감까지 유지할 수 있습니다. 이는 전략에 따른 선택이지 보편적인 기본값은 아닙니다. 전략이 매 봉마다 가격을 다시 정한다면 주문이 새 가격으로 순간 이동하는 것처럼 처리하지 말고 취소와 대체 주문의 순서를 모델링하세요.
| 주문 정책 | 일반적인 용도 | 백테스트에서 확인할 점 |
|---|---|---|
| 즉시 체결 또는 취소 | 가능한 유동성을 즉시 확보한 뒤 종료 | 주문 제출 시점에 어느 정도까지 체결될 수 있었나? |
| 짧은 만료 시간 | 체결 가능 시간이 짧은 빠른 시그널 | 가격이 돌아왔을 때 주문은 아직 유효했나? |
| 세션 종료까지 | 느린 리밸런싱 또는 종가 경매 의도 | 거래소가 실제로 이 유효 기간을 지원하나? |
실수 3: 가격이 닿을 때마다 체결로 계산하기
캔들의 저가가 매수 지정가에 도달했다고 해서 주문이 반드시 체결되는 것은 아닙니다. 앞에 대기 중인 주문이 있었거나, 그 가격에서 거래량이 적었거나, 주문이 도착하기 전에 잠깐 해당 가격에 거래됐을 수 있습니다. 오래된 주문 모델은 흔히 이 3가지 오류를 한꺼번에 범합니다. 주문을 너무 오래 활성 상태로 두고, 대기열 맨 앞에 있다고 가정한 뒤, 가격이 닿으면 전량 체결로 처리합니다.
최소한 주문 도착 전에는 체결되지 않게 하고, 지정가에서 발생한 것으로 볼 수 있는 거래량을 기준으로 시뮬레이션 수량을 제한하세요. 대기열 순서가 중요한 전략에는 체결 및 호가창 데이터를 사용하거나 의도적으로 보수적인 대기열 모델을 적용하세요. 가격 도달 기준 체결은 대략적인 선별에 유용할 수 있지만, 낙관적인 근사치임을 표시하고 더 엄격한 가정과 비교해야 합니다.
실용적인 점검 방법 하나: 각 주문의 생성 시각, 활성 시간 범위, 취소 요청과 확인 시각, 체결 시각, 체결 수량, 잔여 수량을 모두 기록하세요. 그런 다음 시그널이 뒤집힌 시점 전후의 거래 몇 건을 재생해 보세요. 주문이 체결됐을 때 왜 아직 유효했는지 설명할 수 없다면 백테스트의 체결 건수를 다시 살펴봐야 합니다.
모의 거래하려는 주문을 모델링하세요
주문 상태는 전략의 의도를 실제 익스포저와 연결합니다. 포지션은 시그널 목표나 취소 요청이 아니라 체결에 따라 바뀌어야 합니다. 대체 주문은 감사할 수 있도록 이력을 남기고, 부분 체결은 다음 의사결정까지 유지해야 합니다. 백테스트가 조금 번거로워지지만 모의 거래와의 비교는 더 의미 있어집니다. 실행 결과가 다르더라도 그 이유를 파악할 수 있기 때문입니다.
주문 모델이 불확실하다면 그 불확실성을 결과에 반영하세요. 주문 유효 기간을 짧게 또는 길게 설정하고, 취소 지연 시간을 바꿔 보면서 낙관적인 대기열 가정에 성과가 얼마나 좌우되는지 보여주세요. 전략 자체는 괜찮을 수 있습니다. 하지만 겉으로 드러난 수익 기회가 실제 시스템이라면 몇 시간 전에 취소했을 주문에서 나온 것일 수도 있습니다.
← 전체 글


