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.

Veelgestelde vragen

Wat is order book imbalance?
De ratio van bid-volume tot ask-volume aan de top van het book. Een zwaar bid-skewed book (meer kopers dan verkopers nabij de touch) suggereert opwaartse prijsdruk op de zeer korte termijn. Het signaal is goed bekend in crypto en equities; op Polymarket werkt het in liquide markten maar verdwijnt in dunne.
Hoe bereken ik de microprice?
microprice = (best_ask * bid_size + best_bid * ask_size) / (bid_size + ask_size). Het is een volume-gewogen versie van mid-prijs die leunt naar de zijde met minder volume — de zijde die "uitgaat" als eerste. Bots gebruiken het als een fair-value schatting die imbalance incorporeert.
Wat is de half-life van een imbalance-signaal op Polymarket?
In actieve markten 5-30 seconden. In dunne markten langer (omdat nieuwe orders langer duren om de imbalance te overwinnen). Als je bot in onder een seconde reageert, kun je er wat van vangen. Als hij in 5+ seconden reageert, ben je meestal te laat.
Wanneer liegt imbalance?
Wanneer een enkele grote order aan één zijde zit te wachten om geraakt te worden (één grote resting bid, geen andere activiteit). De imbalance is echt maar voorspelt de prijs niet — het toont gewoon één gemotiveerde koper. Filter door orders te tellen, niet alleen volume: imbalance van N orders tegen 1 order is informatiever dan 5x volume verspreid over 1 order elk.
Is order book imbalance genoeg om alleen te traden?
Meestal niet. Als standalone signaal is het zwak en wordt het gearbitreerd. Combineer met een ander signaal (bijv. macroprice mean reversion, news flag of sports state) voor een duurzamere edge. Imbalance alleen tendeert random executie na fees te onderperformen.
Welke Python-library kan imbalance berekenen vanuit Polymarket WS?
Geen off-the-shelf library die we kennen — het is een paar dozijn regels code. Abonneer via py-clob-client op het market-book, op elk price_change event herbereken top-of-book bid/ask sizes en emit je imbalance-metric. Cache de laatste waarde en re-trigger alleen op betekenisvolle veranderingen.