2026년 10월 6일 · 리서치

시장에 표시된 적 없는 가격으로 백테스트가 체결된 이유는 무엇일까요?

시장에 표시된 적 없는 가격으로 백테스트가 체결된 이유는 무엇일까요?

백테스트에서 시장에 표시된 적 없는 가격으로 체결됐다고 나올 수 있습니다. 대개 시뮬레이터가 불완전한 데이터, 즉 봉의 고가와 저가, 중간값 또는 단 한 건의 거래가 건드린 지정가를 바탕으로 그럴듯한 체결을 추정한 결과입니다. 이 때문에 거래 기록은 정밀해 보이지만, 당시 시장에서 실제로 어떤 가격을 제시했는지는 가려질 수 있습니다.

먼저 주문이 어떤 가격과 거래될 수 있었는지 따져보세요. 최근 거래 가격을 담은 봉은 일정 구간에 어떤 가격으로 거래가 이뤄졌는지를 보여줍니다. 주문이 도착했을 때 매수호가와 매도호가가 얼마였는지, 해당 가격에 물량이 얼마나 있었는지, 주문이 대기열 맨 앞에 설 수 있었는지는 알려주지 않습니다.

백테스트에서 시장 가격 범위를 벗어난 체결이 표시되는 이유는 무엇일까요?

먼저 ‘범위를 벗어났다’는 말의 의미를 정확히 따져봅시다. 봉의 저가보다 낮은 매수 체결이나 고가보다 높은 매도 체결은 명백한 회계 또는 타이밍 오류입니다. 하지만 고가와 저가 사이의 체결가도 실제와 다를 수 있습니다. 주문이 생기기 전에 그 가격으로 거래가 이뤄졌거나, 스프레드의 반대편 가격이었거나, 주문을 체결하기엔 거래량이 너무 적었을 수 있습니다.

시가 100.00, 저가 99.80, 종가 100.10인 1분 봉을 생각해보세요. 전략이 완성된 봉을 확인하고 매수 주문을 내자 시뮬레이터가 99.80에 체결합니다. 하지만 저가는 시그널이 나오기 50초 전, 분봉 초반에 기록됐을 수도 있습니다. 이 봉만으로는 매수 결정 이후에도 99.80에 주문할 수 있었다고 볼 근거가 없습니다.

보유한 데이터확인할 수 있는 내용확인할 수 없는 내용
OHLCV 봉구간별 관측 거래 가격 범위와 거래량가격의 발생 순서, 매수호가와 매도호가, 주문 도착 시점의 유동성
거래 체결 내역시각과 가격이 기록된 체결 정보대기 중인 유동성이나 대기열에서의 내 위치
최우선 호가샘플링 시점별 최우선 매수호가와 매도호가최우선 호가 너머의 잔량이나 샘플 사이에도 호가가 유지됐는지 여부
호가창 이벤트피드가 포착한 범위 내에서 표시 잔량의 변동과 대기열 이벤트숨은 유동성, 거래소 접근 여부, 우선순위 보장

또 다른 흔한 원인은 중간값과 실제 체결 가능한 가격을 혼동하는 것입니다. 호가가 매수 99.99, 매도 100.01이라면 보고서에 매수 체결가를 중간값인 100.00으로 적는 것이 깔끔해 보일 수 있습니다. 하지만 시장가성 매수 주문은 일반적으로 매도호가를 지불하고, 주문 규모에 따른 시장 충격도 발생합니다. 중간값을 체결가로 처리하면 스프레드의 절반이 조용히 사라집니다.

시장이 지정가를 건드렸다는 이유만으로 지정가 주문이 체결될 수 있을까요?

가격 터치는 해당 지정가에 거래가 발생했다는 증거입니다. 하지만 대기 중인 주문이 실제로 체결됐으리라는 증명은 아닙니다. 앞서 대기하는 주문이 있었다면 해당 가격의 거래량이 내 주문 순번까지 닿기에 부족했을 수 있습니다. 또 내 주문은 다른 거래소에 대기 중인데 체결 내역은 다른 거래소에서 나온 것일 수도 있습니다.

