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 / League | Tag ID | Tag slug | Notes |
|---|---|---|---|
| NBA | 745 | nba | maior volume Oct-Jun |
| NFL | 450 | nfl | pico Sun/Mon Sep-Feb |
| Tennis (all) | 864 | tennis | o ano todo, cadência de torneios |
| Soccer (general) | 1059 | soccer | combine com os sub-tags abaixo |
| EPL | 739 | epl | |
| UCL | 2186 | uefa-champions-league | |
| Esports (all) | 702 | esports | LoL+CS2+Valorant+Dota |
| MLB | 1245 | mlb | pico Apr-Oct |
| NHL | 823 | nhl | pico 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).





