Tutorial de Bot da Polymarket · Capítulo 15 de 32

Bots de microestrutura esportiva na Polymarket: edge em jogo ao vivo, mispricing impulsionado por placar, a tag da NBA (745) e a tag de Tennis (864), fontes de dados ao vivo e padrões de execução para mercados esportivos de alta frequência.

O que este capítulo cobre

Os mercados esportivos são o segmento não político mais consistentemente ativo na Polymarket. Os bots que funcionam se encaixam em duas categorias bem definidas: captadores de line pré-jogo que operam quando a linha já está definida, e bots de microestrutura in-game que reagem ao movimento do order book durante a partida. Este capítulo cobre ambos com os IDs de tag específicos, fontes de dados e orçamentos de latência aplicáveis a cada um.

Os mercados esportivos são o segmento não político mais movimentado na Polymarket. O padrão de execução que funciona combina um feed de placar ao vivo (ESPN, PandaScore) com sinais de microestrutura do order book. Este capítulo cobre o que funciona especificamente para NFL, NBA, soccer e tennis, e onde esports é diferente.

  • Por que mercados esportivos são tradeáveis
  • Pré-jogo vs in-game (bots diferentes)
  • IDs de tag verificados (745 NBA, 864 Tennis)
  • Fontes de dados: ESPN, APIs oficiais, na tela
  • Orçamento de latência para in-game
  • O problema do 0.99 / 0.01
  • Código: assinar um games book e reagir

Por que mercados esportivos são tradeáveis

Mercados esportivos fecham em janelas de tempo definidas (de horas a dias), têm dados públicos ao vivo e atraem fluxo contínuo de ordens durante os jogos. Os três são necessários para um mercado ser tradeável - mercados políticos não têm "janela de tempo definida", mercados de clima não têm "fluxo contínuo", torneios obscuros não têm "dados públicos ao vivo".

O público trader nos mercados esportivos também é mais diversificado do que, por exemplo, em mercados eleitorais. Apostadores casuais precificam emocionalmente; traders informados corrigem em direção ao valor justo ao longo da partida. A diferença entre os dois é o edge do bot.

A distribuição de volume é desigual: um domingo de NFL vai movimentar centenas de milhões de dólares entre os mercados esportivos da Polymarket; uma partida da Saudi Pro League numa terça à noite pode ficar abaixo de US$ 50 mil. Dimensione sua estratégia para onde a ação realmente está.

Pré-jogo vs in-game (bots diferentes)

Dois designs de bot fundamentalmente diferentes.

Pre-game line-catcher: varre mercados que acabaram de abrir, identifica lines mal precificadas contra seu modelo ou contra o número de uma venue mais sharp, e envia uma compra FOK. Segura até o in-play, às vezes até a resolução. Velocidade: minutos, não segundos. Edge: modelo + line shopping.

In-game microstructure: assina o WebSocket do order book de um jogo ao vivo, reage a sinais de desequilíbrio + eventos de placar em segundos. Velocidade: segundos, não minutos. Edge: latência + leitura de order flow.

Os dois compartilham quase nenhum código. Têm perfis de risco diferentes, fontes de dados diferentes e estratégias de saída diferentes. Um bot tentando fazer ambos acaba não fazendo nenhum direito; escolha um.

IDs de tag verificados (745 NBA, 864 Tennis)

IDs de tag de produção verificados em maio de 2026 para as principais categorias esportivas. Use estes para filtrar chamadas de /events com eficiência.

Sport / LeagueTag IDTag slugNotes
NBA745nbamaior volume Oct-Jun
NFL450nflpico Sun/Mon Sep-Feb
Tennis (all)864tenniso ano todo, cadência de torneios
Soccer (general)1059soccercombine com os sub-tags abaixo
EPL739epl
UCL2186uefa-champions-league
Esports (all)702esportsLoL+CS2+Valorant+Dota
MLB1245mlbpico Apr-Oct
NHL823nhlpico Oct-Jun

Os IDs de tag são estáveis ao longo dos anos. Novas tags são adicionadas (Saudi Pro League, IPL), mas as tags antigas não recebem nova numeração.

Fontes de dados: ESPN, APIs oficiais, na tela

Para esportes tradicionais, a API gratuita de placar da ESPN cobre tudo o que você precisa: scores, period/clock, win-probability, às vezes shot location. Não requer key; tem limite apenas por IP. Padrão do endpoint: https://site.api.espn.com/apis/site/v2/sports/<sport>/<league>/scoreboard.

Para esports, a ESPN não tem cobertura. Opções: PandaScore ($30-60/mês, o padrão da indústria), HLTV (somente CS2, pode ser raspado, sem API), Liquipedia (mantida pela comunidade, pode ser raspada, cadência de atualização mais lenta).

Feeds na tela (pagar por um stream de TV e ler o scorebug com OCR) funcionam, mas são pesados operacionalmente. Recomendado apenas se você tiver uma estratégia que exija atualizações em menos de 3 segundos em um esporte que nenhuma API cobre em tempo real.

Orçamento de latência para in-game

O orçamento de latência ponta a ponta para um bot reativo in-game.

  • Evento de placar acontece: t=0
  • Feed de origem reflete: t+3-15s (ESPN: ~10s; PandaScore: ~3s)
  • Seu bot lê o feed: t+10-16s
  • Bot decide a ação: +50ms
  • Ordem FOK enviada: +200-500ms
  • Executada no CLOB: +300-1000ms (rede + matching)

