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.





