Polymarket Bot Tutorial · Capítulo 17 de 32
Use o desequilíbrio do order book da Polymarket como um sinal de preço de curto prazo: relação entre volume de bid e ask, cálculo de microprice, meia-vida do sinal e quando bots de imbalance superam a execução aleatória.
O que este capítulo cobre
O desequilíbrio do order book é a relação entre a profundidade do lado comprador e a profundidade do lado vendedor no limit order book. Na Polymarket, ele tem uma vantagem preditiva real, mas de vida curta - normalmente de 5 a 30 segundos antes do mid se mover. Este capítulo mostra o padrão de cálculo e as condições sob as quais o sinal engana.
- O que é order book imbalance
- Cálculo de microprice
- Imbalance como sinal direcional
- Meia-vida do sinal na Polymarket
- Quando os sinais de imbalance mentem
- Código: calcular imbalance a cada tick do WS
O que é order book imbalance
Order book imbalance é a relação entre a profundidade total do lado comprador e a profundidade total do lado vendedor no limit order book. Calculado nos níveis top-N (comumente N=5), ele captura a pressão agregada dos traders que o mid-price ainda não refletiu.
Fórmula: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). Faixa de -1 a +1; positivo significa mais pressão de compra, negativo significa mais pressão de venda.
O sinal é empiricamente real na Polymarket, mas ruidoso. Uma única baleia pode gerar um falso imbalance por 30 a 60 segundos antes de ser arbitrada. É útil como um entre vários features, perigoso como único gatilho.
Cálculo de microprice
O microprice é um refinamento do mid simples: uma média ponderada do melhor bid e do melhor ask, ponderada pelos respectivos tamanhos.
microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)
Quando a fila do lado do bid é muito maior do que a do ask, o microprice fica mais próximo do ask. A intuição: mais compradores esperando significa que a próxima negociação tem mais chance de puxar o ask, então o fair value fica mais perto do ask.
O microprice é um indicador líder de 5 a 30 segundos para o mid real se mover. Bots de produção o usam como preço de referência para decisões de take-profit em vez do mid ingênuo.
Imbalance como sinal direcional
Da observação em produção: quando o imbalance vira de -0.3 para +0.5 em 10 segundos sem um evento de news acompanhando, o mid sobe de 1 a 2 centavos nos próximos 30 a 60 segundos em cerca de 65% das vezes.
Isso é uma vantagem real, mas ela desaparece em posições pequenas depois das fees. Para monetizar, o bot precisa dimensionar o suficiente para capturar o movimento menos as fees, mas pequeno o bastante para não mexer no book. Os books da Polymarket normalmente são finos o bastante para que qualquer coisa acima de 50 shares mova o mercado.
Combine imbalance com outros features: velocidade de trades (mais trades = sinal real), best-bid realmente subindo (não apenas profundidade mudando), mercado não estar em modo movido por news.
Meia-vida do sinal na Polymarket
O sinal de imbalance se deteriora. Dados de produção do nosso trader: imbalance > 0.6 → movimento esperado do mid de 1.2c em até 60s, meia-vida de ~30s. Após 90 segundos, o valor preditivo vai a zero.
Implicação para o design do bot: reaja rápido ou pule. Um bot que leva 15 segundos para decidir já está consumindo metade da vantagem antes de enviar a ordem. O orçamento de latência para estratégias de imbalance deve ficar abaixo de 5 segundos do sinal até o FOK ser disparado.
Estratégias que mantêm posições por mais tempo do que a meia-vida (1 a 2 minutos) estão apostando no próximo sinal, não no atual. Seja explícito sobre isso; não segure acidentalmente posições baseadas em imbalance até a resolução.
Quando os sinais de imbalance mentem
O sinal engana quando uma das três condições abaixo ocorre.
- Movimento movido por news: o imbalance é consequência de uma news que você ainda não viu. Operar contra ele perde; operar junto é news arbitrage, uma estratégia diferente.
- Spoofing de whale: uma ordem grande colocada e rapidamente cancelada cria um imbalance falso durante esse período. Filtre verificando se o imbalance persiste por mais de 10 segundos antes de disparar.
- Rebalanceamento no fim do período: market makers retirando cotações por motivos de inventory, e não por motivos de informação. O imbalance se reverte minutos depois, quando o MM reprecifica.
O filtro combinado é: imbalance > threshold AND trade velocity > baseline AND nenhum evento de news nos últimos 5 minutos. Cada filtro isoladamente gera falsos positivos demais.
Código: calcular imbalance a cada tick do WS
Referência: assine as atualizações do order book via WebSocket e recalcule o imbalance a 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"])
O estado é por token. O cooldown evita disparar demais no mesmo sinal. Os filtros (checagem de news, trade velocity) controlam a operação real.





