Polymarket Bot Tutorial · Глава 16 из 32
Статистический arbitrage на Polymarket: cross-market pairs (коррелированные события), спреды Polymarket-vs-Kalshi, mean reversion и как определять размер stat-arb позиций, когда рынки в итоге resolve.
Что рассматривается в этой главе
Statistical arbitrage на Polymarket использует временные mispricings между коррелированными рынками - одно и то же событие на Polymarket и Kalshi или связанные рынки внутри самого Polymarket. Эджи небольшие (обычно 1-3 цента) и операционно хрупкие. В этой главе честно разбирается, что работает, что нет, и какой риск multi-leg execution убивает большинство попыток.
Cross-market statistical arbitrage использует временные ценовые несоответствия между Polymarket и Kalshi, Polymarket и Manifold или между коррелированными рынками внутри Polymarket. Эджи небольшие (обычно 1-3 цента) и требуют быстрой execution по обеим ногам. Эта глава - честный playbook, включая операционную сложность, которая убивает большинство попыток.
- Что означает stat-arb на prediction markets
- Примеры спредов Polymarket-vs-Kalshi
- Pairs внутри Polymarket (коррелированные события)
- Mean reversion vs trend continuation
- Определение размера для resolving (а не perpetual) markets
- Риск: divergence после resolution
- Code: pairs monitor и threshold-trigger
Что означает stat-arb на prediction markets
Statistical arbitrage на prediction markets означает торговлю спредом между двумя рынками, которые должны быть оценены согласованно. На Polymarket чаще всего встречаются три варианта.
- Cross-venue: одно и то же событие на Polymarket и Kalshi (или Manifold, PredictIt). Цены должны convergе; на практике они расходятся на 2-5 центов.
- Same-event-pair: parent против суммы legs в NegRisk multi-outcome markets. Инвариант sum-to-1 позволяет арбитражить, когда сумма legs меньше 1.0.
- Correlated-event-pair: два рынка по связанным исходам (например, "Trump president on Jan 1" vs "Trump president on Mar 1"). Цены должны отличаться друг от друга не более чем на 2-3 цента.
Эджи небольшие. Операционная сложность реальна. Большинство попыток ломается не в теории, а на execution.
Примеры спредов Polymarket-vs-Kalshi
По наблюдениям в 2025-26 годах, Polymarket и Kalshi листят одни и те же крупные US events, но стабильно оценивают их на 1-4 цента по-разному. Этот разрыв существует по структурным причинам, которые нужно моделировать в любом arb.
Структурные факторы:
- Fee asymmetry: Kalshi взимает 4-7% на winning trades (зависит от market); Polymarket не берет taker fee. В arb-математике нужно учитывать комиссию Kalshi.
- Settlement risk premium: когда resolution market ambiguous, UMA одной площадки может resolve иначе, чем judges другой. Рынок учитывает это в цене.
- Trader population: аудитория Polymarket обычно моложе и более crypto-native; аудитория Kalshi более professional / hedge. Они систематически по-разному оценивают одни и те же события.
Arb работает, когда разрыв превышает structural premium плюс fees. Разрыв в 5 центов на рынке, где structural premium составляет 1c, а combined fees - 1c, это реальный edge в 3c.
Pairs внутри Polymarket (коррелированные события)
Внутри Polymarket correlated-event pairs арбитражить проще, чем cross-venue. Одинаковая fee structure, один wallet, возможна atomic execution.
Примеры, где цены регулярно расходятся:
- Trump president on date A vs Trump president on date B (где B позже A менее чем на 90 days).
- 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 примерно одинаков на каждой ноге; execution atomic, когда оба fills приходят в одном response.
Mean reversion vs trend continuation
Два stat-arb режима. Mean reversion: pair разошлась из-за noise; вы ставите на convergence. Trend continuation: pair начала расходиться, потому что пришла новая информация; вы ставите на дальнейшее divergence.
Различить их - самая сложная часть. Heuristic: если divergence произошла на видимом volume (whale прошёл по одной из legs book), это news - играть против движения только если у вас есть model. Если же разъезд был медленным и на низком volume, это noise - торгуйте reversion уверенно.
Для новых builders: торгуйте только mean reversion, на pairs, где divergence меньше 1 standard deviation от historical drift. Trend continuation требует model, которая ловит news; без нее вы торгуете против informed flow.
Sizing для resolving (а не perpetual) markets
Prediction markets resolve. Crypto pairs - нет. Это меняет математику.
Pair-arb position на Polymarket имеет фиксированный payout schedule: когда оба рынка resolve, разница между predicted spread и actual spread фиксируется. Никакого rolling, никакого бесконечного удержания.
Следствие для sizing: максимальный объем ограничен time-to-resolution, потому что capital locked до этого момента. Pair, который resolve через 6 месяцев, может принести 3c на share, но вы не сможете пустить больше capital в работу в это время, если обе рынки fully sized.
Правильная рамка: stat-arb на Polymarket - это серия bounded-time trades, а не continuous strategy. Сравнивайте PnL на единицу locked capital в день, а не gross PnL.
Риск: divergence past resolution
Худший исход stat-arb - когда ваша prediction-of-convergence оказывается неверной, потому что исходная premise была неверна. Примеры:
- Вы shorted "Trump president on Apr 1", ожидая, что это convergе к "Trump president on Mar 1" - но market на дату 1 resolve YES, а market на дату 2 resolve NO из-за мартовского impeachment. Ваша thesis "spread should be flat" была неверной.
- Вы арбитражили Polymarket против Kalshi на одном и том же NBA Finals winner. Polymarket resolve на team, которая выиграла official series; Kalshi resolve по slightly different definition, которая иначе учитывает overtime tie-breakers. Оба resolve YES по своим правилам, но в противоположных directions.
Внимательно читайте resolution criteria каждого market. Cross-venue arb - это всего один resolution-mismatch от полной потери по обеим legs.
Code: pairs monitor и threshold-trigger
Reference: monitoring двух correlated tokens, запуск arb при пересечении 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 при partial fill критически важен. Без него partial execution оставляет bot directional exposed, а это противоположно самой идее stat-arb.