Total: 11-17 segundos. As firmas profissionais mais rápidas conseguem 3-5 segundos ponta a ponta com feeds premium pagos e VPS co-localizada. Bots de varejo rodando em hosts padrão e ESPN gratuito ficam no lado mais lento.

Estratégias que precisam de menos de 5s não são viáveis para varejo. Estratégias que funcionam na janela de 10-17s são: capturar line após um score, fading de overreactions, e plays de certeza no fim do jogo.

O problema do 0.99 / 0.01

A falha mais comum de bots esportivos in-play: comprar o grande favorito a 0.99 com um minuto restante, esperando um fácil +1¢. Há três motivos para isso falhar.

Primeiro, a probabilidade implícita de 1% do azarão não é zero - viradas no fim acontecem com frequência não trivial. Uma vitória 99,5% certa, operada 200 vezes, produz uma derrota para o tamanho total da posição.

Segundo, o spread em 0.99/0.01 significa que você paga 99c por share, ganha 1c no sucesso e perde 99c na rara reversão. O risco-retorno é brutal.

Terceiro, o bot usando GTC sell em 0.999 raramente vai ser executado - não há compradores nesse preço. A posição vai até a resolução. Se vencer, você ganhou 1c. Se a reversão acontecer, você perde 99c.

Essa armadilha custa dinheiro de verdade para builders que não fizeram a conta. Fique longe de mercados com preço acima de 0.95, a menos que sua estratégia seja especificamente construída para o perfil de redemption-arbitrage.

Código: assinar um games book e reagir

Referência: assine o WebSocket de um jogo específico da NBA, registre updates do book, dispare FOK com base em sinal de desequilíbrio.

import websocket, json
THRESHOLD = 0.5  # imbalance level to trigger

def on_message(ws, message):
    msg = json.loads(message)
    if msg.get("event_type") != "book": return
    bids = msg.get("bids", [])
    asks = msg.get("asks", [])
    bid_depth = sum(float(b["price"]) * float(b["size"]) for b in bids[:5])
    ask_depth = sum(float(a["price"]) * float(a["size"]) for a in asks[:5])
    total = bid_depth + ask_depth
    if total < 100: return  # too illiquid
    imb = (bid_depth - ask_depth) / total
    if abs(imb) > THRESHOLD:
        print(f"signal imb={imb:.2f} bid={bid_depth:.0f} ask={ask_depth:.0f}")
        # fire FOK here

ws = websocket.WebSocketApp(
    "wss://ws-subscriptions-clob.polymarket.com/ws/market",
    on_open=lambda ws: ws.send(json.dumps({"type":"Market","markets":["<CONDITION_ID>"]})),
    on_message=on_message
)
ws.run_forever()

Adições de produção: cooldown entre execuções, limite de inventário por token, kill em book stale (nenhuma mensagem em 30s).

Perguntas frequentes

Quais tags esportivas são mais ativas na Polymarket?
NBA (tag_id 745), Tennis (tag_id 864) e soccer (varia por competição) lideram o volume de 24h durante suas temporadas. Nós verificamos os IDs de tag da NBA e Tennis em produção - os demais devem ser checados via endpoint gamma /tags antes de confiar neles.
Consigo operar bot em mercados esportivos in-game com lucro?
Possivelmente - mas é difícil. O edge é real (o placar ao vivo muitas vezes fica mal precificado por 30-90 segundos), mas outros bots também estão observando. Os melhores resultados que vimos vêm da combinação de uma fonte rápida de dados de placar ao vivo com regras simples ("o adversário pontuou, o mercado ainda não se moveu, compre"). Pure stat-arb sem a fonte de dados perde para competidores mais rápidos.
Onde consigo dados esportivos ao vivo?
ESPN.com tem endpoints JSON não oficiais que retornam scores ao vivo - bons o suficiente para muitas estratégias. APIs oficiais (NBA Stats API, endpoints públicos da NFL) são mais confiáveis, mas mais lentas. Contas de repórteres no Twitter/X fornecem texto, mas exigem parsing com LLM. Nenhuma é HFT-grade; todas são "rápidas o suficiente" para varejo.
O que é o problema do 0.99 / 0.01?
Quando um mercado esportivo está a 99 centavos em YES (muito provavelmente vencedor), quase não há upside restante e um movimento de 1 centavo pode apagar um ganho esperado de meses. Muitos bots são pegos comprando em 0.99 correndo atrás do último centavo e levando uma pancada quando um evento inesperado derruba o preço para 0.85. Regra dura: não compre acima de ~0.95, a menos que a matemática do expected value seja à prova de bala.
Como a Polymarket sports se compara a sportsbooks tradicionais?
Não há house edge no spread (vs ~5-10% de vig na FanDuel/DraftKings), mas a liquidez é menor e os spreads podem ser mais largos. A Polymarket se destaca em eventos que os books tradicionais precificam mal - torneios internacionais, esports, mercados de nicho. Para NFL/NBA mainstream, os books tradicionais têm mais liquidez, mas custam mais em vig.
Meu bot pode operar em vários mercados esportivos ao mesmo tempo?
Sim - e você deveria. Microestrutura esportiva funciona melhor como um portfólio de 5-20 jogos simultâneos. Limite de posição por jogo (por exemplo, US$ 50), limite de portfólio (por exemplo, US$ 500) e exposição não correlacionada entre jogos. Concentrar em um único jogo maximiza a variância.