Polymarket Bot Tutorial · Capitolo 17 di 32

Usa lo sbilanciamento dell'order book di Polymarket come segnale di prezzo a breve termine: rapporto tra volume bid e ask, calcolo del microprice, signal half-life e quando i bot basati sullo sbilanciamento battono l'esecuzione casuale.

Cosa copre questo capitolo

Lo sbilanciamento dell'order book è il rapporto tra la profondità sul lato buy e la profondità sul lato sell nel limit order book. Su Polymarket ha un vantaggio predittivo reale ma di breve durata — in genere 5-30 secondi prima che il mid si muova. Questo capitolo tratta il pattern di calcolo e le condizioni in cui il segnale mente.

Questo è il capitolo 17 della nostra serie in 32 parti su come costruire un Polymarket trading bot. Trattiamo l'argomento in profondità nelle sezioni qui sotto. Il contenuto principale di ogni sezione viene scritto e pubblicato capitolo per capitolo; le risposte FAQ e i riferimenti sono già completi e riflettono l'esperienza di produzione maturata gestendo il nostro trader.

  • Cos'è lo sbilanciamento dell'order book
  • Calcolo del microprice
  • Sbilanciamento come segnale direzionale
  • Signal half-life su Polymarket
  • Quando i segnali di sbilanciamento mentono
  • Codice: calcolare lo sbilanciamento a ogni WS tick

Cos'è lo sbilanciamento dell'order book

Lo sbilanciamento dell'order book è il rapporto tra la profondità totale sul lato buy e la profondità totale sul lato sell nel limit order book. Calcolato sui top-N levels (comunemente N=5), cattura la pressione aggregata dei trader che il mid-price non ha ancora riflesso.

Formula: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). Range da -1 a +1; positivo significa maggiore pressione buy, negativo significa maggiore pressione sell.

Il segnale è empiricamente reale su Polymarket ma rumoroso. Un singolo whale può falsare l'imbalance per 30-60 secondi prima di essere arbitrato via. È utile come uno tra più feature, ma pericoloso come unico trigger.

Calcolo del microprice

Il microprice è una raffinazione del semplice mid: una media ponderata del best bid e del best ask, pesata in base alle rispettive size.

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

Quando la coda sul lato bid è molto più grande di quella sul lato ask, il microprice si avvicina di più all'ask. L'intuizione: avere più buyer in attesa significa che il prossimo trade ha più probabilità di alzare l'ask, quindi il fair value è più vicino all'ask.

Il microprice è un indicatore anticipatore di 5-30 secondi del movimento del mid effettivo. I bot in produzione lo usano come prezzo di riferimento per le decisioni di take-profit invece del mid ingenuo.

Sbilanciamento come segnale direzionale

Dall'osservazione in produzione: quando l'imbalance passa da -0.3 a +0.5 in 10 secondi senza un evento di news associato, il mid sale di 1-2 centesimi entro i successivi 30-60 secondi circa il 65% delle volte.

È un vero edge, ma si dissolve a piccoli position size dopo le fee. Per monetizzarlo, il bot deve dimensionare abbastanza da catturare il movimento meno le commissioni, ma abbastanza poco da non muovere lui stesso il book. I book di Polymarket sono in genere abbastanza sottili che qualsiasi cosa sopra 50 shares muove il mercato.

Combina l'imbalance con altri feature: trade velocity (più trade = segnale reale), best bid che si muove davvero verso l'alto (non solo spostamento della depth), mercato non in modalità guidata dalle news.

Signal half-life su Polymarket

Il segnale di imbalance decade. Dati di produzione del nostro trader: imbalance > 0.6 → expected mid move di 1.2c entro 60s, half-life di circa 30s. Dopo 90 secondi il valore predittivo è sceso a zero.

Implicazione per il bot design: reagisci rapidamente oppure salta. Un bot che impiega 15 secondi per decidere consuma metà dell'edge prima di piazzare l'ordine. Il latency budget per le strategie di imbalance dovrebbe essere sotto i 5 secondi dal segnale all'invio del FOK.

