2026년 8월 31일 · 예측 시장

예측 시장 백테스트에서 무엇이 깨지는가: 8일간의 기록

예측 시장 백테스트에서 무엇이 깨지는가: 8일간의 기록

예측 시장은 세상에서 백테스트하기 가장 쉬운 것처럼 보입니다. 가격은 [0, 1] 범위에 있습니다. 손익은 1달러 또는 0입니다. 레버리지, 펀딩, 베이시스도 없고, 00:00 UTC에 만기가 돌아오는 무기한 스왑 특유의 골칫거리도 없습니다. 수수료, 펀딩, 임팩트를 반영해 이미 암호화폐 무기한 선물을 처리하던 백테스터가 있었고, 이틀 동안 손봐서 전략 생성에 들어가는 게 계획이었습니다.

실제로는 8일이 걸렸습니다. 대략 시간순으로 적은 기록입니다. 주식 곡선이 놀라울 만큼 아름다워 보였던 날과 그 뒤에 밝혀진 이유도 포함했습니다.

1일 차: 간단해야 했던 어댑터

처음에는 일대일로 대응시키면 될 것 같았고 깔끔해 보였습니다. 시장은 상품입니다. YES 가격이 곧 가격입니다. YES를 사면 롱, NO를 사면 숏입니다. 결제는 1.00 또는 0.00에 강제 청산하는 것과 같습니다. 시간별 가격 시계열을 같은 이벤트 루프에 넣으면 끝입니다.

이 대응 관계는 실제 데이터에 약 90분만 노출돼도 무너집니다. 가장 먼저 문제가 된 건 수익률 시계열이었습니다. 포지션 규모 산정, 변동성 타기팅, Sharpe 보고 등 리스크 계층 전체가 연속적으로 거래되는 상품의 로그 수익률을 가정하고 있었습니다. 0.04에서 0.00으로 가는 시장의 로그 수익률은 정의되지 않지만, 손실은 명확히 전액입니다. 또 결제 3일 전 가격이 0.04인 시장과 결제 4분 전 가격이 0.04인 시장은 완전히 다른 대상인데도, 두 행 모두 0.04.

결국 전체 시계열을 벽시계 시간이 아니라 결제까지 남은 시간 기준으로 재매개변수화하고, PnL을 시가평가가 아닌 만기 손익으로 처리했습니다. 올바른 선택이었지만, 그 변경으로 뒤에 연결된 보고 코드가 전부 무효가 됐습니다.

2일 차: 수수료 공식이 곧 전략이다

Kalshi의 거래 수수료는 베이시스포인트만큼 깎는 방식이 아닙니다. 가격에 대해 2차 함수로 증가합니다. 대략 0.07 × contracts × P × (1−P)이며, 주문 단위로 센트 올림 처리됩니다. 즉 동전 던지기 같은 시장이 가장 흥미로운 가격대에서 수수료가 가장 높고, 양 끝 가격대로 갈수록 거의 무료입니다.

가격계약당 수수료필요한 엣지 (확률 포인트)투입액 대비 수수료
5¢0.33¢0.336.7%
10¢0.63¢0.636.3%
25¢1.31¢1.315.3%
50¢1.75¢1.753.5%
75¢1.31¢1.311.8%
90¢0.63¢0.630.7%
95¢0.33¢0.330.35%

세 번째 열이 핵심입니다. 50¢에 사서 결제까지 보유해 손익분기점을 넘으려면, 우리의 확률 추정치가 시장보다 1.75포인트 높아야 합니다. 상대적인 1.75%가 아닙니다. 절대 차이입니다. 결제 전에 청산한다면 그 수수료를 두 번 내고 스프레드도 부담합니다.

3.5%50¢에서 편도 수수료, 투입액 대비 비율
1.75pp해당 가격에서 손익분기에 필요한 확률 엣지
1상품당 평생 결제 횟수

