DepthFeed/Polymarket·백테스팅

오더북 기반 Polymarket 전략 백테스트 방법

한 시간에 한 번 샘플링한 마지막 체결가로는 당신의 주문이 실제로 체결됐을지 알 수 없습니다. 실제로 거래됐을 바로 그 오더북을 상대로 Polymarket을 백테스트하는 방법을 소개합니다.

DepthFeed··8 min

Polymarket 전략을 제대로 백테스트하려면, 그 전략이 실제로 마주했을 과거 오더북을 그대로 재생해야 합니다. 즉 변동이 일어날 때마다의 전체 매수/매도 호가 사다리를 재생하고, 당시 실제로 걸려 있던 유동성에 맞춰 체결 규모를 산정해야 합니다. 마지막 체결가나 단일 중간가(mid)로 백테스트하면 스프레드와 실제 주문이 치르는 슬리피지를 가리기 때문에, 당신의 엣지를 구조적으로 과대평가하게 됩니다.

마지막 체결가 백테스트가 거짓말을 하는 이유

무료로 구할 수 있는 Polymarket 데이터 대부분은 마지막 체결가이며, 흔히 한 시간에 한 번 샘플링됩니다. 그것으로는 차트를 그리는 정도가 전부입니다. 백테스트는 더 어려운 질문에 답해야 합니다. 그 순간 내 주문이 호가에 걸려 있었다면(혹은 스프레드를 넘어 체결을 쳤다면), 정말로 체결됐을까, 얼마만큼, 어떤 가격에 체결됐을까?

이 질문에 답하려면 단일 숫자가 아니라 오더북, 즉 걸려 있던 모든 매수·매도 호가와 그 규모가 필요합니다. 중간가를 기준으로 백테스트한 전략은 슬리피지 없이 항상 중간가에 체결됐다고 가정하는데, 이는 결코 사실이 아닙니다. 정산이 가까워질수록 스프레드가 벌어지는 단기 크립토 마켓에서는 이 가정 하나가 손실 전략을 겉보기 승리 전략으로 뒤집어 놓을 수 있습니다.

1단계 — 풀뎁스 오더북 데이터를 확보한다

고정된 시계가 아니라 변동이 일어날 때마다 포착해, 양측 호가의 전체 북을 기록한 데이터에서 출발하세요. DepthFeed는 Polymarket을 CLOB 웹소켓에서 곧바로 이벤트 기반으로 포착하므로, 모든 북과 가격 변동 이벤트가 전체 매수/매도 호가 사다리와 함께 기록됩니다. 5분짜리 마켓의 생애를 통째로 건너뛰는 시간 단위·분 단위 샘플이 아닙니다.

원하는 마켓은 REST API로 가져오세요. GET /v3/{coin}/markets로 마켓을 탐색한 뒤, /v3/{coin}/markets/{id}/snapshots에서 뎁스를 받아옵니다. 각 스냅샷은 매수/매도 가격과 규모 배열, 그리고 epoch-millis 단위의 거래소·수신 타임스탬프를 담고 있습니다.

2단계 — 매 순간의 북을 재구성한다

스냅샷을 타임스탬프 순서대로 재생해, 어느 시점이든 당시 그대로의 북을 복원합니다. 데이터가 이벤트 기반이므로 이벤트와 이벤트 사이의 재구성은 정확하며, 보간(interpolation)에 의한 추측이 끼어들지 않습니다. 이것이 바로 당신의 전략이 반응하는 상태입니다. 최우선 매수호가, 최우선 매도호가, 각 호가 뒤에 쌓인 뎁스, 그리고 스프레드 말입니다.

3단계 — 실제 뎁스에 맞춰 체결을 모델링한다

