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 не помітить це вручну - а це завжди займає більше часу, ніж здається.