매수 지정가가 50.00이고 주문을 낸 뒤 시장에서 그 가격에 200주가 거래됐다고 해보겠습니다. 가격 터치 방식의 시뮬레이터는 500주 전량을 체결합니다. 더 신중한 모델은 주문 도착 이후 50.00 또는 그보다 유리한 가격에서 거래된 수량을 확인한 뒤, 내 앞에 있을 것으로 추정되는 대기 물량을 반영합니다. 주문 단위 호가창 데이터가 없다면 대기열은 가정에 불과합니다. 이를 확실한 사실처럼 숨기지 말고 결과에 드러내야 합니다.

소규모 리서치 시스템이라면 캔들 데이터가 대기열 순위를 알려주는 것처럼 가장하기보다, 그 가정을 명시하고 여러 범위에서 시험하는 편이 낫습니다. 적절한 범위는 거래소, 주문 규모, 전략의 거래 빈도에 따라 다릅니다. 개장 직후 거래가 뜸한 주식과 UTC 03:00의 유동성이 얕은 크립토 계약은 체결 문제가 서로 다릅니다.

봉 데이터를 위한 체결 모델은 어떻게 선택해야 할까요?

데이터와 전략이 주장하는 바에 모두 맞는 모델을 선택하세요. 봉 기반 백테스트도 느리게 거래하는 전략에는 여전히 유용할 수 있지만, 체결은 봉 데이터가 실제로 보여주는 내용에 맞춰야 합니다.

  1. 의사결정 시점과 주문 도착 시점을 정하세요. 시그널이 봉 종가를 사용한다면 종가가 확정된 뒤 주문을 내세요. 체결은 완성된 봉에서 더 일찍 나온 저가가 아니라, 다음으로 이용 가능한 구간이나 호가를 기준으로 모델링하세요.
  2. 스프레드의 올바른 쪽 가격을 사용하세요. 시장가성 매수는 매도호가에서, 매도는 매수호가에서 시작하세요. 거래 봉만 있다면 별도 출처로 스프레드를 추정하거나 모델에서 스프레드를 제외했다고 밝혀야 합니다.
  3. 현실적인 유동성에 맞춰 체결량을 제한하세요. 관측 거래량에 참여율 한도를 적용하고 수수료와 시장 충격을 포함하세요. 봉의 전체 거래량이 선택한 가격에 그만큼의 물량이 있었다는 뜻은 아닙니다.
  4. 가정을 바꿔가며 검증하세요. 다음 시가 체결을 보수적인 슬리피지와 비교하고, 더 불리한 체결에서도 결과가 유지되는지 시험하세요. 전략이 이길 때까지 체결 모델을 조정해서는 안 됩니다.

이는 모델링 선택일 뿐, 불완전한 데이터에서 하나뿐인 진짜 체결가를 알아내는 방법은 아닙니다. 전략이 몇 bp를 포착하는 데 달려 있다면, 봉 데이터만으로는 그런 주장을 뒷받침하기 어려울 수 있습니다.

불가능한 체결가가 백테스트에 들어온 경로는 어떻게 찾을 수 있을까요?

의심스러운 거래 하나를 시그널부터 원장까지 추적하세요. 의사결정 시각, 주문 제출 시각, 시뮬레이션상 도착 시각, 선택한 시장 관측값, 체결가, 체결 수량, 수수료를 각각 별도 필드로 기록하세요. 그런 다음 다음 순서로 확인하세요:

거래 기록으로 이 질문에 답할 수 없다면 백테스트에 체결 근거가 빠져 있는 것입니다. 관련 필드를 추가하고 원시 데이터를 바탕으로 거래 몇 건을 직접 재생한 뒤, 의도한 모델에서 보고된 체결이 실제로 가능했는지 확인하세요. 아무리 매끄러운 자산 곡선도 시뮬레이터 안에서만 존재했던 가격을 잡아내지는 못합니다.

백테스팅시장 데이터체결데이터 엔지니어링
← 전체 글