Polymarket Bot Tutorial · Chapter 15 of 32

ربات‌های microstructure ورزشی در Polymarket: edge در حین بازی، mispricing ناشی از scoreline، tag NBA (745) و Tennis tag (864)، منابع داده زنده، و الگوهای اجرا برای بازارهای ورزشی high-frequency.

این فصل چه چیزهایی را پوشش می‌دهد

بازارهای ورزشی فعال‌ترین بخش غیرسیاسی در Polymarket هستند. ربات‌هایی که جواب می‌دهند به دو دسته کاملاً مشخص تقسیم می‌شوند: pre-game line-catcherهایی که بعد از set شدن line معامله می‌کنند، و in-game microstructure botهایی که در طول بازی به حرکت order book واکنش نشان می‌دهند. این فصل هر دو را همراه با tag IDهای مشخص، منابع داده، و latency budgetهای مربوط به هرکدام پوشش می‌دهد.

بازارهای ورزشی شلوغ‌ترین بخش غیرسیاسی در Polymarket هستند. الگوی اجراییِ مؤثر، یک live-score feed (ESPN، PandaScore) را با سیگنال‌های microstructure order book ترکیب می‌کند. این فصل مشخصاً توضیح می‌دهد چه چیزی برای NFL، NBA، soccer، و tennis کار می‌کند، و esports چه تفاوتی دارد.

  • چرا بازارهای ورزشی tradeable هستند
  • pre-game در برابر in-game (ربات‌های متفاوت)
  • Verified tag IDها (745 NBA، 864 Tennis)
  • منابع داده: ESPN، official APIs، on-screen
  • Latency budget برای in-game
  • دام 0.99 / 0.01
  • Code: subscribe به یک games book و واکنش نشان دادن

چرا بازارهای ورزشی tradeable هستند

بازارهای ورزشی در بازه‌های زمانی مشخص (از چند ساعت تا چند روز) settle می‌شوند، داده زنده عمومی دارند، و در طول بازی‌ها order flow پیوسته جذب می‌کنند. هر سه برای tradeable بودن یک market ضروری‌اند - بازارهای سیاسی "بازه زمانی مشخص" را ندارند، بازارهای آب‌وهوا "flow پیوسته" را ندارند، تورنمنت‌های گمنام "داده زنده عمومی" را ندارند.

جمعیت traderها در بازارهای ورزشی هم متنوع‌تر از مثلاً بازارهای انتخاباتی است. bettors معمولیِ ورزشی با احساس قیمت‌گذاری می‌کنند؛ traderهای آگاه در طول بازی قیمت را به سمت fair value اصلاح می‌کنند. فاصله بین این دو، edge ربات است.

توزیع volume یکنواخت نیست: یک NFL Sunday می‌تواند صدها میلیون دلار را در بازارهای ورزشی Polymarket جابه‌جا کند؛ یک مسابقه Tuesday-night Saudi Pro League شاید کمتر از 50 هزار دلار حجم داشته باشد. استراتژی خود را متناسب با جایی تنظیم کنید که واقعاً activity آنجاست.

pre-game در برابر in-game (ربات‌های متفاوت)

دو طراحی کاملاً متفاوت برای bot.

Pre-game line-catcher: بازارهایی را که تازه باز شده‌اند اسکن می‌کند، lineهای mis-priced را در برابر model شما یا در برابر number یک venue sharp‌تر شناسایی می‌کند، و یک FOK buy ثبت می‌کند. نگهداری تا in-play و گاهی تا resolution. سرعت: دقیقه‌ای، نه ثانیه‌ای. edge: model + line-shopping.

In-game microstructure: به WebSocket order book یک بازی زنده subscribe می‌شود و در عرض چند ثانیه به imbalance signalها + score eventها واکنش می‌دهد. سرعت: ثانیه‌ای، نه دقیقه‌ای. edge: latency + خواندن order flow.

