Polymarket Bot Tutorial · Hoofdstuk 17 van 32
Gebruik Polymarket order book imbalance als een short-term prijssignaal: bid-ask volume ratio, microprice-berekening, signal half-life en wanneer imbalance-bots random executie verslaan.
Wat dit hoofdstuk behandelt
Order-book imbalance is de ratio van buy-side depth tot sell-side depth op het limit order book. Op Polymarket heeft het een echte maar kortlevende voorspellende edge — typisch 5-30 seconden voordat de mid beweegt. Dit hoofdstuk is het berekeningspatroon en de condities waaronder het signaal liegt.
Dit is hoofdstuk 17 van onze 32-delige serie over het bouwen van een Polymarket trading bot. We behandelen het onderwerp in detail in de secties hieronder. De body content voor elke sectie wordt geschreven en hoofdstuk-per-hoofdstuk uitgerold; FAQ-antwoorden en referenties zijn al compleet en weerspiegelen production-ervaring van het draaien van onze eigen trader.
- Wat order book imbalance is
- Microprice-berekening
- Imbalance als directioneel signaal
- Signal half-life op Polymarket
- Wanneer imbalance-signalen liegen
- Code: bereken imbalance op elke WS tick
Wat order book imbalance is
Order book imbalance is de ratio van totale buy-side depth tot totale sell-side depth op het limit order book. Berekend op de top-N levels (gangbaar N=5), vangt het aggregate trader-druk die de mid-prijs nog niet heeft gereflecteerd.
Formule: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). Range -1 tot +1; positief betekent meer buy-druk, negatief meer sell-druk.
Het signaal is empirisch echt op Polymarket maar luidruchtig. Een enkele whale kan fake-print imbalance voor 30-60 seconden voordat hij wordt uitgearbed. Nuttig als één feature onder meerdere, gevaarlijk als enige trigger.
Microprice-berekening
De microprice is een verfijning van de simpele mid: een gewogen gemiddelde van best bid en best ask, gewogen op hun respectieve sizes.
microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)
Wanneer de bid-side queue veel groter is dan de ask-side, zit de microprice dichter bij de ask. De intuïtie: meer kopers wachten betekent dat de volgende trade waarschijnlijker de ask lift, dus fair value is dichter bij de ask.
Microprice is een 5-30 seconde leading indicator van de daadwerkelijke mid die beweegt. Productie-bots gebruiken het als de referentieprijs voor take-profit beslissingen in plaats van de naïeve mid.
Imbalance als directioneel signaal
Uit productie-observatie: wanneer imbalance flipt van -0,3 naar +0,5 in 10 seconden zonder begeleidend news event, beweegt de mid omhoog met 1-2 cent binnen de volgende 30-60 seconden ongeveer 65% van de tijd.
Dat is een echte edge maar hij lost op bij kleine position-sizes na fees. Om te monetiseren moet de bot genoeg dimensioneren om de move minus fees te vangen, maar klein genoeg om het book zelf niet te bewegen. Polymarkets books zijn typisch dun genoeg dat alles boven 50 shares de markt beweegt.
Combineer imbalance met andere features: trade velocity (meer trades = echt signaal), best-bid die daadwerkelijk omhoog beweegt (niet alleen depth verschuivend), markt niet in news-driven modus.
Signal half-life op Polymarket
Het imbalance-signaal vervalt. Productie-data van onze trader: imbalance > 0,6 → verwachte mid-move van 1,2c binnen 60s, half-life van ~30s. Na 90 seconden is de voorspellende waarde naar nul gegaan.
Implicatie voor bot-design: reageer snel of skip. Een bot die 15 seconden duurt om te beslissen consumeert de helft van de edge voordat de order wordt geplaatst. Latency-budget voor imbalance-strategieën zou onder 5 seconden moeten zijn van signaal tot FOK gefired.
Strategieën die posities langer dan de half-life (1-2 minuten) houden gokken op het volgende signaal, niet het huidige. Wees expliciet hierover; houd imbalance-driven posities niet per ongeluk vast tot resolution.
Wanneer imbalance-signalen liegen
Het signaal misleidt wanneer een van drie condities geldt.
- News-driven move: de imbalance is een consequentie van nieuws dat je niet hebt gezien. Ertegen traden verliest; ermee traden is news arbitrage, een andere strategie.
- Whale spoofing: een grote order geplaatst en snel gecanceld creëert fake imbalance voor de duur. Filter door te checken dat de imbalance 10+ seconden persistent is voor triggeren.
- End-of-period rebalancing: market makers die quotes pullen om inventory-redenen in plaats van informatie-redenen. De imbalance reverst minuten later wanneer MM her-quote't.
Het gecombineerde filter is: imbalance > threshold AND trade velocity > baseline AND geen news event in de laatste 5 minuten. Elk filter alleen heeft te veel false positives.
Code: bereken imbalance op elke WS tick
Referentie: abonneer op WebSocket book-updates, herbereken imbalance op elke 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 is per-token. Cooldown voorkomt over-firing op hetzelfde signaal. Filters (news check, trade velocity) gaten de daadwerkelijke trade.