Polymarket의 CLOB는 역사적으로 수수료 구조가 상당히 달랐습니다. 거래 자체의 수수료는 거의 없는 편이고, 비용 대부분은 스프레드와 호가 깊이에서 발생합니다. 따라서 거래소에 따라 같은 전략 로직의 경제성이 완전히 달라집니다. 하나의 수수료 모델을 쓰는 거래소 간 비교는 허구입니다. 이제 단일 숫자가 아니라 거래소별 수수료 함수를 적용합니다.

예측 시장 백테스트 보고서에서 한 줄만 읽는다면, 확률 포인트로 표시된 수수료 항목을 읽으세요. 50¢ 시장에서 예측 엣지가 1.2포인트라고 주장하는 전략은 다른 비용을 하나도 반영하기 전부터 Kalshi에서 손실 전략입니다. 독자가 직접 계산하게 두지 말고 보고서 첫 페이지에 이 사실을 보여줘야 합니다.

3일 차: 호가창은 계단식이고 짧다

우리의 임팩트 모델은 BTC 무기한 선물 호가창에 맞춰 보정한 제곱근 함수였습니다. 여기서는 형태부터 틀렸습니다. 1달러 상품에 1¢ 틱을 적용하면 전체 호가창에서 가능한 가격 단계는 99개뿐입니다. 중간 정도 유동성이 있는 시장은 최우선 호가에 계약이 수백 개쯤 걸려 있다가 그 다음 가격 단계까지 빈 구간이 생길 수 있습니다.

결제 약 30시간 전, 우리가 샘플링한 경제 지표 시장의 YES 측 호가창 스냅샷입니다:

호가 단계수량 (계약)매수 누적 비용
42¢310310개, 평균 42.0¢
43¢85395개, 평균 42.2¢
45¢140535개, 평균 42.9¢
49¢6001,135개, 평균 46.1¢

1,000계약 주문은 위험액이 500달러입니다. 암호화폐 시장에서는 반올림 오차 수준이지만, 체결 평균 가격을 4센트 움직입니다. 4센트는 수수료의 두 배가 넘습니다. 여기에 맞는 매끄러운 함수는 없습니다. 호가창을 단계별로 따라가야 합니다. 그러지 않으면 숫자를 지어내는 셈입니다. 이 자산군에서는 sqrt 모델을 없애고 호가창을 그대로 순회하는 코드를 작성했습니다. 느리지만 정확합니다.

문득 이런 시장이 "너무 작아서 중요하지 않다"고 짜증 내는 제 모습을 발견했습니다. 시장이 작은 건 가격을 매기는 대상이 마감 시한이 있는 현실의 단일 질문이고, 수요일 미국 신규 실업수당 청구 건수에 의견을 가진 사람이 한정돼 있기 때문입니다. 규모 자체가 곧 시장입니다. 포커 테이블에 9명밖에 앉지 못한다고 불평하는 것과 같습니다.

4일 차: 주식 곡선이 아름다웠던 날

1,400개 시장에서 Sharpe 4.1. 매끄러운 곡선. 이걸 보면 모든 연구자의 가슴이 철렁해야 합니다. 저도 그랬습니다. 결국에는요. 이미 스크린샷을 찍고 약 40분이 지난 뒤였습니다.

버그는 리샘플러에 있었습니다. 유동성이 낮은 시장의 가격 이력은 불규칙한 타임스탬프로 돌아오므로, 일정한 시간별 그리드에 다시 색인했습니다. 보관된 모든 시계열의 마지막 값은 결제 가격인 1.00 또는 0.00입니다. 그런데 재색인에서 방향 제한 없이 최근접 이웃으로 값을 채웠습니다. 그래서 마지막 거래가 결제보다 몇 시간 앞서 끝난 시장에서는 결제 가격이 그 공백을 가로질러 과거로 전파됐습니다. 모델은 유동성이 낮아서 깊이 한도에 걸리지 않고 포지션을 키울 수 있는 바로 그 시장에서, 오늘 행에 내일의 답을 읽고 있었습니다.

