Polymarket Bot Tutorial · Hoofdstuk 15 van 32
Sport-microstructuur bots op Polymarket: in-game edge, scoreline-driven mispricing, de NBA tag (745) en Tennis tag (864), live data-bronnen en executie-patronen voor high-frequency sport-markten.
Wat dit hoofdstuk behandelt
Sport-markten zijn het meest consistent actieve niet-politieke segment op Polymarket. De bots die werken vallen in twee schone buckets: pre-game line-catchers die traden zodra de line is gezet en in-game microstructuur-bots die reageren op order-book beweging tijdens spel. Dit hoofdstuk behandelt beide met de specifieke tag-IDs, data-bronnen en latency-budgets die op elk van toepassing zijn.
Sport-markten zijn het drukste niet-politieke segment op Polymarket. Het executie-patroon dat werkt combineert een live-score feed (ESPN, PandaScore) met order-book microstructuur-signalen. Dit hoofdstuk behandelt wat werkt voor NFL, NBA, voetbal en tennis specifiek en waar esports verschilt.
Dit is hoofdstuk 15 van onze 32-delige serie over het bouwen van een Polymarket trading bot. We behandelen het onderwerp in detail in de secties hieronder. De body content voor elke sectie wordt geschreven en hoofdstuk-per-hoofdstuk uitgerold; FAQ-antwoorden en referenties zijn al compleet en weerspiegelen production-ervaring van het draaien van onze eigen trader.
- Waarom sport-markten tradeable zijn
- Pre-game vs in-game (verschillende bots)
- Geverifieerde tag-IDs (745 NBA, 864 Tennis)
- Data-bronnen: ESPN, officiële API's, on-screen
- Latency-budget voor in-game
- De 0,99 / 0,01 valstrik
- Code: abonneer op een game-book en reageer
Waarom sport-markten tradeable zijn
Sport-markten clearen in gedefinieerde timeframes (uren tot dagen), hebben publieke live data en trekken continue order flow tijdens wedstrijden. Alle drie zijn nodig voor een tradeable markt — politieke markten missen "gedefinieerd timeframe", weer-markten missen "continue flow", obscure toernooien missen "publieke live data".
De trader-populatie op sport-markten is ook diverser dan op, bijvoorbeeld, verkiezingsmarkten. Casual sport-gokkers prijzen emotioneel; informed traders corrigeren naar fair value tijdens de loop van een wedstrijd. De gap tussen de twee is de bot-edge.
Volume-distributie is oneven: een NFL-zondag zal honderden miljoenen dollars roteren over Polymarket sport-markten; een dinsdagavond Saudi Pro League-wedstrijd zou onder 50k $ kunnen doen. Dimensioneer je strategie naar waar de actie daadwerkelijk is.
Pre-game vs in-game (verschillende bots)
Twee fundamenteel verschillende bot-designs.
Pre-game line-catcher: scan markten die net openden, identificeer mis-prijsde lines tegen je model of tegen het getal van een scherpere venue, plaats een FOK buy. Houd tot in-play, soms tot resolution. Snelheid: minuten-geen-seconden. Edge: model + line-shopping.
In-game microstructuur: abonneer op het WebSocket order book van een live game, reageer op imbalance-signalen + score-events binnen seconden. Snelheid: seconden-geen-minuten. Edge: latency + lezen van order flow.
De twee delen bijna geen code. Ze hebben verschillende risicoprofielen, verschillende data-bronnen, verschillende exit-strategieën. Een bot die beide probeert te doen eindigt met niet één goed doen; kies er één.
Geverifieerde tag-IDs (745 NBA, 864 Tennis)
Productie tag-IDs geverifieerd mei 2026 voor grote sport-categorieën. Gebruik deze om /events calls efficiënt te filteren.
| Sport / League | Tag ID | Tag slug | Notes |
|---|---|---|---|
| NBA | 745 | nba | hoogste volume okt-jun |
| NFL | 450 | nfl | piek zo/ma sep-feb |
| Tennis (all) | 864 | tennis | jaar-rond, toernooi-cadens |
| Voetbal (algemeen) | 1059 | soccer | combineer met sub-tags hieronder |
| EPL | 739 | epl | |
| UCL | 2186 | uefa-champions-league | |
| Esports (all) | 702 | esports | LoL+CS2+Valorant+Dota |
| MLB | 1245 | mlb | piek apr-okt |
| NHL | 823 | nhl | piek okt-jun |
Tag-IDs zijn stabiel over jaren. Nieuwe tags worden toegevoegd (Saudi Pro League, IPL) maar oude tags worden niet hernummerd.
Data-bronnen: ESPN, officiële API's, on-screen
Voor traditionele sport dekt de gratis ESPN scoreboard API alles wat je nodig hebt: scores, period/clock, win-probability, soms shot location. Geen key vereist; rate-limited alleen op IP-niveau. Endpoint-patroon: https://site.api.espn.com/apis/site/v2/sports/<sport>/<league>/scoreboard.
Voor esports heeft ESPN geen dekking. Opties: PandaScore (30-60 $/mo, de industry standard), HLTV (alleen CS2, scrapeable, geen API), Liquipedia (community-onderhouden, scrapeable, langzamer update-cadens).
On-screen feeds (betalen voor een TV-stream en OCR-lezen van de scorebug) werken maar zijn operationeel zwaar. Aanbevolen alleen als je een strategie hebt die sub-3-seconde updates vereist op een sport die geen API real-time dekt.
Latency-budget voor in-game
Het end-to-end latency-budget voor een in-game reactieve bot.
- Score event gebeurt: t=0
- Source feed reflecteert: t+3-15s (ESPN: ~10s; PandaScore: ~3s)
- Je bot leest de feed: t+10-16s
- Bot beslist actie: +50ms
- FOK order geplaatst: +200-500ms
- Matched bij CLOB: +300-1000ms (netwerk + matching)
Totaal: 11-17 seconden. De snelste professionele firms halen 3-5 seconden end-to-end met paid premium feeds en co-located VPS. Retail bots op standaard hosts en gratis ESPN zitten aan de tragere kant.
Strategieën die sub-5s vereisen zijn niet levensvatbaar voor retail. Strategieën die werken in 10-17s venster zijn: line-catching na een score, fading van overreacties, late-game certainty plays.
De 0,99 / 0,01 valstrik
De meest voorkomende in-play sport-bot failure: de zware favoriet kopen op 0,99 met één minuut over, verwachtend gemakkelijke +1¢. Drie redenen waarom het faalt.
Eerst, de 1% geïmpliceerde probability van de underdog is geen nul — late comebacks gebeuren met niet-triviale frequentie. Een 99,5% zekere win, 200 keer gespeeld, produceert één verlies voor volledige position size.
Tweede, de spread op 0,99/0,01 betekent dat je 99c per share betaalt, 1c wint bij succes, 99c verliest op het zeldzame omkeren. Risk-reward is bruut.
Derde, de bot die GTC sell op 0,999 gebruikt zal zelden vullen — er zijn geen kopers op die prijs. De positie rijdt tot resolution. Als het wint, krijg je 1c. Als de omkeer gebeurt, verlies je 99c.
De valstrik is echt geld verloren door builders die de math niet runden. Blijf weg uit markten geprijsd 0,95+ tenzij je strategie specifiek is gebouwd voor het redemption-arbitrage profiel.
Code: abonneer op een game-book en reageer
Referentie: abonneer op het WebSocket van een specifieke NBA-game, log book-updates, vuur FOK op imbalance-signaal.
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()
Productie-toevoegingen: cooldown tussen fires, per-token inventory cap, kill op stale book (geen message in 30s).











