Polymarket Bot Tutorial · Rozdział 17 z 32

Wykorzystaj imbalance order book Polymarket jako krótkoterminowy sygnał cenowy: stosunek wolumenu bid-ask, obliczanie microprice, signal half-life oraz to, kiedy imbalance bots biją random execution.

Co obejmuje ten rozdział

Order-book imbalance to stosunek depth po stronie kupna do depth po stronie sprzedaży w limit order book. Na Polymarket ma on realną, ale krótkotrwałą przewagę prognostyczną — zwykle 5-30 sekund, zanim mid się przesunie. Ten rozdział dotyczy wzorca obliczeń oraz warunków, w których sygnał bywa mylący.

To rozdział 17 z naszej 32-częściowej serii o budowie Polymarket trading bot. Szczegółowo omawiamy temat w sekcjach poniżej. Treść główna dla każdej sekcji jest pisana i publikowana rozdział po rozdziale; odpowiedzi FAQ i reference są już kompletne i odzwierciedlają production experience z uruchamiania naszego własnego trader.

  • Czym jest order book imbalance
  • Obliczanie microprice
  • Imbalance jako sygnał kierunkowy
  • Signal half-life na Polymarket
  • Kiedy imbalance signals kłamią
  • Code: obliczanie imbalance przy każdym WS tick

Czym jest order book imbalance

Order book imbalance to stosunek całkowitej depth po stronie kupna do całkowitej depth po stronie sprzedaży w limit order book. Obliczany na top-N levels (zwykle N=5) uchwytuje skumulowaną presję traderów, której mid-price jeszcze nie odzwierciedlił.

Formula: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). Zakres -1 do +1; wartość dodatnia oznacza większą presję kupna, ujemna — większą presję sprzedaży.

Sygnał jest empirycznie realny na Polymarket, ale noisy. Pojedynczy whale może stworzyć fałszywy imbalance na 30-60 sekund, zanim zostanie zniwelowany przez arbs. Użyteczny jako jeden z kilku feature, niebezpieczny jako jedyny trigger.

Obliczanie microprice

Microprice to dopracowanie prostego mid: weighted average best bid i best ask, ważona ich odpowiednimi size.

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

Gdy queue po stronie bid jest znacznie większa niż po stronie ask, microprice przesuwa się bliżej ask. Intuicja: więcej czekających buyerów oznacza, że następna transakcja z większym prawdopodobieństwem podniesie ask, więc fair value jest bliżej ask.

Microprice to wskaźnik wyprzedzający rzeczywisty mid o 5-30 sekund. Production bots używają go jako reference price do decyzji take-profit zamiast naiwnego mid.

Imbalance jako sygnał kierunkowy

Z obserwacji production: gdy imbalance zmienia się z -0.3 na +0.5 w ciągu 10 sekund bez towarzyszącego wydarzenia news, mid rośnie o 1-2 centy w kolejnych 30-60 sekundach w około 65% przypadków.

To realna przewaga, ale zanika przy małych position sizes po uwzględnieniu fees. Aby ją monetyzować, bot musi skalować pozycję na tyle, by złapać ruch minus fees, ale na tyle mało, by nie poruszyć samemu book. Order books Polymarket są zwykle na tyle thin, że wszystko powyżej 50 shares porusza market.

Łącz imbalance z innymi feature: trade velocity (więcej trades = real signal), best-bid faktycznie idzie w górę (a nie tylko przesuwa się depth), market nie działa w news-driven mode.

Signal half-life na Polymarket

Sygnał imbalance zanika. Dane production z naszego trader: imbalance > 0.6 → oczekiwany ruch mid o 1.2c w ciągu 60s, half-life około ~30s. Po 90 sekundach wartość predykcyjna spada do zera.

Implikacja dla bot design: reaguj szybko albo pomiń sygnał. Bot, który potrzebuje 15 sekund na decyzję, zużywa połowę edge, zanim złoży order. Budget latencji dla strategii opartych na imbalance powinien wynosić mniej niż 5 sekund od sygnału do odpalonego FOK.

