Polymarket Bot Tutorial · Глава 15 из 32
Спортивные microstructure bots на Polymarket: преимущество на ходе игры, mispricing, вызванный счетом, тег NBA (745) и тег Tennis (864), источники live data и паттерны execution для высокочастотных спортивных markets.
Что охватывает эта глава
Спортивные markets - самый стабильно активный неполитический сегмент на Polymarket. Рабочие bots делятся на две четкие категории: pre-game line-catchers, которые торгуют после того, как line уже установлен, и in-game microstructure bots, которые реагируют на движение order-book во время игры. Эта глава охватывает оба подхода с конкретными tag IDs, источниками data и latency budgets, которые применимы к каждому.
Спортивные markets - самый загруженный неполитический сегмент на Polymarket. Рабочий execution pattern сочетает live-score feed (ESPN, PandaScore) с order-book microstructure signals. В этой главе рассматривается, что работает именно для NFL, NBA, soccer и tennis, а также чем отличается esports.
- Почему sports markets можно торговать
- Pre-game vs in-game (разные bots)
- Подтвержденные tag IDs (745 NBA, 864 Tennis)
- Источники data: ESPN, official APIs, on-screen
- Latency budget для in-game
- Ловушка 0.99 / 0.01
- Code: subscribe к games book и react
Почему sports markets можно торговать
Sports markets закрываются в определенные временные рамки (от часов до дней), имеют public live data и привлекают непрерывный order flow во время игр. Все три фактора необходимы для tradeable market - political markets не имеют «определенного временного окна», weather markets не имеют «непрерывного flow», а obscure tournaments не имеют «public live data».
Пул trader-ов на sports markets также более разнообразен, чем, скажем, на election markets. Casual sports bettors оценивают события эмоционально; informed traders в течение игры корректируют цену к fair value. Разница между ними и есть bot edge.
Распределение volume неравномерно: в NFL Sunday через Polymarket sports markets проходит сотни миллионов долларов; матч Saudi Pro League во вторник вечером может дать меньше $50k. Размер strategy нужно подбирать под то, где реально идет action.
Pre-game vs in-game (разные bots)
Два принципиально разных bot design.
Pre-game line-catcher: сканирует markets, которые только что открылись, находит mis-priced lines против вашей model или против number на более sharp venue, размещает FOK buy. Держит позицию до in-play, иногда до resolution. Speed: минуты, а не секунды. Edge: model + line-shopping.
In-game microstructure: подписывается на WebSocket order book live-game, реагирует на imbalance signals + score events в течение секунд. Speed: секунды, а не минуты. Edge: latency + reading order flow.
У этих двух подходов почти нет общего code. У них разные risk profiles, разные источники data, разные exit strategies. Bot, который пытается делать и то и другое, в итоге не делает хорошо ни одно; выберите один.
Подтвержденные tag IDs (745 NBA, 864 Tennis)
Production tag IDs, подтвержденные в мае 2026 для основных спортивных категорий. Используйте их для эффективной фильтрации вызовов /events.
| Sport / League | Tag ID | Tag slug | Notes |
|---|---|---|---|
| NBA | 745 | nba | highest volume Oct-Jun |
| NFL | 450 | nfl | peak Sun/Mon Sep-Feb |
| Tennis (all) | 864 | tennis | year-round, tournament cadence |
| Soccer (general) | 1059 | soccer | combine with sub-tags below |
| EPL | 739 | epl | |
| UCL | 2186 | uefa-champions-league | |
| Esports (all) | 702 | esports | LoL+CS2+Valorant+Dota |
| MLB | 1245 | mlb | peak Apr-Oct |
| NHL | 823 | nhl | peak Oct-Jun |
Tag IDs стабильны из года в год. Новые tags добавляются (Saudi Pro League, IPL), но старым tags не присваивают новые номера.
Источники data: ESPN, official APIs, on-screen
Для традиционных sports бесплатный ESPN scoreboard API покрывает все необходимое: scores, period/clock, win-probability, иногда shot location. API key не нужен; ограничение действует только на уровне IP. Шаблон endpoint: https://site.api.espn.com/apis/site/v2/sports/<sport>/<league>/scoreboard.
Для esports у ESPN нет покрытия. Варианты: PandaScore ($30-60/mo, industry standard), HLTV (только CS2, можно scrape, без API), Liquipedia (поддерживается community, можно scrape, но медленнее cadence обновления).
On-screen feeds (платить за TV stream и читать scorebug через OCR) работают, но operationally тяжелые. Рекомендуются только если у вас есть strategy, требующая обновлений быстрее 3 секунд для sport, у которого нет real-time API.
Latency budget для in-game
End-to-end latency budget для in-game reactive bot.
- Score event происходит: t=0
- Source feed отражает событие: t+3-15s (ESPN: ~10s; PandaScore: ~3s)
- Ваш bot читает feed: t+10-16s
- Bot принимает решение: +50ms
- FOK order размещен: +200-500ms
- Matched at CLOB: +300-1000ms (network + matching)
Итого: 11-17 секунд. Самые быстрые professional firms достигают 3-5 секунд end-to-end с paid premium feeds и co-located VPS. Retail bots, работающие на стандартных hosts и бесплатном ESPN, находятся в более медленном диапазоне.
Strategies, которым нужны sub-5s, не подходят для retail. Strategies, которые работают в окне 10-17s: line-catching after a score, fading overreactions, late-game certainty plays.
Ловушка 0.99 / 0.01
Самый частый failure in-play sports bot: покупка heavy favorite по 0.99 за минуту до конца в надежде на легкие +1¢. Почему это не работает, есть три причины.
Во-первых, 1% implied probability у underdog - это не ноль: поздние comebacks случаются с ненулевой частотой. Win с вероятностью 99.5%, сыгранный 200 раз, даст один loss на весь размер position.
Во-вторых, spread на 0.99/0.01 означает, что вы платите 99¢ за share, зарабатываете 1¢ при успехе и теряете 99¢ при редком reversal. Risk-reward здесь жестокий.
В-третьих, bot, использующий GTC sell на 0.999, почти никогда не исполнится - покупателей по этой цене нет. Position дотягивается до resolution. Если она выигрывает, вы получили 1¢. Если случается reversal, вы теряете 99¢.
Эта ловушка - реальные деньги, потерянные builders, которые не просчитали math. Держитесь подальше от markets с ценой 0.95+ unless ваша strategy специально построена под redemption-arbitrage profile.
Code: subscribe к games book и react
Reference: subscribe к WebSocket конкретной NBA game, log book updates, fire FOK при signal 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()
Production additions: cooldown between fires, per-token inventory cap, kill on stale book (no message in 30s).





