Polymarket Bot Tutorial · Розділ 17 із 32

Використовуйте дисбаланс order book Polymarket як короткостроковий ціновий сигнал: співвідношення обсягу bid-ask, обчислення microprice, half-life сигналу та коли bots на дисбалансі обганяють випадкове виконання.

Що охоплює цей розділ

Дисбаланс order book - це співвідношення глибини buy-side до глибини sell-side в limit order book. На Polymarket він має реальну, але короткочасну прогнозну перевагу - зазвичай за 5-30 секунд до руху mid. У цьому розділі розглянуто шаблон обчислення та умови, за яких сигнал помиляється.

  • Що таке order book imbalance
  • Обчислення microprice
  • Imbalance як directional signal
  • Half-life сигналу на Polymarket
  • Коли imbalance-сигнали помиляються
  • Code: обчислення imbalance на кожному WS tick

Що таке order book imbalance

Order book imbalance - це співвідношення загальної глибини buy-side до загальної глибини sell-side в limit order book. Обчислений на top-N рівнях (зазвичай N=5), він відображає сукупний тиск trader, який mid-price ще не встиг відобразити.

Формула: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). Діапазон -1 до +1; позитивне значення означає більший buy pressure, негативне - більший sell pressure.

Емпірично на Polymarket сигнал реальний, але шумний. Один whale може створити хибний imbalance на 30-60 секунд, перш ніж його арбітражно вирівняють. Це корисно як один із кількох feature, але небезпечно як єдиний тригер.

Обчислення microprice

Microprice - це уточнення простого mid: зважене середнє best bid і best ask, зважене їхніми відповідними size.

microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)

Коли черга на bid-side набагато більша за ask-side, microprice розташовується ближче до ask. Логіка така: більше покупців, які чекають, означає, що наступна угода з більшою ймовірністю підніме ask, отже справедлива вартість ближча до ask.

Microprice - це випереджальний індикатор actual mid на 5-30 секунд. Production bots використовують його як reference price для take-profit рішень замість наївного mid.

Imbalance як directional signal

З production-спостережень: коли imbalance за 10 секунд змінюється з -0.3 до +0.5 без супровідної новини, mid зростає на 1-2 cents протягом наступних 30-60 секунд приблизно у 65% випадків.

Це справжня перевага, але вона зникає на малих position sizes після fees. Щоб монетизувати її, bot має брати достатній size, щоб захопити рух мінус fees, але не настільки великий, щоб зрушити book самостійно. Order books Polymarket зазвичай настільки тонкі, що все понад 50 shares рухає market.

Поєднуйте imbalance з іншими feature: trade velocity (більше trades = реальніший сигнал), best-bid справді рухається вгору (а не лише зміщується depth), market не перебуває в news-driven режимі.

Half-life сигналу на Polymarket

Imbalance-сигнал згасає. Production data з нашого trader: imbalance > 0.6 → очікуваний рух mid на 1.2c протягом 60s, half-life приблизно 30s. Після 90 секунд прогнозна цінність зводиться до нуля.

Наслідок для design bot: реагуйте швидко або пропускайте. Bot, якому потрібно 15 секунд на прийняття рішення, витрачає половину edge ще до розміщення order. Latency budget для imbalance strategies має бути менше 5 секунд від сигналу до спрацювання FOK.

Стратегії, що тримають position довше за half-life (1-2 хвилини), фактично грають на наступний сигнал, а не на поточний. Будьте в цьому прямими; не тримайте imbalance-driven position до settlement випадково.

Коли imbalance-сигнали помиляються

Сигнал вводить в оману, коли виконується одна з трьох умов.

  • News-driven move: imbalance є наслідком новини, яку ви ще не бачили. Торгівля проти нього програє; торгівля разом із ним - це news arbitrage, тобто інша strategy.
  • Whale spoofing: великий order, розміщений і швидко скасований, створює фальшивий imbalance на час його життя. Фільтруйте це, перевіряючи, що imbalance зберігається 10+ секунд перед тригером.
  • End-of-period rebalancing: market makers знімають котирування з причин inventory, а не information. Imbalance змінюється на протилежний через кілька хвилин, коли MM знову виставляє quotes.

Комбінований фільтр такий: imbalance > threshold AND trade velocity > baseline AND немає news event за останні 5 хвилин. Кожен фільтр окремо дає забагато false positives.

Code: обчислюйте imbalance на кожному WS tick

Reference: підпишіться на WebSocket book updates, переобчислюйте imbalance на кожному tick.

def on_book_message(msg):
    bids = msg.get("bids", [])[:5]
    asks = msg.get("asks", [])[:5]
    bid_usd = sum(float(b["price"]) * float(b["size"]) for b in bids)
    ask_usd = sum(float(a["price"]) * float(a["size"]) for a in asks)
    total = bid_usd + ask_usd
    if total < 100: return  # illiquid
    imb = (bid_usd - ask_usd) / total
    state[msg["asset_id"]] = {
        "imb": imb,
        "best_bid": float(bids[0]["price"]) if bids else 0,
        "best_ask": float(asks[0]["price"]) if asks else 1,
        "ts": time.time()
    }
    # decision logic with cooldown + filters
    if imb > 0.6 and time.time() - last_fired.get(msg["asset_id"], 0) > 60:
        check_filters_and_maybe_fire(msg["asset_id"])

State є per-token. Cooldown запобігає надмірному спрацюванню на одному й тому ж сигналі. Filters (news check, trade velocity) gate фактичну trade.

Поширені запитання

Що таке order book imbalance?
Це співвідношення bid volume до ask volume на вершині book. Сильно перекошений у bid book (більше buyers, ніж sellers near the touch) вказує на короткостроковий upward price pressure. Сигнал добре відомий у crypto та equities; на Polymarket він працює в liquid markets, але зникає в thin ones.
Як обчислити microprice?
microprice = (best_ask * bid_size + best_bid * ask_size) / (bid_size + ask_size). Це volume-weighted версія mid-price, яка схиляється до сторони з меншим volume - сторони, що першою "закінчується". Bots використовують його як estimate fair value, що враховує imbalance.
Який half-life imbalance-сигналу на Polymarket?
На активних markets - 5-30 секунд. На thin markets - довше (бо новим order потрібно більше часу, щоб перекрити imbalance). Якщо ваш bot реагує менш ніж за секунду, ви можете захопити частину edge. Якщо реакція займає 5+ секунд, зазвичай уже запізно.
Коли imbalance помиляється?
Коли з одного боку стоїть один великий order і просто чекає виконання (один великий resting bid, без іншої активності). Imbalance реальний, але він не прогнозує price - він лише показує одного motivated buyer. Фільтруйте, рахуючи orders, а не лише volume: imbalance N orders до 1 order інформативніший, ніж 5x volume, розподілений по 1 order кожен.
Чи достатньо order book imbalance, щоб торгувати лише на ньому?
Зазвичай ні. Як standalone signal він слабкий і швидко арбітражується. Поєднуйте його з іншим signal (наприклад, macroprice mean reversion, news flag або sports state) для стійкішої edge. Сам по собі imbalance після fees зазвичай поступається random execution.
Яка Python library може обчислювати imbalance з Polymarket WS?
Нам не відома готова library - це кілька десятків рядків code. Підпишіться через py-clob-client на market book, на кожному price_change event переобчислюйте top-of-book bid/ask sizes і виводьте свій imbalance metric. Кешуйте останнє значення та повторно запускайтеся лише на значущих змінах.