이제 체결을 정직하게 시뮬레이션하세요. 즉시 체결되는 주문(marketable order)은 북을 걸어 내려갑니다. 먼저 최우선 호가에 체결되고, 그 다음 호가, 또 그 다음 호가로 이어지며 주문 규모가 소진될 때까지 진행됩니다. 따라서 최상단 호가 이상을 소비하는 순간 평균 체결가는 터치 가격보다 나빠집니다. 호가에 거는 주문(resting order)은 대기열에 합류하며, 시장이 그 가격을 충분한 규모로 뚫고 지나갈 때에만 체결됩니다.

기록된 호가 사다리에 맞춰 체결 규모를 산정하는 것이 핵심입니다. 이를 통해 항상 중간가에 거래했다는 허구 대신 현실적인 슬리피지와 체결 확률을 얻게 됩니다.

4단계 — 기초자산 가격을 결합한다

Polymarket의 크립토 up/down 마켓은 기초자산의 현물 움직임에 의해 구동됩니다. DepthFeed의 모든 스냅샷은 epoch-millis 타임스탬프를 기준으로 고빈도 Binance 기준 가격에 결합되므로, 계약을 재가격(repricing)한 현물 움직임과 북 상태를 정렬할 수 있습니다. 크립토 가격과 마켓의 내재 확률 사이의 관계를 거래하는 전략이라면 이는 필수입니다.

5단계 — 동일한 코드로 실거래에 나선다

과거 데이터용 REST API와 실시간 WebSocket 스트림은 동일한 JSON 스냅샷 객체를 내보냅니다. 즉 과거 데이터를 재생하려고 작성한 로더가 실시간 피드를 그대로 읽어 들입니다. 연구와 프로덕션 사이에 코드를 다시 짤 필요가 없습니다. 백테스트하고, 검증한 뒤, 같은 코드를 wss://api.depthfeed.com/v3/stream으로 향하게 해 거래하세요.

흔한 함정

  • 마지막 체결가 데이터 사용: 스프레드와 슬리피지를 가려 백테스트 수익률을 부풀린다.
  • 고정 간격 스냅샷: 시간 단위·분 단위 샘플은 5분짜리 마켓 생애의 대부분을 놓친다.
  • 대기열 위치 무시: 호가에 건 주문이 항상 체결된다고 가정하면 패시브 전략을 과대평가한다.
  • 미래 참조 편향(look-ahead bias): 의사결정 시점 이전(또는 동시)의 수신 타임스탬프를 가진 데이터에만 반응하라.
  • 기초자산 누락: 크립토 up/down의 엣지는 대개 현물-확률 관계 속에 있다.

Key takeaways

  • 01마지막 체결가가 아니라 오더북을 상대로 백테스트하라. 체결을 결정하는 것은 뎁스다.
  • 02이벤트 기반 데이터를 써라. 고정 간격 샘플은 단기 마켓의 생애를 놓친다.
  • 03즉시 체결 주문은 북을 걸어 내려가고, 호가에 건 주문은 대기열에서 기다린다는 점을 모델링하라.
  • 04기초 크립토 가격을 결합해 현물-확률 관계를 포착하라.
  • 05과거 데이터와 실시간 피드가 하나의 포맷을 공유하는 데이터를 골라, 백테스트한 그 코드를 그대로 거래하라.

한 시간에 한 번 샘플링한 마지막 체결가로는 당신의 주문이 실제로 체결됐을지 알 수 없습니다. 실제로 거래됐을 바로 그 오더북을 상대로 Polymarket을 백테스트하는 방법을 소개합니다.

무료로 시작

궁금한 점, 답해 드립니다.

부분적으로만 가능합니다. Polymarket 공개 API는 현재 마켓, 체결 내역, 그리고 prices-history 엔드포인트를 제공하지만, 과거 오더북 스냅샷은 제공하지 않습니다. 따라서 전략이 실제로 마주했을, 호가에 걸려 있던 북을 재생할 수 없습니다. 바로 이 과거 뎁스의 공백을 서드파티 오더북 데이터가 메웁니다.