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.











