Polymarket Bot Tutorial · Chapitre 17 sur 32
Utilisez le déséquilibre du carnet d'ordres de Polymarket comme signal de prix à court terme : ratio de volume bid-ask, calcul du microprice, demi-vie du signal, et quand les imbalance bots battent une exécution aléatoire.
Ce que couvre ce chapitre
Le déséquilibre du carnet d'ordres est le ratio de la profondeur côté acheteur par rapport à la profondeur côté vendeur sur le limit order book. Sur Polymarket, il possède un avantage prédictif réel mais de courte durée - généralement 5 à 30 secondes avant que le mid ne bouge. Ce chapitre présente le schéma de calcul et les conditions dans lesquelles le signal peut être trompeur.
- Qu'est-ce que le déséquilibre du carnet d'ordres
- Calcul du microprice
- Le déséquilibre comme signal directionnel
- La demi-vie du signal sur Polymarket
- Quand les signaux de déséquilibre sont trompeurs
- Code : calculer le déséquilibre à chaque tick WS
Qu'est-ce que le déséquilibre du carnet d'ordres
Le déséquilibre du carnet d'ordres est le ratio de la profondeur totale côté achat par rapport à la profondeur totale côté vente dans le limit order book. Calculé sur les niveaux top-N (généralement N=5), il capture la pression agrégée des traders que le mid-price n'a pas encore reflétée.
Formule : imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). Plage de -1 à +1 ; un score positif signifie plus de pression acheteuse, un score négatif plus de pression vendeuse.
Le signal est empiriquement réel sur Polymarket, mais bruité. Une seule baleine peut simuler un déséquilibre pendant 30 à 60 secondes avant d'être arbitrée. Utile comme un indicateur parmi plusieurs, dangereux comme déclencheur unique.
Calcul du microprice
Le microprice est une amélioration du simple mid : une moyenne pondérée du meilleur bid et du meilleur ask, pondérée par leurs tailles respectives.
microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)
Quand la file côté bid est beaucoup plus importante que le côté ask, le microprice se rapproche de l'ask. L'idée : davantage d'acheteurs en attente signifie que la prochaine transaction a plus de chances de faire monter l'ask, donc la juste valeur est plus proche de l'ask.
Le microprice est un indicateur avancé de 5 à 30 secondes du déplacement réel du mid. Les production bots l'utilisent comme prix de référence pour les décisions de take-profit plutôt que le mid naïf.
Le déséquilibre comme signal directionnel
D'après l'observation en production : lorsque le déséquilibre passe de -0.3 à +0.5 en 10 secondes sans événement d'actualité associé, le mid monte de 1 à 2 cents dans les 30 à 60 secondes suivantes environ 65 % du temps.
C'est un vrai edge, mais il s'évapore pour de petites tailles de position après les fees. Pour le monétiser, le bot doit dimensionner suffisamment pour capturer le mouvement moins les fees, mais assez petit pour ne pas déplacer lui-même le book. Les books de Polymarket sont généralement assez peu profonds pour que tout ordre supérieur à 50 shares fasse bouger le marché.
Combinez le déséquilibre avec d'autres features : vitesse des trades (plus de trades = signal réel), best-bid qui monte réellement (pas seulement un déplacement de profondeur), marché qui n'est pas en mode news-driven.
La demi-vie du signal sur Polymarket
Le signal de déséquilibre se dégrade. Données de production de notre trader : imbalance > 0.6 → mouvement attendu du mid de 1.2c dans les 60s, demi-vie d'environ 30s. Après 90 secondes, la valeur prédictive est retombée à zéro.
Implication pour la conception du bot : réagissez vite ou abstenez-vous. Un bot qui met 15 secondes à décider consomme déjà la moitié de l'edge avant de passer l'ordre. Le budget de latence pour les stratégies de déséquilibre devrait être inférieur à 5 secondes entre le signal et le FOK déclenché.
Les stratégies qui conservent des positions plus longtemps que la demi-vie (1 à 2 minutes) parient sur le signal suivant, pas sur celui en cours. Soyez explicite là-dessus ; ne gardez pas accidentellement des positions pilotées par le déséquilibre jusqu'à la résolution.
Quand les signaux de déséquilibre sont trompeurs
Le signal induit en erreur lorsque l'une des trois conditions suivantes est remplie.
- Mouvement driven by news : le déséquilibre est la conséquence d'une information que vous n'avez pas vue. Trader à contre-sens perd ; trader avec le mouvement relève de l'arbitrage de news, une stratégie différente.
- Spoofing d'une baleine : un gros ordre placé puis rapidement annulé crée un faux déséquilibre pendant sa durée de vie. Filtrez en vérifiant que le déséquilibre persiste plus de 10 secondes avant de déclencher.
- Rééquilibrage de fin de période : market makers qui retirent leurs cotations pour des raisons d'inventaire plutôt que d'information. Le déséquilibre s'inverse quelques minutes plus tard lorsque le MM recote.
Le filtre combiné est le suivant : imbalance > threshold ET trade velocity > baseline ET aucun événement news dans les 5 dernières minutes. Chaque filtre pris isolément génère trop de faux positifs.
Code : calculer le déséquilibre à chaque tick WS
Référence : s'abonner aux mises à jour du book via WebSocket, recalculer le déséquilibre à chaque 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"])
L'état est par token. Le cooldown empêche de redéclencher trop souvent sur le même signal. Les filtres (vérification des news, trade velocity) encadrent le trade réel.





