Polymarket Bot Tutorial · Capitolo 15 di 32
Bot di microstruttura sportiva su Polymarket: edge in-game, mispricing guidato dal punteggio, tag NBA (745) e Tennis (864), fonti dati live e pattern di esecuzione per mercati sportivi ad alta frequenza.
Cosa copre questo capitolo
I mercati sportivi sono il segmento non-politico più consistentemente attivo su Polymarket. I bot che funzionano cadono in due bucket puliti: pre-game line-catcher che tradano una volta che la linea è impostata, e bot di microstruttura in-game che reagiscono al movimento dell'order book durante il gioco. Questo capitolo copre entrambi con gli ID tag specifici, le fonti dati e i budget di latenza applicabili a ciascuno.
I mercati sportivi sono il segmento non-politico più trafficato su Polymarket. Il pattern di esecuzione che funziona combina un feed di punteggio live (ESPN, PandaScore) con segnali di microstruttura dell'order book. Questo capitolo copre cosa funziona specificamente per NFL, NBA, calcio e tennis, e dove gli esport differiscono.
Questo è il capitolo 15 della nostra serie in 32 parti sulla costruzione di un trading bot per Polymarket. Trattiamo l'argomento in profondità nelle sezioni qui sotto. Il corpo di ogni sezione viene scritto e rilasciato capitolo dopo capitolo; le risposte FAQ e i riferimenti sono già completi e riflettono l'esperienza di produzione del nostro trader interno.
- Perché i mercati sportivi sono tradabili
- Pre-game vs in-game (bot diversi)
- ID tag verificati (745 NBA, 864 Tennis)
- Fonti dati: ESPN, API ufficiali, on-screen
- Budget di latenza per l'in-game
- La trappola 0,99 / 0,01
- Codice: sottoscriviti al book di una partita e reagisci
Perché i mercati sportivi sono tradabili
I mercati sportivi si chiudono in timeframe definiti (ore o giorni), hanno dati live pubblici e attraggono flusso di ordini continuo durante le partite. Tutti e tre sono necessari per un mercato tradabile — i mercati politici mancano del "timeframe definito", i mercati meteo mancano del "flusso continuo", i tornei oscuri mancano dei "dati live pubblici".
Anche la popolazione di trader sui mercati sportivi è più diversificata che, diciamo, sui mercati elettorali. Gli scommettitori sportivi casual prezzano emotivamente; i trader informati correggono verso il fair value nel corso della partita. Il gap tra i due è l'edge del bot.
La distribuzione del volume è disomogenea: una domenica NFL ruoterà centinaia di milioni di dollari sui mercati sportivi Polymarket; una partita di Saudi Pro League di martedì sera potrebbe fare meno di 50k $. Dimensiona la strategia dove l'azione è davvero.
Pre-game vs in-game (bot diversi)
Due design di bot fondamentalmente diversi.
Pre-game line-catcher: scansiona i mercati appena aperti, identifica linee mispriced contro il tuo modello o contro il numero di una venue più sharp, piazza un buy FOK. Tieni nell'in-play, a volte fino alla resolution. Velocità: minuti, non secondi. Edge: modello + line-shopping.
Microstruttura in-game: sottoscriviti al WebSocket dell'order book di una partita live, reagisci ai segnali di imbalance + eventi di punteggio entro secondi. Velocità: secondi, non minuti. Edge: latenza + lettura del flusso di ordini.
I due condividono quasi nessun codice. Hanno profili di rischio diversi, fonti dati diverse, strategie di uscita diverse. Un bot che prova a fare entrambi finisce per fare nessuno bene; scegline uno.
ID tag verificati (745 NBA, 864 Tennis)
ID tag di produzione verificati a maggio 2026 per le principali categorie sportive. Usali per filtrare le chiamate /events in modo efficiente.
| Sport / Lega | Tag ID | Tag slug | Note |
|---|---|---|---|
| NBA | 745 | nba | volume più alto ott-giu |
| NFL | 450 | nfl | picco dom/lun set-feb |
| Tennis (tutti) | 864 | tennis | tutto l'anno, cadenza dei tornei |
| Calcio (generale) | 1059 | soccer | combina con sub-tag qui sotto |
| EPL | 739 | epl | |
| UCL | 2186 | uefa-champions-league | |
| Esport (tutti) | 702 | esports | LoL+CS2+Valorant+Dota |
| MLB | 1245 | mlb | picco apr-ott |
| NHL | 823 | nhl | picco ott-giu |
Gli ID tag sono stabili attraverso gli anni. Nuovi tag vengono aggiunti (Saudi Pro League, IPL) ma i tag vecchi non vengono rinumerati.
Fonti dati: ESPN, API ufficiali, on-screen
Per gli sport tradizionali l'API gratuita di ESPN scoreboard copre tutto ciò di cui hai bisogno: punteggi, periodo/clock, win-probability, a volte la location dei tiri. Nessuna key richiesta; rate-limited solo a livello IP. Pattern di endpoint: https://site.api.espn.com/apis/site/v2/sports/<sport>/<league>/scoreboard.
Per gli esport, ESPN non ha copertura. Opzioni: PandaScore (30-60 $/mese, lo standard di settore), HLTV (solo CS2, scrapeabile, niente API), Liquipedia (mantenuto dalla community, scrapeabile, cadenza di update più lenta).
I feed on-screen (pagare uno stream TV e fare OCR sullo scorebug) funzionano ma sono operativamente pesanti. Raccomandato solo se hai una strategia che richiede update sub-3 secondi su uno sport che nessuna API copre in tempo reale.
Budget di latenza per l'in-game
Il budget di latenza end-to-end per un bot reattivo in-game.
- Evento di punteggio accade: t=0
- Il feed sorgente lo riflette: t+3-15s (ESPN: ~10s; PandaScore: ~3s)
- Il tuo bot legge il feed: t+10-16s
- Il bot decide l'azione: +50ms
- Ordine FOK piazzato: +200-500ms
- Matchato al CLOB: +300-1000ms (rete + matching)
Totale: 11-17 secondi. Le firm professionali più veloci raggiungono 3-5 secondi end-to-end con feed premium pagati e VPS co-located. I bot retail su host standard ed ESPN gratuito sono dalla parte più lenta.
Le strategie che richiedono sub-5s non sono praticabili per il retail. Le strategie che funzionano nella finestra 10-17s sono: line-catching dopo un punteggio, fading delle overreaction, giocate di certezza fine-partita.
La trappola 0,99 / 0,01
Il fallimento di bot sportivi in-play più comune: comprare il favorito pesante a 0,99 con un minuto rimasto, aspettandosi un facile +1¢. Tre ragioni per cui fallisce.
Primo, la probabilità implicita dell'1% del underdog non è zero — le rimonte tardive accadono con frequenza non triviale. Una vittoria certa al 99,5%, giocata 200 volte, produce una perdita per l'intera position size.
Secondo, lo spread a 0,99/0,01 significa che paghi 99c per share, vinci 1c sul successo, perdi 99c sul raro reversal. Il rapporto risk-reward è brutale.
Terzo, il bot che usa un GTC sell a 0,999 raramente sarà riempito — non ci sono buyer a quel prezzo. La posizione cavalca fino alla resolution. Se vince, hai preso 1c. Se accade il reversal, perdi 99c.
La trappola è denaro reale perso da builder che non hanno fatto la matematica. Stai fuori dai mercati prezzati a 0,95+ a meno che la tua strategia non sia costruita specificamente per il profilo di arbitraggio-redenzione.
Codice: sottoscriviti al book di una partita e reagisci
Riferimento: sottoscriviti al WebSocket di una specifica partita NBA, logga update del book, scatena FOK su segnale di imbalance.
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()
Aggiunte di produzione: cooldown tra fire, cap di inventario per token, kill su book stantio (nessun messaggio in 30s).











