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 не заметит проблему вручную - а это всегда занимает дольше, чем кажется.

Часто задаваемые вопросы

Может ли retail bot действительно зарабатывать на market making на Polymarket?
Иногда, в отдельных markets. Maker rebate (20-25% от taker fees) плюс spread 1-3 cents за round trip могут в сумме давать реальный return. Но на Polymarket news flow может сдвинуть market на 20+ cents за секунды - market maker без быстрого news feed получает adverse selection. Лучше всего это работает на liquid sports markets до игры и в периоды с низким news flow.
Насколько wide нужно котировать на Polymarket?
Минимально - настолько, чтобы покрыть худший ожидаемый adverse selection. Для liquid sports/politics: 1-3 cents с каждой стороны от mid. Для thin markets: 5+ cents. Если вы не можете котировать достаточно tight, чтобы конкурировать с другими maker, и одновременно достаточно wide, чтобы переживать движения, market для вас не market-makeable.
Какие inventory limits мне поставить?
Жесткий cap по inventory на один market - 50-200 USD, пока вы не доказали profitability на протяжении нескольких месяцев. Skew quotes так, чтобы inventory стремился к нейтральному уровню - если вы накопили Yes, опускайте свой Yes bid и опускайте No ask, чтобы стимулировать обратные No buys. Никогда не позволяйте одному market занимать более 20% bankroll.
Нужен ли быстрый VPS для market making на Polymarket?
Да. Market making - самая чувствительная к latency стратегия на Polymarket. Дергающийся VPS приводит к stale quotes, которые легко забирают. Мы используем TradingVPS для наших MM bots именно потому, что jitter там стабильно низкий. Commodity cloud (DO/Vultr) подойдет для paper trading MM, но не для live.
Чем Polymarket MM отличается от crypto MM?
Два главных отличия: (1) у Polymarket есть жесткие outcome events (news, sports finales), которые могут сдвинуть цену на 30-100 cents мгновенно - намного резче, чем в crypto. (2) Markets Polymarket в итоге разрешаются, поэтому, в отличие от crypto pairs, позиции MM имеют жесткий expiration. Оба фактора подталкивают к более коротким hold и более жестким risk limits.
Могу ли я делать market making на 5-minute crypto markets на Polymarket?
Возможно, но очень сложно. 5-minute markets видят около 288 expirations в день на pair, доминируются более быстрыми bots и имеют более tight spreads. Большинство retail MM bots там теряют деньги из-за adverse selection. Правильно разбираем 5-minute crypto strategy в главе 23 этой серии.