Polymarket Bot Tutorial · Capitolo 25 di 32
Bot per i mercati sportivi su Polymarket: partite NFL settimanali, microstructure del tag NBA (745), soccer (Premier League, Bundesliga, Champions League), tennis (864) - liquidity, edge sources, code patterns.
Cosa copre questo capitolo
NFL, NBA, Soccer e Tennis sono i maggiori volumi sportivi di Polymarket per categoria. Ognuno ha una propria disponibilità di dati, cadenza e profilo di edge. Questo capitolo copre i pattern dei bot specifici per lega e gli ID dei tag su cui farete filter.
Questo è il capitolo 25 della nostra serie in 32 parti sulla costruzione di un Polymarket trading bot. Trattiamo l'argomento in profondità nelle sezioni qui sotto. I contenuti principali di ogni sezione vengono scritti e pubblicati capitolo per capitolo; le risposte FAQ e i riferimenti sono già completi e riflettono l'esperienza production maturata gestendo il nostro trader.
- NFL: cadenza settimanale, peak liquidity la domenica
- NBA (tag 745): microstructure in-game
- Soccer: leghe internazionali vs club league
- Tennis (tag 864): cadenza dei tournament
- Edge sources che resistono
- Dati live: ESPN, official APIs
- Bot di esempio: pre-game line catcher
NFL: cadenza settimanale, peak liquidity la domenica
L'NFL ha il ritmo settimanale più marcato tra tutti gli sport su Polymarket. I market si aprono il martedì dopo le partite della settimana precedente, il line shopping avviene da mercoledì a venerdì, il betting volume raggiunge il picco tra sabato e domenica. La resolution è in genere la domenica sera per le partite early, e il lunedì sera per quella late.
Pattern del bot: line-catcher martedì-mercoledì quando viene fissata l'opening line, in-play la domenica durante il peak volume. Bot diversi per ciascuna finestra. Il market del Monday Night Football spesso ha volume più sottile rispetto alle altre partite — attenzione: il rischio di slippage è più alto sulle entry di piccolo size.
Il picco di volume è il Super Bowl: oltre 50 milioni di dollari tradati su tutti i mercati SB nella settimana della partita. Anche un bot da 100 dollari in quella settimana è rumore irrilevante; a quella scala il market è efficiente.
NBA (tag 745): microstructure in-game
L'NBA è lo sport a maggiore frequenza su Polymarket — 25-30 partite a settimana durante la regular season, 5-15 nei playoffs. L'ID del tag 745 filtra gli eventi NBA-only.
La microstructure in-game funziona sull'NBA perché: (1) ESPN aggiorna i scoreboard ogni ~10s, (2) le partite durano 2,5 ore di action continua, (3) i books di Polymarket per le partite principali restano deep fino al 4th quarter.
La strategia che funziona: subscribe al WS book di una partita + feed ESPN, reagire a imbalance + score events in 10-15 secondi. Le strategie che non funzionano: pre-game line catching (abbastanza efficient da non lasciare molto ai retail), late-game certainty arbitrage (territorio del 0.99 trap).
Soccer: leghe internazionali vs club league
Il soccer su Polymarket si divide in tre livelli approssimativi.
- Top European leagues (EPL tag 739, La Liga, Bundesliga, Serie A) — volume moderato, book deep sulle partite importanti. Le strategie bot sono simili all'NBA.
- Champions League / Europa League (UCL tag 2186) — volume al picco nelle fasi a eliminazione diretta. I book sono più deep dagli ottavi in poi.
- International / leghe minori (Saudi Pro League, MLS, J-League) — book thin, spread ampi. In generale non sono territorio da bot.
Il punteggio discreto del soccer (0-1 goal sono eventi enormi) lo rende diverso dal flusso continuo dell'NBA. Il pattern del bot per il soccer è: stare dalla parte giusta prima che segni un goal, uscire rapidamente dopo che scatta.
Tennis (tag 864): cadenza dei tournament
Tennis tag 864. I tour ATP e WTA giocano 11 mesi all'anno con i Grand Slams a gen (Australian Open), mag-giu (French Open), lug (Wimbledon) e ago-set (US Open). Il volume si concentra in quelle quattro settimane più la serie Masters 1000.
Il tennis ha le price ladder in-play più pulite di qualsiasi sport (chapter 15). I prezzi mid-match seguono curve prevedibili legate agli stati set-and-break. Un bot con un modello di price ladder specifico per il tennis può rilevare mispricing in real time.
Finestre calme: tra i Grand Slams, nelle settimane con soli tornei ATP 250 / ATP 500, i books sono molto thin. In questi periodi mettete in pausa il bot o passate a un altro sport.
Edge sources che resistono
Tra tutti e quattro gli sport, gli edge che resistono nel tempo sono:
- Pre-game line shop contro il number di un venue più sharp (Pinnacle, Betfair). Quando Polymarket è in disaccordo con un sharp book di > 3c, fade Polymarket.
- In-play overreaction a una singola play (interception, injury, momentum shift). Aspettate 30-60 secondi dopo la play, fate fade se il market ha esagerato.
- Late-game heavy favorites a 0.85-0.92 con sizing gestito dal rischio. Sotto 0.85 = rischio reale; sopra 0.92 = il 0.99 trap.
Edge che non resistono: pure technical analysis sui prezzi, sentiment scraping da Twitter, effetti stagionali basati sul calendario.
Dati live: ESPN, official APIs
Matrice delle fonti dati per i quattro sport.
| Sport | Primaria | Backup | Cadenza di aggiornamento |
|---|---|---|---|
| NFL | ESPN scoreboard | NFL.com feed | ~10s durante il play |
| NBA | ESPN scoreboard | stats.nba.com | ~10s durante il play |
| Soccer (EPL/UCL) | ESPN scoreboard | SofaScore | ~15-30s |
| Tennis (ATP/WTA) | ESPN scoreboard | tennis.com live | ~30s (point-level) |
ESPN è gratuito e affidabile per tutti e quattro. Per aggiornamenti sub-10s pagate un feed specializzato (StatsPerform, GeniusSports) — ma il miglioramento marginale della latency raramente giustifica il costo per i retail.
Bot di esempio: pre-game line catcher
Riferimento: pseudocode del pre-game line-catcher.
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)
Avvertenze: le API di Pinnacle / Betfair richiedono account; non sono gratuite. Senza un riferimento sharp, il line-catching si riduce a opinione contro opinione, e non è territorio da bot.











