Tutorial de Bot de Polymarket · Capítulo 17 de 32
Usa el desequilibrio del libro de órdenes de Polymarket como señal de precio a corto plazo: ratio de volumen bid-ask, cálculo de microprice, half-life de la señal y cuándo los bots de desequilibrio le ganan a la ejecución aleatoria.
Qué cubre este capítulo
El desequilibrio del libro de órdenes es la relación entre la profundidad del lado comprador y la profundidad del lado vendedor en el libro de órdenes límite. En Polymarket tiene una ventaja predictiva real, pero de vida corta: normalmente entre 5 y 30 segundos antes de que el mid se mueva. Este capítulo explica el patrón de cálculo y las condiciones bajo las cuales la señal miente.
- Qué es el desequilibrio del libro de órdenes
- Cálculo de microprice
- El desequilibrio como señal direccional
- Half-life de la señal en Polymarket
- Cuándo mienten las señales de desequilibrio
- Código: calcular el desequilibrio en cada tick de WS
Qué es el desequilibrio del libro de órdenes
El desequilibrio del libro de órdenes es la relación entre la profundidad total del lado comprador y la profundidad total del lado vendedor en el libro de órdenes límite. Calculado en los niveles top-N (comúnmente N=5), captura la presión agregada de los traders que el mid-price todavía no ha reflejado.
Fórmula: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). Rango de -1 a +1; positivo significa más presión compradora, negativo significa más presión vendedora.
La señal es empíricamente real en Polymarket, pero ruidosa. Una sola ballena puede simular un desequilibrio durante 30-60 segundos antes de que el arbitraje lo corrija. Es útil como una señal entre varias, pero peligrosa como único disparador.
Cálculo de microprice
El microprice es una refinación del mid simple: un promedio ponderado del mejor bid y el mejor ask, ponderado por sus tamaños respectivos.
microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)
Cuando la cola del lado bid es mucho más grande que la del lado ask, el microprice se ubica más cerca del ask. La intuición: más compradores esperando significa que la siguiente operación probablemente levante el ask, así que el valor justo está más cerca del ask.
El microprice es un indicador adelantado de 5-30 segundos del movimiento real del mid. Los bots en producción lo usan como precio de referencia para decisiones de take-profit en vez del mid ingenuo.
El desequilibrio como señal direccional
Según observación en producción: cuando el desequilibrio pasa de -0.3 a +0.5 en 10 segundos sin un evento noticioso asociado, el mid sube 1-2 centavos dentro de los siguientes 30-60 segundos aproximadamente 65% de las veces.
Eso es una ventaja real, pero se diluye en posiciones pequeñas después de fees. Para monetizarla, el bot debe dimensionar lo suficiente para capturar el movimiento menos comisiones, pero sin ser tan grande como para mover el libro por sí mismo. Los libros de Polymarket suelen ser lo bastante delgados como para que cualquier cosa por encima de 50 shares mueva el mercado.
Combina el desequilibrio con otras variables: velocidad de trades (más trades = señal real), que el best bid efectivamente suba (no solo que se desplace la profundidad), y que el mercado no esté en modo impulsado por noticias.
Half-life de la señal en Polymarket
La señal de desequilibrio se degrada. Datos de producción de nuestro trader: imbalance > 0.6 → movimiento esperado del mid de 1.2c dentro de 60s, half-life de ~30s. Después de 90 segundos, el valor predictivo ya se fue a cero.
Implicación para el diseño del bot: reacciona rápido o salte. Un bot que tarda 15 segundos en decidir está consumiendo la mitad de la ventaja antes de colocar la orden. El presupuesto de latencia para estrategias de desequilibrio debería estar por debajo de 5 segundos desde la señal hasta el disparo de FOK.
Las estrategias que mantienen posiciones por más tiempo que la half-life (1-2 minutos) están apostando a la siguiente señal, no a la actual. Sé explícito con esto; no mantengas por accidente posiciones impulsadas por desequilibrio hasta la resolución.
Cuándo mienten las señales de desequilibrio
La señal engaña cuando se cumple una de tres condiciones.
- Movimiento impulsado por noticias: el desequilibrio es consecuencia de una noticia que no has visto. Operar en contra pierde; operar a favor es arbitraje de noticias, una estrategia distinta.
- Spoofing de ballena: una orden grande colocada y cancelada rápidamente crea un desequilibrio falso durante ese lapso. Filtra verificando que el desequilibrio persista 10+ segundos antes de disparar.
- Rebalanceo de fin de período: market makers retirando cotizaciones por razones de inventario y no de información. El desequilibrio se revierte minutos después cuando el MM vuelve a cotizar.
El filtro combinado es: desequilibrio > umbral AND velocidad de trades > baseline AND sin evento noticioso en los últimos 5 minutos. Cada filtro por separado genera demasiados falsos positivos.
Código: calcular el desequilibrio en cada tick de WS
Referencia: suscríbete a actualizaciones del libro por WebSocket y recalcula el desequilibrio en cada 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"])
El estado es por token. El cooldown evita disparar de más sobre la misma señal. Los filtros (verificación de noticias, velocidad de trades) habilitan la operación real.





