Tutorial de Bot da Polymarket · Capítulo 25 de 32
Bots de mercados esportivos na Polymarket: jogos semanais da NFL, microestrutura da NBA (tag 745), futebol (Premier League, Bundesliga, Champions League), tênis (864) - liquidez, fontes de edge, padrões de código.
O que este capítulo cobre
NFL, NBA, Soccer e Tennis são os maiores volumes esportivos da Polymarket por categoria. Cada um tem sua própria disponibilidade de dados, cadência e perfil de edge. Este capítulo cobre os padrões de bot específicos de cada liga e os IDs de tag que você vai filtrar.
- NFL: cadência semanal, liquidez máxima no domingo
- NBA (tag 745): microestrutura intra-jogo
- Futebol: ligas internacionais vs ligas de clubes
- Tênis (tag 864): cadência de torneios
- Fontes de edge que resistem
- Dados ao vivo: ESPN, APIs oficiais
- Bot de exemplo: capturador de linha pré-jogo
NFL: cadência semanal, liquidez máxima no domingo
A NFL tem o ritmo semanal mais forte de qualquer esporte na Polymarket. Os mercados abrem na terça-feira após os jogos da semana anterior, a busca por linhas acontece de quarta a sexta, e o volume de apostas atinge o pico no sábado e no domingo. A resolução costuma ocorrer no domingo à noite para os jogos mais cedo, e na segunda à noite para o jogo da noite.
Padrão de bot: capturador de linha na terça e na quarta, quando a linha de abertura é definida, e in-play no domingo durante o pico de volume. Bots diferentes para cada janela. O mercado do Monday Night Football costuma ter volume mais raso do que os outros jogos - tenha em mente que ele tem maior risco de slippage em entradas de pequeno porte.
O pico de volume é o Super Bowl: mais de $50M negociados em todos os mercados do SB na semana do jogo. Até mesmo um bot de $100 nessa semana é ruído irrelevante; o mercado é eficiente nessa escala.
NBA (tag 745): microestrutura intra-jogo
A NBA é o esporte de maior frequência na Polymarket - 25 a 30 jogos por semana durante a temporada regular, 5 a 15 nos playoffs. O ID de tag 745 filtra eventos somente da NBA.
A microestrutura intra-jogo funciona na NBA porque: (1) a ESPN atualiza os placares a cada ~10s, (2) os jogos têm 2,5 horas de ação contínua, (3) os books da Polymarket para os jogos principais permanecem profundos até o 4º quarto.
A estratégia que funciona: assinar o book WS de um jogo + feed da ESPN, reagir a desequilíbrio + eventos de pontuação em 10 a 15 segundos. Estratégias que não funcionam: capturar linha pré-jogo (já é eficiente o suficiente para o varejo não capturar muito), arbitragem de certeza no fim do jogo (território da armadilha de 0,99).
Futebol: ligas internacionais vs ligas de clubes
O futebol se divide em três níveis gerais na Polymarket.
- Principais ligas europeias (EPL tag 739, La Liga, Bundesliga, Serie A) - volume moderado, books profundos em jogos grandes. Estratégias de bot semelhantes às da NBA.
- Champions League / Europa League (UCL tag 2186) - volume máximo nas fases eliminatórias. Os books são mais profundos a partir das oitavas de final.
- Ligas internacionais / menores (Saudi Pro League, MLS, J-League) - books rasos, spreads grandes. Geralmente não são território para bot.
O placar discreto do futebol (0-1 gols são eventos enormes) o torna diferente do fluxo contínuo da NBA. O padrão de bot para futebol é: estar do lado certo antes de sair um gol, sair rápido depois que ele acontece.
Tênis (tag 864): cadência de torneios
Tag de tênis 864. Os circuitos ATP e WTA jogam 11 meses por ano, com os Grand Slams em jan (Australian Open), maio-jun (French Open), jul (Wimbledon) e ago-set (US Open). O volume se concentra nessas quatro semanas, além da série Masters 1000.
O tênis tem as escadas de preço in-play mais limpas de qualquer esporte (capítulo 15). Os preços no meio da partida seguem curvas previsíveis, ancoradas em estados de set e break. Um bot com um modelo de escada de preço específico para tênis consegue detectar precificação incorreta em tempo real.
Janelas silenciosas: entre Grand Slams, em semanas com apenas torneios ATP 250 / ATP 500, os books ficam muito rasos. Pause o bot ou mude para outro esporte durante esses períodos.
Fontes de edge que resistem
Em todos os quatro esportes, os edges que resistem ao longo do tempo são:
- Busca de linha pré-jogo contra o número de uma casa mais sharp (Pinnacle, Betfair). Quando a Polymarket discorda de uma casa sharp por mais de 3c, faça fade na Polymarket.
- Overreaction in-play a uma única jogada (interception, injury, momentum shift). Espere 30 a 60 segundos após a jogada, e faça fade se o mercado exagerou.
- Favoritos fortes no fim do jogo em 0,85-0,92 com sizing gerenciado por risco. Abaixo de 0,85 = risco real; acima de 0,92 = a armadilha de 0,99.
Edges que não resistem: análise técnica pura sobre preços, scraping de sentimento do Twitter, efeitos sazonais baseados em calendário.
Dados ao vivo: ESPN, APIs oficiais
Matriz de fontes de dados para os quatro esportes.
| Esporte | Primária | Backup | Cadência de atualização |
|---|---|---|---|
| NFL | scoreboard da ESPN | feed da NFL.com | ~10s durante a jogada |
| NBA | scoreboard da ESPN | stats.nba.com | ~10s durante a jogada |
| Futebol (EPL/UCL) | scoreboard da ESPN | SofaScore | ~15-30s |
| Tênis (ATP/WTA) | scoreboard da ESPN | tennis.com ao vivo | ~30s (nível de ponto) |
A ESPN é gratuita e confiável para todos os quatro. Para atualizações abaixo de 10s, pague por um feed especializado (StatsPerform, GeniusSports) - mas a melhoria marginal de latência raramente justifica o custo para o varejo.
Bot de exemplo: capturador de linha pré-jogo
Referência: pseudocódigo de capturador de linha pré-jogo.
def line_catcher():
# Find games starting in the next 2-12 hours
events = gamma_events(tag_id=745, hours_ahead=12)
for ev in events:
for m in ev["markets"]:
polymarket_prob = float(json.loads(m["outcomePrices"])[0])
sharp_prob = fetch_pinnacle_implied(ev["slug"]) # 3rd-party feed
if sharp_prob - polymarket_prob > 0.04:
# Polymarket has the YES side cheap vs sharp
tok = json.loads(m["clobTokenIds"])[0]
place_fok(tok, "BUY", polymarket_prob + 0.01, size=10)
elif polymarket_prob - sharp_prob > 0.04:
# Polymarket has the NO side cheap vs sharp
tok = json.loads(m["clobTokenIds"])[1]
place_fok(tok, "BUY", 1 - polymarket_prob + 0.01, size=10)
Observações: as APIs da Pinnacle / Betfair exigem contas; não são gratuitas. Sem uma referência sharp, capturar linha vira opinião contra opinião, o que não é território para bot.





