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 / LeagueTag IDTag slugNotes
NBA745nbahighest volume Oct-Jun
NFL450nflpeak Sun/Mon Sep-Feb
Tennis (all)864tennisyear-round, tournament cadence
Soccer (general)1059soccercombine with sub-tags below
EPL739epl
UCL2186uefa-champions-league
Esports (all)702esportsLoL+CS2+Valorant+Dota
MLB1245mlbpeak Apr-Oct
NHL823nhlpeak 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).

Часто задаваемые вопросы

Какие sports tags наиболее активны на Polymarket?
NBA (tag_id 745), Tennis (tag_id 864) и soccer (в зависимости от competition) лидируют по 24h volume в свои сезоны. Мы подтверждали NBA и Tennis tag IDs в production - остальные следует проверять через endpoint gamma /tags, прежде чем полагаться на них.
Можно ли прибыльно ботить in-game sports markets?
Возможно, но это сложно. Edge реален (live scoreline часто mispriced на 30-90 секунд), но другие bots тоже смотрят за рынком. Лучшие результаты, которые мы видели, дают сочетания быстрого live-score data source с простыми правилами («opponent scored, market hasnt moved yet, buy»). Pure stat-arb без data source проигрывает более быстрым конкурентам.
Где взять live sports data?
ESPN.com имеет unofficial JSON endpoints, которые возвращают live scores - этого достаточно для многих strategies. Official APIs (NBA Stats API, NFL public endpoints) надежнее, но медленнее. Twitter accounts beat reporters дают text, но требуют LLM parsing. Ни один из вариантов не является HFT-grade; все они «достаточно быстрые» для retail.
Что такое ловушка 0.99 / 0.01?
Когда sports market стоит 99 cents YES (очень вероятно победит), почти не остается upside и move на 1 cent может стереть ожидаемую прибыль за месяц. Многие bots попадаются, покупая по 0.99 в погоне за последним центом и получают удар, когда неожиданный event снижает цену до 0.85. Жесткое правило: не покупайте выше примерно 0.95, если math expected value не безупречен.
Как Polymarket sports сравнивается с traditional sportsbooks?
Нет house edge на spread (против примерно 5-10% vig у FanDuel/DraftKings), но liquidity тоньше, а spreads могут быть шире. Polymarket особенно хорош для events, которые traditional books недооценивают - international tournaments, esports, niche markets. Для mainstream NFL/NBA traditional books более liquid, но дороже по vig.
Может ли мой bot торговать сразу на нескольких sports markets?
Да - и так и нужно делать. Sports microstructure лучше всего работает как portfolio из 5-20 одновременных games. Per-game position cap (например, 50 USD), portfolio cap (например, 500 USD) и uncorrelated exposure across games. Концентрация на одной игре максимизирует variance.