Polymarket Bot Tutorial · Глава 17 из 32
Используйте дисбаланс order book Polymarket как краткосрочный ценовой сигнал: соотношение объёма bid/ask, вычисление microprice, half-life сигнала и то, когда imbalance bots обгоняют random execution.
Что покрывает эта глава
Order-book imbalance - это отношение глубины со стороны buy к глубине со стороны sell в limit order book. На Polymarket у него есть реальное, но очень краткоживущее predictive edge - обычно за 5-30 секунд до движения mid. Эта глава посвящена паттерну вычисления и условиям, при которых сигнал ошибается.
- Что такое order book imbalance
- Вычисление microprice
- Imbalance как directional signal
- Signal half-life на Polymarket
- Когда imbalance signals ошибаются
- Code: compute imbalance на каждом WS tick
Что такое order book imbalance
Order book imbalance - это отношение общей глубины со стороны buy к общей глубине со стороны sell в limit order book. Рассчитываемый по top-N levels (обычно 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, отрицательное - большее давление sell.
Эмпирически сигнал на Polymarket реален, но шумный. Один whale может создать ложный imbalance на 30-60 секунд до того, как его арбитражно уберут. Полезно как один из нескольких features, опасно как единственный trigger.
Вычисление microprice
Microprice - это уточнение простого mid: weighted average лучшего bid и лучшего ask, взвешенное по их соответствующим размерам.
microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)
Когда очередь на bid-side значительно больше, чем на ask-side, microprice располагается ближе к ask. Интуиция такая: чем больше покупателей ждёт, тем вероятнее, что следующая сделка поднимет ask, поэтому fair value ближе к ask.
Microprice - это leading indicator движения фактического mid на 5-30 секунд вперёд. Production bots используют его как reference price для решений take-profit вместо наивного mid.
Imbalance как directional signal
Из production observation: когда imbalance меняется с -0.3 до +0.5 за 10 секунд без сопутствующего news event, mid поднимается на 1-2 цента в течение следующих 30-60 секунд примерно в 65% случаев.
Это реальное преимущество, но оно исчезает на небольших позициях после fees. Чтобы монетизировать его, bot должен брать достаточный размер, чтобы покрыть движение минус fees, но при этом не сдвигать book сам. Books на Polymarket обычно достаточно тонкие, чтобы всё, что выше 50 shares, двигало рынок.
Совмещайте imbalance с другими features: trade velocity (чем больше trades, тем вероятнее реальный сигнал), фактический рост best-bid (а не просто сдвиг глубины), рынок не находится в news-driven mode.
Signal half-life на Polymarket
Сигнал imbalance затухает. Production data от нашего trader: imbalance > 0.6 → ожидаемое движение mid на 1.2c в течение 60s, half-life примерно 30s. Через 90 секунд predictive value стремится к нулю.
Следствие для bot design: реагируйте быстро или пропускайте. Bot, которому нужно 15 секунд на принятие решения, расходует половину edge ещё до выставления order. Latency budget для imbalance strategies должен быть меньше 5 секунд от сигнала до срабатывания FOK.
Стратегии, которые держат позиции дольше half-life (1-2 minutes), по сути, ставят на следующий signal, а не на текущий. Прямо формулируйте это; не держите позиции, основанные на imbalance, случайно до resolution.
Когда imbalance signals ошибаются
Сигнал вводит в заблуждение, когда выполняется одно из трёх условий.
- News-driven move: imbalance является следствием news, которое вы не увидели. Торговля против него убыточна; торговля вместе с ним - это news arbitrage, другая стратегия.
- Whale spoofing: крупный order, выставленный и быстро отменённый, создаёт ложный imbalance на это время. Фильтруйте, проверяя, что imbalance держится 10+ секунд до trigger.
- End-of-period rebalancing: market makers снимают quotes по причинам inventory, а не информации. Imbalance разворачивается через минуты, когда MM выставляет quotes заново.
Комбинированный filter выглядит так: imbalance > threshold AND trade velocity > baseline AND no news event in last 5 minutes. Каждый фильтр по отдельности даёт слишком много false positives.
Code: compute imbalance every 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, trade velocity) разрешают фактическую торговлю.





