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.

Questions fréquemment posées

Qu'est-ce que le déséquilibre du carnet d'ordres ?
Le ratio du volume bid par rapport au volume ask en haut du book. Un book fortement orienté bid (plus d'acheteurs que de vendeurs près du touch) suggère une pression haussière à très court terme. Le signal est bien connu en crypto et en equities ; sur Polymarket, il fonctionne sur les marchés liquides mais disparaît sur les marchés peu profonds.
Comment calculer le microprice ?
microprice = (best_ask * bid_size + best_bid * ask_size) / (bid_size + ask_size). C'est une version pondérée par le volume du mid-price qui penche vers le côté avec le moins de volume - le côté qui "s'épuise" en premier. Les bots l'utilisent comme estimation de la fair value qui intègre le déséquilibre.
Quelle est la demi-vie d'un signal de déséquilibre sur Polymarket ?
Sur les marchés actifs, 5 à 30 secondes. Sur les marchés peu profonds, plus longtemps (car de nouveaux ordres mettent plus de temps à submerger le déséquilibre). Si votre bot réagit en moins d'une seconde, vous pouvez en capturer une partie. S'il réagit en 5 secondes ou plus, vous arrivez généralement trop tard.
Quand le déséquilibre est-il trompeur ?
Quand un seul gros ordre attend d'être exécuté d'un côté (un gros bid en attente, aucune autre activité). Le déséquilibre est réel mais il ne prédit pas le prix - il montre seulement un acheteur motivé. Filtrez en comptant les ordres, pas seulement le volume : un déséquilibre de N ordres contre 1 ordre est plus informatif que 5x de volume réparti sur 1 ordre chacun.
Le déséquilibre du carnet d'ordres suffit-il à trader seul ?
En général non. Comme signal autonome, il est faible et finit arbitrée. Combinez-le avec un autre signal (par ex. macroprice mean reversion, news flag, ou état du sport) pour un edge plus durable. Le déséquilibre seul a tendance à sous-performer une exécution aléatoire après les fees.
Quelle bibliothèque Python peut calculer le déséquilibre à partir du WS de Polymarket ?
À notre connaissance, aucune bibliothèque prête à l'emploi - cela tient en quelques dizaines de lignes de code. Abonnez-vous via py-clob-client au market book, et à chaque événement price_change recalculez les tailles bid/ask en top of book, puis émettez votre métrique de déséquilibre. Mettez en cache la dernière valeur et ne redéclenchez que lors de changements significatifs.