Polymarket Bot Tutorial · 32개 챕터 중 16장
Polymarket의 statistical arbitrage: cross-market pairs(상관된 이벤트), Polymarket-vs-Kalshi spreads, mean reversion, 그리고 market이 결국 resolve될 때 stat-arb position을 어떻게 size할지.
이 장에서 다루는 내용
Polymarket의 statistical arbitrage는 상관된 market 사이의 일시적인 mispricing을 활용합니다. 예를 들어 Polymarket과 Kalshi의 같은 event, 또는 Polymarket 내부의 관련 market들입니다. edge는 작고(보통 1-3 cents), 운영상 매우 취약합니다. 이 장에서는 무엇이 작동하고 무엇이 작동하지 않는지, 그리고 대부분의 시도를 무너뜨리는 multi-leg execution risk를 솔직하게 다룹니다.
Cross-market statistical arbitrage는 Polymarket과 Kalshi, Polymarket과 Manifold, 또는 Polymarket 내부의 상관된 market 사이의 일시적인 pricing inconsistency를 노립니다. edge는 작고(보통 1-3 cents) 양쪽 leg의 빠른 execution이 필요합니다. 이 장은 대부분의 시도를 무너뜨리는 operational complexity까지 포함한 솔직한 playbook입니다.
- prediction market에서 stat-arb가 의미하는 것
- Polymarket-vs-Kalshi spread 예시
- Polymarket 내부의 pairs(correlated events)
- Mean reversion vs trend continuation
- resolve되는(not perpetual) market의 sizing
- Risk: resolution 이후의 divergence
- Code: pairs monitor와 threshold-trigger
prediction market에서 stat-arb가 의미하는 것
prediction market에서 statistical arbitrage는 일관되게 가격이 맞아야 하는 두 market 사이의 spread를 거래하는 것을 뜻합니다. Polymarket에서는 세 가지 형태가 흔합니다.
- Cross-venue: Polymarket과 Kalshi(또는 Manifold, PredictIt)에서 같은 event. 가격은 수렴해야 하지만 실제로는 2-5 cents 정도 벌어지기도 합니다.
- Same-event-pair: NegRisk multi-outcome market에서 parent와 legs의 합. sum-to-1 invariant를 이용해 legs의 합이 1.0보다 작을 때 arb할 수 있습니다.
- Correlated-event-pair: 관련된 outcome에 대한 두 market(예: "Trump president on Jan 1" vs "Trump president on Mar 1"). 서로 2-3 cents 이내에서 가격이 맞아야 합니다.
edge는 작습니다. 운영 복잡성은 현실적입니다. 대부분의 시도는 이론이 아니라 execution에서 실패합니다.
Polymarket-vs-Kalshi spread 예시
2025-26년 관찰에 따르면, Polymarket과 Kalshi는 주요 미국 event를 같은 내용으로 상장하지만, 안정적으로 1-4 cents 정도 가격 차이가 납니다. 이 gap은 구조적인 이유 때문에 존재하며, 어떤 arb에서도 반드시 모델링해야 합니다.
구조적 요인:
- Fee asymmetry: Kalshi는 winning trades에 대해 4-7% 수수료를 받습니다(market마다 다름). Polymarket은 taker fee가 0입니다. arb 계산에는 Kalshi의 비용이 반영되어야 합니다.
- Settlement risk premium: market의 resolution이 애매할 때 한 venue의 UMA가 다른 venue의 judge와 다르게 resolve될 수 있습니다. market은 이를 가격에 반영합니다.
- Trader population: Polymarket은 더 젊고 crypto-native한 경향이 있고, Kalshi는 professional / hedge 성향이 강합니다. 같은 event에 대해 체계적으로 의견이 갈립니다.
arb는 gap이 구조적 premium과 fee를 초과할 때 작동합니다. 구조적 premium이 1c이고 합산 fee가 1c인 market에서 5-cent gap은 실제로는 3c의 edge입니다.
Polymarket 내부의 pairs(correlated events)
Polymarket 내부에서는 correlated-event pair가 cross-venue보다 arb하기 쉽습니다. fee 구조가 같고, wallet도 같고, atomic execution도 가능합니다.
일관되게 price가 어긋나는 예:
- Trump president on date A vs Trump president on date B(B가 A보다 90일 미만으로 늦음).
- Bitcoin이 7월 31일까지 100k 달러에 도달할까 vs 8월 31일까지 100k 달러에 도달할까.
- 같은 binary market의 Yes vs No leg(sum은 1.0이어야 하지만, 얇은 book에서는 1.04까지 벌어지기도 함).
Yes+No=1 arb가 가장 깔끔합니다. 같은 market에서 양쪽 leg를 읽고, 합계가 0.97 아래로 내려가면(스프레드 tax를 감안하여) 양쪽 모두 FOK로 실행합니다. 필요한 capital은 양쪽 leg에서 대체로 비슷하며, 두 fill이 같은 response로 돌아오면 execution은 atomic합니다.
Mean reversion vs trend continuation
stat-arb에는 두 가지 regime이 있습니다. Mean reversion: pair가 noise 때문에 벌어졌고, 다시 붙을 것에 betting하는 경우입니다. Trend continuation: pair가 새로운 정보 때문에 벌어지기 시작했고, 더 벌어질 것에 betting하는 경우입니다.
이 둘을 구분하는 것이 어렵습니다. 휴리스틱: divergence가 눈에 띄는 volume과 함께 발생했다면(whale이 한 leg의 book을 밀어버림), 그건 news입니다. model이 없다면 역추세(fade)하지 마세요. 천천히, 낮은 volume으로 drift했다면 noise입니다. 자신 있게 reversion을 trade하세요.
새로운 builder에게는 mean reversion만 trade하라고 권합니다. historical drift의 1 standard deviation보다 작은 divergence를 보이는 pair에서만 하세요. Trend continuation에는 news를 잡아내는 model이 필요합니다. 그게 없다면 informed flow에 반대로 betting하는 셈입니다.
resolve되는(not perpetual) market의 sizing
prediction market은 resolve됩니다. Crypto pair는 그렇지 않습니다. 이 점이 math를 바꿉니다.
Polymarket의 pair-arb position은 고정된 payout schedule을 가집니다. 두 market이 모두 resolve되면, 예측된 spread와 실제 spread의 차이가 확정됩니다. rolling도 없고, 무한 보유도 없습니다.
size에 대한 함의: capital이 resolve될 때까지 묶이므로, 보유할 수 있는 최대 규모는 time-to-resolution에 의해 제한됩니다. 6개월 뒤에 resolve되는 pair에서 share당 3c를 벌 수 있더라도, 두 market이 완전히 size되어 있으면 그 사이에 추가 capital을 더 투입할 수 없습니다.
올바른 framing은 이것입니다. Polymarket의 stat-arb는 연속적인 strategy가 아니라 bounded-time trade의 연속입니다. gross PnL이 아니라 locked capital 단위당 하루 PnL을 비교해야 합니다.
Risk: resolution 이후의 divergence
최악의 stat-arb 결과는, convergence를 예측한 당신의 예측이 underlying premise가 틀려서 실패하는 경우입니다. 예:
- 당신은 "Trump president on Apr 1"이 "Trump president on Mar 1"로 수렴할 거라 보고 short했습니다. 그런데 March impeachment 때문에 date 1 market은 YES로 resolve되고 date 2는 NO로 resolve됩니다. "spread는 flat해야 한다"는 thesis가 틀린 것입니다.
- 같은 NBA Finals winner에 대해 Polymarket과 Kalshi를 arb했습니다. Polymarket은 official series에서 이긴 팀으로 resolve되지만, Kalshi는 overtime tie-breakers를 다르게 포함하는 약간 다른 definition으로 resolve됩니다. 둘 다 stated terms에 따라 YES로 resolve되지만, 결과는 반대입니다.
각 market의 resolution criteria를 꼼꼼히 읽으세요. Cross-venue arb는 resolution mismatch 하나만 있어도 양쪽 leg에서 전부 손실이 날 수 있습니다.
Code: pairs monitor와 threshold-trigger
Reference: 두 개의 correlated token을 모니터링하고, spread가 threshold를 넘으면 arb를 실행합니다.
def pairs_monitor(token_a, token_b, threshold_cents=3, size=10):
"""Buy A and Sell B when (1 - ask_A) + bid_B > 1 + threshold."""
while True:
book_a = fetch_book(token_a)
book_b = fetch_book(token_b)
if not (book_a.best_ask and book_b.best_bid):
time.sleep(2); continue
# implied: cost of buying A at ask + value of selling B at bid
edge = (1 - book_a.best_ask) + book_b.best_bid - 1
if edge > threshold_cents / 100:
print(f"ARB edge={edge:.3f}; firing")
r_a = fok_buy(token_a, price=book_a.best_ask, size=size)
if r_a.status != "matched": continue
r_b = fok_sell(token_b, price=book_b.best_bid, size=size)
if r_b.status != "matched":
# leg A filled, B failed -- unhedged, exit A
fok_sell(token_a, price=book_a.best_bid, size=size)
time.sleep(3)
partial-fill에 대한 cleanup은 매우 중요합니다. 이것이 없으면 partial execution 때문에 bot이 방향성 노출 상태로 남게 되며, 이는 stat-arb의 본래 목적과 정반대입니다.





