Polymarket Bot Tutorial · Глава 13 из 32
Market making на Polymarket: как котировать bid и ask, забирать spread, получать maker rebates (20-25% от taker fees), математика inventory risk и когда MM работает на prediction markets.
Что охватывает эта глава
Market making на Polymarket означает непрерывно котировать обе стороны market book и зарабатывать spread на каждом round trip. Эта стратегия хорошо известна в traditional finance; особенности Polymarket - программа maker-rebate и профиль adverse selection на prediction markets, который выше, чем на CFD venues. В этой главе - честная математика.
- Market making простыми словами
- Преимущество spread + rebate
- Inventory risk и skew
- Когда MM работает на Polymarket (а когда нет)
- Code skeleton: котируем обе стороны по +/- N cents
- Как корректировать quotes на news flow
- Когда нужно останавливать bot при всплеске adverse selection
Market making простыми словами
Market maker постоянно котирует и цену покупки (bid), и цену продажи (ask), шире mid на фиксированный spread. Когда кто-то бьет bid, maker покупает дешево; когда кто-то поднимает ask, maker продает дорого; разница между bid и ask - это revenue maker за один round trip.
Эта стратегия driven by order flow, а не directionally. Maker не делает ставки на то, выиграет ли YES; он исходит из того, что flow будет продолжаться, а spread - оплачиваться.
Риск - adverse selection: у тех, кто бьет ваш bid, может быть информация, которой нет у вас. Со временем прибыль MM зависит от того, достаточно ли wide spread, чтобы покрывать slippage от informed traders.
Преимущество spread + rebate
У Polymarket maker есть два источника дохода.
Spread capture: котируете bid 0.45 и ask 0.47 вокруг mid 0.46. Каждое исполнение по bid, которое вы позже сможете закрыть по ask, приносит 2 cents. Net edge зависит от imbalance fills и price drift.
Maker rebate: программа liquidity-rewards Polymarket платит rebate за share на maker fills в eligible markets. Значения меняются; проверяйте официальную страницу rewards для актуальных цифр. Rebate выплачивается в pUSD периодически, отдельно от самой сделки.
Для большинства markets spread capture - более крупный источник дохода. Rebate становится значимым, когда можно котировать wide markets (election year, major sports playoffs), где Polymarket повышает rebates, чтобы привлечь liquidity.
Inventory risk и skew
MM, которого постоянно бьют по bid, накапливает long position. Риск в том, что mid упадет, пока inventory остается long; maker фиксирует убыток по позиции даже после дохода от spread.
Защита: quote skew (опускать bid ниже, когда inventory long, и поднимать ask выше, когда short, чтобы отбивать односторонние fills); inventory cap (перестать котировать на стороне, где вы уже слишком long); active rebalancing (иногда пересекать spread, чтобы уменьшить позицию, когда inventory достиг лимита).
Математика: если 60% fills по bid никогда не выходят до того, как цена смещается против вас на 2 cents, стратегия уже убыточна только на этих fills. Skew нужно усиливать, когда fill imbalance превышает 65/35.
Когда MM работает на Polymarket (а когда нет)
MM работает на Polymarket, когда выполняются три условия.
- Liquid book: достаточно quote competition, чтобы ваш spread был конкурентным, но не нулевым. Markets на выборах 2024 года, крупные NFL/NBA games, BTC up/down 5m - все подходят.
- Two-sided flow: активны и buyers, и sellers. Односторонние markets (resolved-ish на 0.95+) не дают maker ничего, что можно забрать.
- Bounded price moves: spread captures съедаются 5-cent jumps. Наиболее дружелюбны stable mid-range markets (0.40-0.60).
MM не работает в: news-driven markets, где mid двигается быстрее, чем вы успеваете re-quote; illiquid books, где вы - единственный quote, и следующая сделка проходит по 5 уровням; markets, близкие к resolution, где одна сторона сходится к 0 или 1.
Code skeleton: котируем обе стороны по +/- N cents
Pseudocode для самого простого viable maker.
SPREAD_CENTS = 2
INVENTORY_CAP_SHARES = 50
def make_loop(token_id):
while True:
book = fetch_book(token_id)
mid = (book.best_bid + book.best_ask) / 2
inv = chain_balance(token_id)
# Skew: pull the side we are too long on
bid_px = mid - SPREAD_CENTS/200 - (0.005 if inv > INVENTORY_CAP_SHARES * 0.6 else 0)
ask_px = mid + SPREAD_CENTS/200 + (0.005 if inv < -INVENTORY_CAP_SHARES * 0.6 else 0)
cancel_my_existing_quotes(token_id)
if inv < INVENTORY_CAP_SHARES:
place_gtc(token_id, side="BUY", price=bid_px, size=5)
if inv > -INVENTORY_CAP_SHARES:
place_gtc(token_id, side="SELL", price=ask_px, size=min(5, inv))
time.sleep(2)
Production makers добавляют: per-side inventory tracking, cancel-before-place ordering, jitter в re-quote interval, чтобы быть менее предсказуемыми, kill-switch при adverse selection (следующий раздел).
Корректировка quotes на news flow
Когда происходит news event, fair value меняется раньше, чем ваши quotes. MM, который не убирает quotes во время news flow, становится легкой добычей.
Сигнал: rate отмены входящих fills подскакивает выше примерно 3x baseline в течение 30 секунд, либо более широкий cross-check по event stream (Polymarket Twitter/Discord, Bloomberg headline feed). При обнаружении maker убирает все quotes на 60-120 секунд, ждет стабилизации нового mid, затем снова котирует вокруг нового центра.
Самая простая реализация отслеживает stream last-trade-price для token. Прыжок более чем на 2 standard deviations от rolling-window mean запускает паузу. Bot возвращается в работу, когда цена стабилизировалась на 30+ секунд.
Когда нужно останавливать bot при всплеске adverse selection
Жесткий выход. Если fill PnL bot за последние 50 fills резко уходит в минус, что-то не так: либо market стал news-driven и вам не следует делать market making, либо ваш spread слишком tight для текущего уровня adverse selection.
Условия остановки, которые стоит закодировать:
- 5 consecutive bid fills без ask fill, mid down > 1c с первого fill.
- Realized PnL по последним 25 round-trip fills ниже ожидаемого на -25%.
- Обнаружен WebSocket disconnect или stale book.
- Inventory достиг cap на любой стороне и держится там > 5 minutes.
Когда условие срабатывает, отменяйте все заявки, flatten inventory at market, ставьте паузу на 15+ minutes. Market maker без kill switch будет терять деньги в volatile periods, пока trader не заметит проблему вручную - а это всегда занимает дольше, чем кажется.





