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.

Perguntas frequentes

O que é order book imbalance?
A relação entre o volume de bid e o volume de ask no topo do book. Um book fortemente inclinado para bids (mais compradores do que vendedores perto do touch) sugere pressão de alta no curtíssimo prazo. O sinal é bem conhecido em cripto e equities; na Polymarket, ele funciona em mercados líquidos, mas desaparece nos mais finos.
Como eu calculo o microprice?
microprice = (best_ask * bid_size + best_bid * ask_size) / (bid_size + ask_size). É uma versão ponderada por volume do mid-price que se inclina para o lado com menos volume - o lado que está "acabando" primeiro. Bots o usam como uma estimativa de fair value que incorpora o imbalance.
Qual é a meia-vida de um sinal de imbalance na Polymarket?
Em mercados ativos, de 5 a 30 segundos. Em mercados finos, mais tempo (porque novas ordens levam mais tempo para sobrepujar o imbalance). Se o seu bot reage em menos de um segundo, você consegue capturar parte disso. Se ele reage em 5+ segundos, normalmente já é tarde demais.
Quando o imbalance mente?
Quando uma única ordem grande fica parada de um lado esperando ser executada (um bid grande resting, sem outra atividade). O imbalance é real, mas não prevê o preço - ele apenas mostra um comprador motivado. Filtre contando ordens, não apenas volume: imbalance de N ordens para 1 ordem é mais informativo do que 5x de volume distribuído em 1 ordem cada.
Order book imbalance sozinho basta para operar?
Normalmente não. Como sinal isolado, ele é fraco e acaba arbitrado. Combine com outro sinal (por exemplo, macroprice mean reversion, flag de news ou estado do esporte) para obter uma vantagem mais durável. O imbalance sozinho tende a ficar abaixo da execução aleatória depois das fees.
Qual biblioteca Python pode calcular imbalance a partir do WS da Polymarket?
Não conhecemos uma biblioteca pronta para isso - são algumas dezenas de linhas de código. Assine via py-clob-client o market book, e a cada evento price_change recalcule os tamanhos de bid/ask do topo do book e emita sua métrica de imbalance. Armazene em cache o último valor e só reative o gatilho quando houver mudanças significativas.