Strategie utrzymujące pozycje dłużej niż half-life (1-2 minuty) grają na kolejny sygnał, a nie na bieżący. Bądź w tym precyzyjny; nie trzymaj przypadkiem pozycji opartej na imbalance aż do resolution.

Kiedy imbalance signals kłamią

Sygnał bywa mylący, gdy zachodzi jeden z trzech warunków.

  • News-driven move: imbalance jest konsekwencją news, których jeszcze nie widziałeś. Trading przeciwko temu przegrywa; trading zgodny z ruchem to news arbitrage, czyli inna strategia.
  • Whale spoofing: duży order złożony i szybko anulowany tworzy fałszywy imbalance na czas jego obecności. Filtruj to, sprawdzając, czy imbalance utrzymuje się przez 10+ sekund przed uruchomieniem.
  • End-of-period rebalancing: market makers wycofują quotes z powodów inventory, a nie informacji. Imbalance odwraca się kilka minut później, gdy MM ponownie wystawia quotes.

Połączony filtr brzmi: imbalance > threshold AND trade velocity > baseline AND brak wydarzenia news w ostatnich 5 minutach. Każdy filtr osobno daje zbyt wiele false positives.

Code: obliczanie imbalance przy każdym WS tick

Reference: subscribe do WebSocket book updates, przeliczaj imbalance przy każdym 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 jest per-token. Cooldown zapobiega zbyt częstemu odpalaniu na ten sam sygnał. Filtry (sprawdzenie news, trade velocity) bramkują właściwy trade.

Często zadawane pytania

Czym jest order book imbalance?
To stosunek volume po stronie bid do volume po stronie ask na szczycie book. Silnie przechylony book po stronie bid (więcej buyerów niż sellerów blisko touch) sugeruje krótkoterminową presję wzrostową ceny. Sygnał jest dobrze znany w crypto i equities; na Polymarket działa w marketach płynnych, ale znika w thin marketach.
Jak obliczyć microprice?
microprice = (best_ask * bid_size + best_bid * ask_size) / (bid_size + ask_size). To wersja mid-price ważona wolumenem, która przechyla się w stronę mniej obsadzonej strony — tej, która pierwsza się "wyczerpuje". Bots używają jej jako estimate fair value uwzględniającego imbalance.
Jaki jest half-life sygnału imbalance na Polymarket?
Na aktywnych marketach 5-30 sekund. Na thin marketach dłużej (bo nowe orders potrzebują więcej czasu, aby zdominować imbalance). Jeśli Twój bot reaguje w mniej niż sekundę, możesz część tego uchwycić. Jeśli reaguje po 5+ sekundach, zwykle jest już za późno.
Kiedy imbalance kłamie?
Gdy po jednej stronie siedzi pojedynczy duży order czekający na wypełnienie (jeden duży resting bid, brak innej aktywności). Imbalance jest wtedy realny, ale nie przewiduje ceny — pokazuje tylko jednego zdecydowanego buyer. Filtruj po liczbie orders, nie tylko po volume: imbalance N orders do 1 order jest bardziej informatywny niż 5x volume rozłożone na 1 order każdy.
Czy order book imbalance wystarczy, by handlować samodzielnie?
Zwykle nie. Jako standalone signal jest słaby i jest arbitrażowany. Połącz go z innym sygnałem (np. macroprice mean reversion, news flag lub sports state), aby uzyskać trwalszą przewagę. Sam imbalance zwykle wypada gorzej niż random execution po fees.
Jaka biblioteka Python potrafi obliczać imbalance z Polymarket WS?
Nie znamy gotowej biblioteki off-the-shelf — to kilka dziesiątek linii code. Subskrybuj przez py-clob-client market book, przy każdym event price_change przelicz top-of-book bid/ask size i emituj swój imbalance metric. Cache'uj ostatnią wartość i odpalaj ponownie tylko przy istotnych zmianach.