این دو تقریباً هیچ کدی را با هم share نمی‌کنند. risk profile متفاوت دارند، data source متفاوت دارند، و exit strategy متفاوت. رباتی که بخواهد هر دو را انجام دهد معمولاً هیچ‌کدام را خوب انجام نمی‌دهد؛ یکی را انتخاب کنید.

Verified tag IDها (745 NBA، 864 Tennis)

tag IDهای production که در مه 2026 برای دسته‌های اصلی ورزشی verified شده‌اند. از این‌ها برای فیلتر کردن مؤثر callهای /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 IDها در طول سال‌ها ثابت می‌مانند. tagهای جدید اضافه می‌شوند (Saudi Pro League، IPL)، اما tagهای قدیمی renumber نمی‌شوند.

منابع داده: ESPN، official APIs، on-screen

برای sports سنتی، API رایگان scoreboard در ESPN تمام چیزی را که نیاز دارید پوشش می‌دهد: score، period/clock، win-probability، و گاهی shot location. نیاز به key ندارد؛ فقط در سطح IP rate limit دارد. الگوی endpoint: https://site.api.espn.com/apis/site/v2/sports/<sport>/<league>/scoreboard.

برای esports، ESPN هیچ پوششی ندارد. گزینه‌ها: PandaScore (30-60 دلار در ماه، استاندارد industry)، HLTV (فقط CS2، قابل scrape، بدون API)، Liquipedia (community-maintained، قابل scrape، با cadence به‌روزرسانی کندتر).

feedهای on-screen (پرداخت برای یک TV stream و OCR خواندن scorebug) کار می‌کنند، اما از نظر عملیاتی سنگین هستند. فقط اگر استراتژی‌ای دارید که به به‌روزرسانی‌های زیر 3 ثانیه روی ورزشی نیاز دارد که هیچ APIای آن را در real time پوشش نمی‌دهد، توصیه می‌شوند.

Latency budget برای in-game

Latency budget end-to-end برای یک 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
  • در CLOB match می‌شود: +300-1000ms (network + matching)

جمع کل: 11-17 ثانیه. سریع‌ترین firmهای حرفه‌ای با feedهای premium پولی و VPS هم‌مکان‌شده، end-to-end به 3-5 ثانیه می‌رسند. botهای retail که روی hostهای استاندارد و ESPN رایگان اجرا می‌شوند در انتهای کندتر این طیف قرار دارند.

استراتژی‌هایی که به زیر 5 ثانیه نیاز دارند برای retail viable نیستند. استراتژی‌هایی که در بازه 10-17 ثانیه خوب کار می‌کنند عبارت‌اند از: line-catching بعد از score، fade کردن overreactionها، و late-game certainty playها.

دام 0.99 / 0.01

رایج‌ترین شکست in-play در botهای ورزشی: خرید favorite سنگین در 0.99 با یک دقیقه مانده، با امید به +1¢ آسان. سه دلیل برای شکست آن.

اول، آن 1% احتمال ضمنی برای underdog صفر نیست - comebackهای دیرهنگام با frequency غیرقابل‌چشم‌پوشی رخ می‌دهند. یک برد 99.5% قطعی، اگر 200 بار بازی شود، یک باخت در اندازه کامل position تولید می‌کند.

دوم، spread در 0.99/0.01 یعنی شما هر share را 99 سنت می‌خرید، در صورت موفقیت 1 سنت سود می‌کنید، و در reversal نادر 99 سنت ضرر می‌دهید. نسبت ریسک به بازده brutal است.

سوم، botی که با GTC sell روی 0.999 کار می‌کند به‌ندرت fill می‌شود - در آن قیمت buyerی وجود ندارد. position تا resolution ادامه پیدا می‌کند. اگر win کند، 1 سنت گرفته‌اید. اگر reversal رخ دهد، 99 سنت از دست می‌دهید.

این دام، پول واقعیِ از دست‌رفته توسط builderهایی است که محاسبات را انجام نداده بودند. از بازارهای با قیمت 0.95+ دور بمانید مگر اینکه استراتژی شما مشخصاً برای profile redemption-arbitrage ساخته شده باشد.

