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 / 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 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 ثانیه هیچ پیامی نیاید).





