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. У традиційних фінансах ця стратегія добре зрозуміла; специфічні особливості Polymarket - це програма maker-rebate та профіль adverse selection на prediction markets, який вищий, ніж на CFD venues. У цьому розділі - чесна математика.

  • Market making простою англійською
  • Перевага spread + rebate
  • Inventory risk і skew
  • Коли MM працює на Polymarket (а коли ні)
  • Code skeleton: котирувати обидві сторони на +/- N cents
  • Коригування quotes на новинному потоці
  • Зупинка bot, коли adverse selection різко зростає

Market making простою англійською

Market maker безперервно котирує і ціну купівлі (bid), і ціну продажу (ask), ширше за mid на фіксований spread. Коли хтось б'є по bid, maker купує дешево; коли хтось піднімає ask, maker продає дорого; різниця між bid і ask - це дохід maker за один round trip.

Стратегія залежить від order flow, а не від напрямку ринку. Maker не робить ставки на те, чи виграє YES; він виходить із того, що потік ордерів триватиме, а spread і далі оплачуватиметься.

Ризик - adverse selection: люди, які б'ють по вашому bid, можуть мати інформацію, якої немає у вас. З часом прибуток MM залежить від того, чи достатньо широкий spread, щоб перекрити slippage від informed traders.

Перевага spread + rebate

Для Polymarket maker є два джерела доходу.

Spread capture: котирування bid 0.45 і ask 0.47 навколо mid 0.46. Кожне виконання на bid, яке ви згодом можете закрити на ask, приносить 2 cents. Чистий результат залежить від дисбалансу fills і руху ціни.

Maker rebate: програма liquidity-rewards від Polymarket виплачує rebate за share на maker fills у відповідних markets. Значення змінюються; перевіряйте офіційну сторінку rewards для актуальних цифр. Rebate виплачується в pUSD періодично, окремо від самої угоди.

Для більшості markets найбільше заробітку дає саме spread capture. Rebate стає суттєвим, коли ви можете котирувати широкі markets (рік виборів, великі sports playoffs), де Polymarket підвищує rebate, щоб залучити 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, щоб зменшити position, коли inventory на межі).

Математика така: якщо 60% fills на bid ніколи не закриваються до того, як ціна піде проти вас на 2 cents, стратегія втрачає гроші вже на цих fills. Агресивно skew-йте, коли дисбаланс fill > 65/35.

Коли MM працює на Polymarket (а коли ні)

MM працює на Polymarket, коли виконуються три умови.

  • Liquid book: достатньо конкуренції в quotes, щоб ваш 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 cents. Найзручніші - стабільні 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 для найпростішого життєздатного 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, jitter для re-quote interval, щоб бути менш передбачуваними, kill-switch на adverse selection (наступний розділ).

Коригування quotes на новинному потоці

Коли трапляється новинна подія, fair value змінюється раніше, ніж це роблять ваші quotes. MM, який не знімає quotes під час news flow, швидко стає жертвою.

Сигнал: rate скасувань вхідних fills підскакує понад ~3x базового рівня протягом 30 секунд або ширша перевірка через event-stream (Polymarket Twitter/Discord, Bloomberg headline feed). Коли це виявлено, maker прибирає всі quotes на 60-120 секунд, дає новому mid стабілізуватися, а потім знову котирує навколо нового центру.

Найпростіша реалізація стежить за last-trade-price stream для token. Стрибок більш ніж на 2 standard deviations від rolling-window mean запускає паузу. Bot знову активується, коли ціна стабілізувалася на 30+ секунд.

Зупинка bot, коли adverse selection різко зростає

Жорсткий вихід. Якщо fill PnL bot'а за останні 50 fills різко стає негативним, щось не так: або market тепер news-driven і вам не слід бути maker, або spread встановлено занадто вузько для поточного рівня adverse selection.

Умови зупинки, які варто закодувати:

  • 5 consecutive bid fills без жодного ask fill, а mid впав на > 1c від першого fill.
  • Realized PnL на останніх 25 round-trip fills нижчий за -25% від очікуваного.
  • Виявлено WebSocket disconnect або stale book.
  • Inventory на межі cap з будь-якого боку понад 5 minutes.

Коли спрацьовує тригер, скасуйте все, закрийте inventory по market, зупиніть bot на 15+ хвилин. Market maker без kill switch втратить гроші під час волатильних періодів, доки trader не помітить це вручну - а це завжди займає більше часу, ніж здається.

Часті запитання

Чи може retail bot справді заробляти на market-making на Polymarket?
Іноді, у вибраних markets. Maker rebate (20-25% від taker fees) плюс spread 1-3 cents за один round trip можуть у сумі дати реальний дохід. Але на Polymarket news flow може зрушити market на 20+ cents за секунди - market maker без швидкого news feed отримує adverse selection. Найкраще це працює на ліквідних sports markets до матчу та в періоди з низьким news flow.
Наскільки широкий spread слід котирувати на Polymarket?
Мінімум - такий spread, який потрібен, щоб покрити найгірший очікуваний adverse selection. Для ліквідних sports/politics: 1-3 cents з кожного боку від mid. Для тонких markets: 5+ cents. Якщо ви не можете котирувати достатньо вузько, щоб конкурувати з іншими maker'ами, але й не настільки широко, щоб пережити рухи, market для вас не market-makeable.
Які ліміти inventory слід встановити?
Жорстко обмежуйте inventory на один market до 50-200 USD, доки не доведете прибутковість протягом кількох місяців. Skew-йте quotes так, щоб inventory рухався до нейтралі - якщо накопичується Yes, знижуйте Yes bid і знижуйте No ask, щоб стимулювати зворотні No buys. Ніколи не давайте одному market займати 20%+ вашого bankroll.
Чи потрібен швидкий VPS, щоб market-make Polymarket?
Так. Market making - це стратегія Polymarket, найбільш чутлива до latency. Jittery 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 finals), які можуть зрушити ціну на 30-100 cents миттєво - значно різкіше, ніж у crypto. (2) Markets Polymarket зрештою resolve, тож на відміну від crypto pairs, MM positions мають жорсткий expiration. Обидва фактори штовхають вас до коротших hold'ів і жорсткіших risk limits.
Чи можна market-make 5-minute crypto markets на Polymarket?
Можливо, але дуже складно. 5-minute markets мають приблизно 288 expirations на день на пару, домінуються швидшими bot'ами і мають вужчі spreads. Більшість retail MM bots там втрачають гроші через adverse selection. Правильно розбираємо 5-minute crypto strategy у розділі 23 цієї серії.