연속형 상품에서는 최근접 이웃 채우기가 괜찮습니다. 마지막 관측값이 정답인 상품에서는 룩어헤드 머신이 됩니다. 이제 모든 채우기가 미래 방향으로만 진행되는지, 결제 행에 태그를 붙여 피처 계산에서 제외했는지 어서션으로 확인합니다. 이 어서션은 9줄이고, 이번 주에 작성한 코드 중 가장 가치가 큽니다.

5~6일 차: 시장 1,412개, 실제 베팅은 약 180번

예측 시장의 표본 크기는 친근한 얼굴을 한 함정입니다. 시장 1,412개가 결제되면 관측치가 1,412개라고 생각하고 그에 맞춰 t 통계량을 계산하게 됩니다. 하지만 같은 일요일에 열리는 NFL 경기 14개는 기상 상황, 부상 보고서 공개, 공통 베팅 자금 흐름을 공유합니다. 주 단위 선거 시장 51개는 전국적인 지지율 변화 하나를 공유합니다. "3월 31일까지 X가 일어날까"와 "6월 30일까지 X가 일어날까"는 만기만 다를 뿐 같은 베팅이고 함께 결제됩니다.

우리는 기저 이벤트 출처와 결제일에 따라 시장을 클러스터링했고, 실질적으로 독립적인 표본 수는 약 180개로 나왔습니다. 우리가 살펴본 효과 크기에서는 실제 엣지와 잡음을 구별하기에 부족합니다. 시장별 부트스트랩을 아무리 해도 해결되지 않습니다. 행이 아니라 클러스터를 재표본 추출해야 하기 때문입니다. 이 점을 잘못 처리하면 유의성이 조용히 2~3배 부풀려집니다.

7일 차: 결제 시점도 확률 분포다

전혀 모델링하지 않았던 요소를 뼈아픈 시행착오로 알게 됐습니다:

시뮬레이터에 보유 비용 항목과 결제일 변동 요소를 추가했습니다. 둘 다 정확하지는 않습니다. 그래도 결제가 명시된 날짜에 확실히 일어난다고 암묵적으로 가정하는 것보다는 낫습니다.

8일 차: 건너뛸 것과 먼저 할 것

  1. 수익률 기반 뼈대는 통째로 건너뛰세요. 만기 손익이 있는 상품에 변동성 타기팅 리스크 계층을 맞추려 하지 마세요. 확률과 투입액을 기준으로 말하는 베팅 규모 계층을 작성하세요. 기존 계층을 맞추려다 이틀을 낭비했습니다.
  2. 전략보다 수수료 함수를 먼저 만드세요. 거래할 거래소마다 손익분기 엣지 곡선을 출력해 데스크 위에 붙여두세요. 백테스트를 돌리는 비용을 치르기도 전에 아이디어 절반가량을 걸러냅니다.
  3. 첫날부터 호가창을 따라가세요. 연속형 시장에서 가져온 모수형 임팩트 모델은 당신에게 유리한 방향으로 틀릴 겁니다.
  4. 세기 전에 클러스터링하세요. 마음에 드는 Sharpe를 얻은 뒤가 아니라, 투자 대상을 정할 때 유효 표본 크기에 쓸 클러스터링 기준도 함께 결정하세요.
  5. 채우기 방향을 어서션으로 확인하세요. 조인마다 한 줄씩 넣으세요. 시계열이 정답값으로 끝난다면, 백필은 리뷰 중에 발견해야 할 문제가 아니라 구조적으로 버그라고 취급하세요.

8일은 들일 가치가 있었습니다. 예측 시장은 암호화폐 백테스트에서 스스로를 속이기 쉽게 만드는 모호함을 걷어내기 때문입니다. 얼버무릴 펀딩비도 없고, 논쟁할 마크 가격 규칙도 없습니다. 질문과 마감 시한, 그리고 답만 있습니다. 여기서 백테스트가 틀리면 어디가 틀렸는지 짚어낼 수 있습니다.

예측 시장백테스팅수수료시장 미시구조데이터 엔지니어링
← 전체 글