Tutorial de Bot de Polymarket · Capítulo 25 de 32
Bots de mercados deportivos en Polymarket: juegos semanales de NFL, microestructura del tag NBA (745), soccer (Premier League, Bundesliga, Champions League), tennis (864) - liquidez, fuentes de edge, patrones de código.
Qué cubre este capítulo
NFL, NBA, Soccer y Tennis son los mayores volúmenes deportivos de Polymarket por categoría. Cada uno tiene su propia disponibilidad de datos, cadencia y perfil de edge. Este capítulo cubre los patrones de bot específicos por liga y los tag IDs que vas a filtrar.
- NFL: cadencia semanal, liquidez pico el domingo
- NBA (tag 745): microestructura en vivo
- Soccer: ligas internacionales vs. ligas de clubes
- Tennis (tag 864): cadencia de torneos
- Fuentes de edge que sobreviven
- Datos en vivo: ESPN, APIs oficiales
- Bot de muestra: capturador de líneas pre-partido
NFL: cadencia semanal, liquidez pico el domingo
NFL tiene el ritmo semanal más marcado de cualquier deporte en Polymarket. Los mercados abren el martes después de los juegos de la semana anterior, la búsqueda de líneas ocurre de miércoles a viernes, y el volumen de apuestas alcanza su pico el sábado y domingo. La resolución suele ser el domingo por la noche para los juegos tempranos, y el lunes por la noche para el último.
Patrón de bot: capturador de líneas el martes-miércoles, cuando se fija la línea de apertura, y trading en vivo el domingo durante el volumen pico. Distintos bots para cada ventana. El mercado de Monday Night Football suele tener menor volumen que otros juegos - ten en cuenta que tiene mayor riesgo de slippage en entradas de tamaño pequeño.
El pico de volumen es el Super Bowl: se negocian más de $50M en todos los mercados del SB durante la semana del juego. Incluso un bot de $100 en esa semana es ruido irrelevante; el mercado es eficiente a esa escala.
NBA (tag 745): microestructura en vivo
NBA es el deporte de mayor frecuencia en Polymarket - 25-30 juegos por semana durante la temporada regular, 5-15 en playoffs. El tag ID 745 filtra solo eventos de NBA.
La microestructura en vivo funciona en NBA porque: (1) ESPN actualiza los marcadores cada ~10s, (2) los juegos son 2.5 horas de acción continua, (3) los books de Polymarket para los juegos importantes se mantienen profundos hasta el 4th quarter.
La estrategia que sí funciona: suscribirte al WS book de un juego + al feed de ESPN, y reaccionar al desequilibrio + eventos de scoring en 10-15 segundos. Las estrategias que no funcionan: capturar líneas pre-partido (suficientemente eficiente como para que el retail no saque mucho), arbitraje de certeza al final del juego (territorio de 0.99-trap).
Soccer: ligas internacionales vs. ligas de clubes
Soccer se divide en tres niveles aproximados en Polymarket.
- Top European leagues (EPL tag 739, La Liga, Bundesliga, Serie A) - volumen moderado, books profundos en partidos grandes. Estrategias de bot similares a NBA.
- Champions League / Europa League (UCL tag 2186) - volumen pico en fases eliminatorias. Los books son más profundos desde octavos de final en adelante.
- International / smaller leagues (Saudi Pro League, MLS, J-League) - books delgados, spreads grandes. En general, no son territorio para bots.
El scoring discreto del soccer (0-1 goles son eventos enormes) lo hace distinto del flujo continuo de NBA. El patrón de bot para soccer es: estar del lado correcto antes de que entre un gol, salir rápido después de que ocurra.
Tennis (tag 864): cadencia de torneos
Tag de tennis 864. Los circuitos ATP y WTA juegan 11 meses al año con los Grand Slams en ene (Australian Open), may-jun (French Open), jul (Wimbledon) y ago-sep (US Open). El volumen se concentra en esas cuatro semanas más la serie Masters 1000.
Tennis tiene las ladder de precio en vivo más limpias de cualquier deporte (capítulo 15). Los precios a mitad de partido siguen curvas predecibles según estados de set y break. Un bot con un modelo de ladder de precio específico para tennis puede detectar mispricing en tiempo real.
Ventanas tranquilas: entre Grand Slams, en semanas con solo torneos ATP 250 / ATP 500, los books son muy delgados. Pausa el bot o cámbiate a otro deporte durante esos periodos.
Fuentes de edge que sobreviven
En los cuatro deportes, los edges que sobreviven con el tiempo son:
- Pre-game line shop contra el número de una casa más afilada (Pinnacle, Betfair). Cuando Polymarket discrepa con una sharp book por más de 3c, fade a Polymarket.
- In-play overreaction a una sola jugada (interception, injury, momentum shift). Espera 30-60 segundos después de la jugada, y fade si el mercado se pasó.
- Late-game heavy favorites at 0.85-0.92 con sizing gestionado por riesgo. Debajo de 0.85 = riesgo real; arriba de 0.92 = la 0.99 trap.
Edges que no sobreviven: análisis técnico puro sobre precios, scraping de sentimiento desde Twitter, efectos estacionales basados en calendario.
Datos en vivo: ESPN, APIs oficiales
Matriz de fuentes de datos para los cuatro deportes.
| Deporte | Primaria | Respaldo | Cadencia de actualización |
|---|---|---|---|
| NFL | ESPN scoreboard | NFL.com feed | ~10s durante el juego |
| NBA | ESPN scoreboard | stats.nba.com | ~10s durante el juego |
| Soccer (EPL/UCL) | ESPN scoreboard | SofaScore | ~15-30s |
| Tennis (ATP/WTA) | ESPN scoreboard | tennis.com live | ~30s (a nivel de point) |
ESPN es gratis y confiable para los cuatro. Para actualizaciones de menos de 10s, paga un feed especializado (StatsPerform, GeniusSports) - pero la mejora marginal de latencia rara vez justifica el costo para retail.
Bot de muestra: capturador de líneas pre-partido
Referencia: pseudocódigo de capturador de líneas pre-partido.
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)
Advertencias: las APIs de Pinnacle / Betfair requieren cuentas; no son gratis. Sin una referencia sharp, capturar líneas se reduce a opinión contra opinión, y eso no es territorio para bots.