Code: subscribe به یک games book و واکنش نشان دادن

Reference: به WebSocket یک بازی خاص NBA subscribe شوید، به‌روزرسانی‌های book را log کنید، و در صورت imbalance signal یک FOK بفرستید.

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: cooldown بین fireها، inventory cap برای هر token، kill روی stale book (اگر 30 ثانیه هیچ پیامی نیاید).

سؤالات متداول

کدام tagهای ورزشی در Polymarket فعال‌تر هستند؟
NBA (tag_id 745)، Tennis (tag_id 864)، و soccer (بسته به competition متفاوت است) در طول فصل‌های خودشان volume 24 ساعته را رهبری می‌کنند. NFL هر هفته در فصل عادی و playoffs spike می‌زند. ما tag IDهای NBA و Tennis را در production verified کرده‌ایم - بقیه باید قبل از اتکا، از طریق endpoint gamma /tags بررسی شوند.
آیا می‌توانم روی marketهای ورزشی in-game به‌صورت profitable bot بزنم؟
احتمالاً - اما سخت است. edge واقعی است (live scoreline اغلب برای 30 تا 90 ثانیه mispriced می‌ماند) اما botهای دیگر هم در حال نگاه کردن هستند. بهترین نتیجه‌هایی که دیده‌ایم از ترکیب یک live-score data source سریع با ruleهای ساده به‌دست آمده‌اند ("حریف score کرد، market هنوز حرکت نکرده، بخر"). Pure stat-arb بدون data source از competitorهای سریع‌تر شکست می‌خورد.
از کجا live sports data بگیرم؟
ESPN.com endpointهای JSON غیررسمی دارد که score زنده برمی‌گردانند - برای بسیاری از strategyها کافی است. official APIها (NBA Stats API، NFL public endpoints) قابل‌اعتمادتر اما کندترند. حساب‌های Twitter گزارشگران beat reporterها متن می‌دهند اما به parsing با LLM نیاز دارند. هیچ‌کدام در سطح HFT نیستند؛ همگی برای retail به‌اندازه کافی "سریع" هستند.
دام 0.99 / 0.01 چیست؟
وقتی یک market ورزشی روی 99 سنت YES است (یعنی احتمال برد بسیار بالا)، تقریباً هیچ upsideی باقی نمانده و یک حرکت 1 سنتی می‌تواند سود مورد انتظار چند ماهه را پاک کند. بسیاری از botها با خرید در 0.99 و تعقیب آخرین سنت گیر می‌افتند و وقتی یک رخداد غیرمنتظره قیمت را به 0.85 می‌اندازد ضربه می‌خورند. قانون سخت: بالاتر از حدود 0.95 نخرید مگر اینکه محاسبه expected value شما bulletproof باشد.
Polymarket sports نسبت به sportsbookهای سنتی چه تفاوتی دارد؟
روی spread house edge ندارد (در مقایسه با حدود 5-10% vig در FanDuel/DraftKings)، اما liquidity کمتر است و spreadها می‌توانند wider باشند. Polymarket برای رویدادهایی که کتاب‌های سنتی آن‌ها را underprice می‌کنند عالی است - تورنمنت‌های بین‌المللی، esports، بازارهای niche. برای NFL/NBA اصلی، کتاب‌های سنتی liquidity بیشتری دارند اما هزینه vig بالاتر است.
آیا bot من می‌تواند هم‌زمان روی چندین market ورزشی معامله کند؟
بله - و باید هم همین کار را بکند. microstructure ورزشی بهترین عملکرد را به‌صورت یک portfolio از 5 تا 20 بازی هم‌زمان دارد. per-game position cap (مثلاً 50 USD)، portfolio cap (مثلاً 500 USD)، و exposure نامرتبط across games. متمرکز شدن روی یک بازی variance را به حداکثر می‌رساند.