Polymarket Bot Tutorial · Chapter 16 of 32
Статистичний arbitrage на Polymarket: cross-market pairs (correlated events), спреди Polymarket-vs-Kalshi, mean reversion і як визначати розмір stat-arb позицій, коли markets зрештою resolve.
Що охоплює ця глава
Статистичний arbitrage на Polymarket використовує тимчасові mispricings між correlated markets - одна й та сама подія на Polymarket vs Kalshi або пов’язані markets всередині самого Polymarket. Переваги невеликі (зазвичай 1-3 центи) і операційно крихкі. Ця глава чесно пояснює, що працює, що ні, і ризик multi-leg execution, який вбиває більшість спроб.
Cross-market statistical arbitrage використовує тимчасові pricing inconsistencies між Polymarket і Kalshi, Polymarket і Manifold або між correlated markets усередині Polymarket. Переваги невеликі (зазвичай 1-3 центи) і вимагають швидкого execution на обох legs. Ця глава - чесний playbook, включно з operational complexity, яка вбиває більшість спроб.
- Що означає stat-arb на prediction markets
- Приклади spread між Polymarket і Kalshi
- Pairs всередині Polymarket (correlated events)
- Mean reversion vs trend continuation
- Sizing для markets, що resolve, а не безстрокових
- Risk: divergence після resolution
- Code: pairs monitor і threshold-trigger
Що означає stat-arb на prediction markets
Statistical arbitrage на prediction markets означає торгівлю spread між двома markets, які мають бути оцінені узгоджено. На Polymarket найчастіше трапляються три варіанти.
- Cross-venue: одна й та сама подія на Polymarket і Kalshi (або Manifold, PredictIt). Pricing має зближуватися; на практиці він коливається на 2-5 центів.
- Same-event-pair: parent проти суми legs у NegRisk multi-outcome markets. Інваріант sum-to-1 дає змогу arbi, коли сума legs менша за 1.0.
- Correlated-event-pair: два markets про пов’язані outcomes (наприклад, "Trump president on Jan 1" vs "Trump president on Mar 1"). Вони мають оцінюватися з різницею не більше 2-3 центів.
Переваги невеликі. Operational complexity реальна. Більшість спроб гинуть на execution, а не в теорії.
Приклади spread між Polymarket і Kalshi
За спостереженнями у 2025-26 роках, Polymarket і Kalshi лістять ті самі ключові US events, але стабільно ціноутворюють їх із різницею 1-4 центи. Ця прогалина існує з structural reasons, які потрібно моделювати в будь-якому arb.
Structural drivers:
- Fee asymmetry: Kalshi бере 4-7% з виграшних trades (залежно від market); Polymarket бере 0 taker fee. У math для arb потрібно врахувати bite з боку Kalshi.
- Settlement risk premium: коли resolution market є неоднозначним, UMA на одній venue може resolve інакше, ніж judges на іншій. Market закладає це в price.
- Trader population: Polymarket тяжіє до молодшої й більш crypto-native аудиторії; Kalshi - до професійної / hedge. Вони систематично не погоджуються щодо одних і тих самих events.
Arb працює, коли gap перевищує structural premium плюс fees. 5-центний gap у market, де structural premium становить 1c, а сукупні fees - 1c, дає 3c реальної переваги.
Pairs всередині Polymarket (correlated events)
Усередині Polymarket correlated-event pairs легше arbi, ніж cross-venue. Та сама fee structure, той самий wallet, feasible atomic execution.
Приклади, які стабільно оцінюються неузгоджено:
- Trump president on date A vs Trump president on date B (де B пізніше за A менш ніж на 90 днів).
- Will Bitcoin hit $100k by July 31 vs $100k by August 31.
- Yes vs No legs на тому самому binary market (сума має = 1.0; інколи в thin books вона дрейфує аж до 1.04).
Arb для Yes+No=1 - найчистіший: зчитуйте обидва legs із одного market, запускайте FOK на обох, якщо сума падає нижче 0.97 (з урахуванням spread tax). Потрібний capital приблизно однаковий на кожному leg; execution є atomic, коли обидва fills повертаються в одному response.
Mean reversion vs trend continuation
Є два stat-arb regimes. Mean reversion: pair розійшовся через шумову причину; ви ставите на convergence. Trend continuation: pair почав розходитись, бо з’явилася нова інформація; ви ставите на подальший divergence.
Найскладніше - відрізнити одне від іншого. Heuristic: якщо divergence стався на видимому volume (whale пройшов по книзі одного leg), це news - fade лише якщо у вас є model. Якщо він повільно дрейфував на низькому volume, це шум - торгуйте reversion упевнено.
Для нових builders: торгуйте лише mean reversion і лише на pairs, де divergence менший за 1 standard deviation історичного drift. Trend continuation потребує model, яка ловить news; без неї ви торгуєте проти informed flow.
Sizing для markets, що resolve, а не безстрокових
Prediction markets resolve. Crypto pairs - ні. Це змінює math.
Pair-arb position на Polymarket має фіксований payout schedule: коли обидва markets resolve, різниця між predicted spread і actual spread стає зафіксованою. Немає rolling, немає нескінченного утримання.
Наслідок для sizing: максимальний обсяг, який ви можете тримати, обмежений time-to-resolution, бо capital заблокований до цього моменту. Pair, що resolve через 6 місяців, може принести вам 3c на share, але ви не зможете пустити більше capital в роботу тим часом, якщо обидва markets повністю sized.
Правильна рамка: stat-arb на Polymarket - це серія bounded-time trades, а не безперервна strategy. Порівнюйте PnL на одиницю locked capital на день, а не gross PnL.
Risk: divergence після resolution
Найгірший результат stat-arb - коли ваша prediction-of-convergence prediction помилкова, бо вихідна передумова була хибною. Приклади:
- Ви shorted "Trump president on Apr 1", очікуючи, що це converge до "Trump president on Mar 1" - але market за date 1 resolve YES, а за date 2 resolve NO через березневий impeachment. Ваша теза "spread має бути пласким" була хибною.
- Ви arbed Polymarket vs Kalshi на того самого переможця NBA Finals. Polymarket resolve до команди, яка виграла офіційну серію; Kalshi resolve за трохи іншим визначенням, яке інакше враховує overtime tie-breakers. Обидва resolve YES за власними умовами, але в протилежних напрямах.
Уважно читайте resolution criteria кожного market. Cross-venue arb - це лише один resolution-mismatch від повної втрати на обох legs.
Code: pairs monitor and threshold-trigger
Reference: monitor two correlated tokens, fire arb when spread crosses threshold.
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)
Cleanup-on-partial-fill критично важливий. Без нього partial execution залишає bot directionally exposed, що є повною протилежністю суті stat-arb.





