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) разрешают фактическую торговлю.

Часто задаваемые вопросы

Что такое order book imbalance?
Это отношение объёма bid к объёму ask в верхней части book. Сильно перекошенный в сторону bid book (больше покупателей, чем продавцов 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, которая склоняется к стороне с меньшим объёмом - стороне, которая первой "выдыхается". Bots используют её как estimate fair value с учётом imbalance.
Каков half-life сигнала imbalance на Polymarket?
На active markets - 5-30 секунд. На thin markets - дольше (потому что новым order требуется больше времени, чтобы перекрыть imbalance). Если ваш bot реагирует менее чем за секунду, вы можете захватить часть edge. Если реакция занимает 5+ секунд, вы обычно уже опоздали.
Когда imbalance ошибается?
Когда с одной стороны стоит один крупный order в ожидании исполнения (один большой resting bid, без другой активности). Imbalance реален, но он не прогнозирует цену - он лишь показывает одного мотивированного buyer. Фильтруйте, считая orders, а не только volume: imbalance N orders к 1 order информативнее, чем 5x volume, распределённый по одному order каждый.
Достаточен ли order book imbalance, чтобы торговать только по нему?
Обычно нет. Как standalone signal он слабый и поддаётся арбитражу. Комбинируйте его с другим signal (например, macroprice mean reversion, news flag или sports state) для более устойчивого edge. Один лишь imbalance обычно проигрывает random execution после fees.
Какая Python library может вычислять imbalance из Polymarket WS?
Насколько нам известно, готовой library нет - это несколько десятков строк code. Подпишитесь через py-clob-client на market book, при каждом event price_change пересчитывайте top-of-book bid/ask sizes и выводите свой imbalance metric. Кэшируйте последнее значение и запускайте повторно только при значимых изменениях.