Le strategie che mantengono posizioni più a lungo della half-life (1-2 minuti) stanno scommettendo sul segnale successivo, non su quello corrente. Sii esplicito su questo; non tenere accidentalmente posizioni guidate dall'imbalance fino alla resolution.

Quando i segnali di sbilanciamento mentono

Il segnale è fuorviante quando si verifica una delle tre condizioni seguenti.

  • Movimento guidato dalle news: lo sbilanciamento è una conseguenza di news che non hai ancora visto. Tradare contro di esso fa perdere; tradare con esso è news arbitrage, una strategia diversa.
  • Whale spoofing: un grande ordine piazzato e cancellato rapidamente crea un falso sbilanciamento per la sua durata. Filtra verificando che l'imbalance persista per oltre 10 secondi prima di attivarlo.
  • Rebalancing di fine periodo: market maker che ritirano le quote per motivi di inventory invece che informativi. L'imbalance si inverte minuti dopo, quando il MM riquota.

Il filtro combinato è: imbalance > threshold AND trade velocity > baseline AND nessun evento di news negli ultimi 5 minuti. Ogni filtro da solo genera troppi falsi positivi.

Codice: calcolare lo sbilanciamento a ogni WS tick

Reference: iscriviti agli aggiornamenti WebSocket del book, ricalcola l'imbalance a ogni 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"])

Lo state è per token. Il cooldown impedisce di riattivare troppo spesso lo stesso segnale. I filtri (news check, trade velocity) autorizzano il trade effettivo.

Domande frequenti

Cos'è lo sbilanciamento dell'order book?
Il rapporto tra volume bid e volume ask nella parte alta del book. Un book fortemente sbilanciato sul bid (più buyer che seller vicino al touch) suggerisce pressione al rialzo sul prezzo nel brevissimo termine. Il segnale è ben noto in crypto e in equities; su Polymarket funziona nei mercati liquidi ma scompare in quelli sottili.
Come calcolo il microprice?
microprice = (best_ask * bid_size + best_bid * ask_size) / (bid_size + ask_size). È una versione del mid-price ponderata per il volume che tende verso il lato con meno volume - il lato che si "esaurisce" per primo. I bot lo usano come stima del fair value che incorpora lo sbilanciamento.
Qual è la half-life di un segnale di imbalance su Polymarket?
Nei mercati attivi, 5-30 secondi. Nei mercati sottili, più a lungo (perché i nuovi ordini impiegano più tempo a sopraffare lo sbilanciamento). Se il tuo bot reagisce in meno di un secondo, puoi catturare una parte del movimento. Se reagisce in 5+ secondi, di solito sei troppo tardi.
Quando l'imbalance mente?
Quando un singolo grande ordine è appoggiato su un lato in attesa di essere colpito (un grande resting bid, nessuna altra attività). L'imbalance è reale ma non predice il prezzo - mostra solo un buyer molto motivato. Filtra contando gli ordini, non solo il volume: imbalance N ordini contro 1 ordine è più informativo di 5x volume distribuito su 1 ordine ciascuno.
Lo sbilanciamento dell'order book basta per tradare da solo?
Di solito no. Come segnale standalone è debole e viene arbitrato via. Combinalo con un altro segnale (ad esempio macroprice mean reversion, news flag o sports state) per ottenere un edge più durevole. Da solo, l'imbalance tende a performare peggio dell'esecuzione casuale dopo le fee.
Quale libreria Python può calcolare l'imbalance da Polymarket WS?
Per quanto ne sappiamo, non esiste una libreria pronta all'uso: bastano poche decine di righe di codice. Iscriviti via py-clob-client al market book, a ogni evento price_change ricalcola le size bid/ask top-of-book ed emetti la tua metrica di imbalance. Fai cache dell'ultimo valore e riattiva il trigger solo su cambiamenti significativi.