מדריך Bot של Polymarket · פרק 15 מתוך 32
בוטים של microstructure בספורט ב־Polymarket: יתרון בזמן משחק, mispricing מונע־תוצאה, תגית ה־NBA (745) ותגית ה־Tennis (864), מקורות נתונים חיים, ודפוסי execution לשווקי ספורט בתדירות גבוהה.
מה מכסה הפרק הזה
שווקי ספורט הם הסגמנט הלא־פוליטי הפעיל ביותר באופן עקבי ב־Polymarket. הבוטים שעובדים מתחלקים לשתי קטגוריות ברורות: בוטי pre-game שתופסים את הקו ברגע שהוא נקבע, ובוטי microstructure בזמן משחק שמגיבים לתנועות ב־order book במהלך המשחק. הפרק הזה מכסה את שניהם, עם מזהי התגים, מקורות הנתונים, ותקציבי ה־latency הרלוונטיים לכל אחד.
שווקי ספורט הם הסגמנט הלא־פוליטי העמוס ביותר ב־Polymarket. דפוס ה־execution שעובד משלב feed חי של תוצאות (ESPN, PandaScore) עם אותות microstructure של ה־order book. הפרק הזה מכסה מה עובד במיוחד עבור NFL, NBA, כדורגל וטניס, ואיפה esports שונה.
- למה שווקי ספורט ניתנים למסחר
- Pre-game לעומת in-game (בוטים שונים)
- מזהי tag מאומתים (745 NBA, 864 Tennis)
- מקורות נתונים: ESPN, official APIs, on-screen
- תקציב latency ל־in-game
- מלכודת ה־0.99 / 0.01
- קוד: להתחבר ל־games book ולהגיב
למה שווקי ספורט ניתנים למסחר
שווקי ספורט נסגרים בטווחי זמן מוגדרים (שעות עד ימים), יש להם נתוני live ציבוריים, והם מושכים זרימת orders רציפה במהלך המשחקים. שלושת אלה נחוצים כדי ששוק יהיה ניתן למסחר - שווקים פוליטיים חסרים "טווח זמן מוגדר", שווקי מזג אוויר חסרים "זרימה רציפה", וטורנירים אזוטריים חסרים "נתוני live ציבוריים".
אוכלוסיית ה־traders בשווקי ספורט גם מגוונת יותר מאשר, למשל, בשווקי בחירות. מהמרי ספורט מזדמנים מתמחרים באופן רגשי; traders מיודעים מתקנים לכיוון value הוגן לאורך מהלך המשחק. הפער בין השניים הוא היתרון של הבוט.
התפלגות ה־volume אינה אחידה: יום ראשון של NFL יגלגל מאות מיליוני דולרים על פני שווקי הספורט ב־Polymarket; משחק של יום שלישי בערב ב־Saudi Pro League עשוי לעשות פחות מ־$50k. התאימו את האסטרטגיה שלכם למקום שבו באמת יש activity.
Pre-game לעומת in-game (בוטים שונים)
שני עיצובים שונים מהותית של בוט.
Pre-game line-catcher: סורק שווקים שנפתחו זה עתה, מזהה lines מתומחרות לא נכון מול המודל שלכם או מול המספר של venue חד יותר, ומבצע buy ב־FOK. מחזיק עד ל־in-play, ולעיתים עד ההכרעה. מהירות: דקות ולא שניות. יתרון: מודל + line-shopping.
In-game microstructure: מתחבר ל־WebSocket של ה־order book של משחק חי, מגיב לאותות חוסר איזון + אירועי score בתוך שניות. מהירות: שניות ולא דקות. יתרון: latency + קריאת זרימת orders.
לשניים כמעט אין code משותף. יש להם פרופילי סיכון שונים, מקורות נתונים שונים, ואסטרטגיות יציאה שונות. בוט שמנסה לעשות את שניהם בסוף לא עושה אף אחד מהם טוב; בחרו אחד.
מזהי tag מאומתים (745 NBA, 864 Tennis)
מזהי tag לייצור שאומתו במאי 2026 עבור קטגוריות הספורט המרכזיות. השתמשו בהם כדי לסנן קריאות ל־/events ביעילות.
| ספורט / ליגה | Tag ID | tag slug | הערות |
|---|---|---|---|
| NBA | 745 | nba | ה־volume הגבוה ביותר אוק׳-יוני |
| NFL | 450 | nfl | שיא בימי א׳/ב׳ ספט׳-פבר׳ |
| Tennis (all) | 864 | tennis | כל השנה, לפי קצב הטורנירים |
| Soccer (general) | 1059 | soccer | לשלב עם תתי־התגים למטה |
| EPL | 739 | epl | |
| UCL | 2186 | uefa-champions-league | |
| Esports (all) | 702 | esports | LoL+CS2+Valorant+Dota |
| MLB | 1245 | mlb | שיא אפר׳-אוק׳ |
| NHL | 823 | nhl | שיא אוק׳-יוני |
מזהי tag נשארים יציבים לאורך השנים. מתווספים tags חדשים (Saudi Pro League, IPL) אבל tags ישנים לא ממוספרים מחדש.
מקורות נתונים: ESPN, official APIs, on-screen
עבור ספורט מסורתי, ה־API החינמי של לוח התוצאות של ESPN מכסה את כל מה שצריך: scores, period/clock, win-probability, ולעיתים גם מיקום הזריקה. לא נדרש key; יש rate limit רק ברמת ה־IP. דפוס ה־endpoint: https://site.api.espn.com/apis/site/v2/sports/<sport>/<league>/scoreboard.
עבור esports, ל־ESPN אין coverage. אפשרויות: PandaScore ($30-60 לחודש, ה־industry standard), HLTV (ל־CS2 בלבד, ניתן ל־scrape, ללא API), Liquipedia (מתוחזקת על ידי הקהילה, ניתן ל־scrape, קצב עדכון איטי יותר).
feeds על המסך (תשלום על stream טלוויזיוני וקריאת scorebug באמצעות OCR) עובדים, אבל הם כבדים תפעולית. מומלץ רק אם יש לכם אסטרטגיה שדורשת עדכונים בפחות מ־3 שניות בספורט שאין לו API שמכסה אותו בזמן אמת.
תקציב latency ל־in-game
תקציב ה־latency מקצה לקצה עבור בוט reactive בזמן משחק.
- אירוע score קורה: t=0
- ה־feed המקורי משתקף: t+3-15 שניות (ESPN: כ־10 שניות; PandaScore: כ־3 שניות)
- הבוט שלכם קורא את ה־feed: t+10-16 שניות
- הבוט מחליט על פעולה: +50ms
- הזמנת FOK נשלחת: +200-500ms
- מתבצע match ב־CLOB: +300-1000ms (רשת + matching)
סה"כ: 11-17 שניות. הפירמות המקצועיות המהירות ביותר משיגות 3-5 שניות מקצה לקצה עם feeds פרימיום בתשלום ו־VPS באותה מיקום גאוגרפי. בוטים קמעונאיים שרצים על hosts רגילים ו־ESPN חינמי יהיו בקצה האיטי יותר.
אסטרטגיות שדורשות פחות מ־5 שניות אינן ישימות לקמעונאות. אסטרטגיות שכן עובדות בחלון של 10-17 שניות הן: תפיסת line אחרי score, הימור נגד תגובת־יתר, ועסקאות certainty בשלב מאוחר של המשחק.
מלכודת ה־0.99 / 0.01
כישלון ה־in-play הנפוץ ביותר של Bot ספורט: לקנות את המועמד המוביל הכבד ב־0.99 כשנשארה דקה, בציפייה לרווח קל של +1¢. שלוש סיבות לכך שזה נכשל.
ראשית, ההסתברות המשתמעת של 1% של האנדרדוג אינה אפס - קאמבקים מאוחרים קורים בתדירות שאינה זניחה. ניצחון "ודאי" ב־99.5%, שמבוצע 200 פעמים, מייצר הפסד אחד בגודל פוזיציה מלא.
שנית, ה־spread ב־0.99/0.01 אומר שאתם משלמים 99 סנט למניה, מרוויחים סנט אחד בהצלחה, ומפסידים 99 סנט בהיפוך נדיר. יחס סיכון-תגמול אכזרי.
שלישית, Bot שמשתמש ב־GTC sell ב־0.999 כמעט אף פעם לא יתמלא - אין קונים במחיר הזה. הפוזיציה פשוט נשארת עד ההכרעה. אם היא מנצחת, קיבלתם סנט אחד. אם ההיפוך קורה, אתם מפסידים 99 סנט.
המלכודת הזו היא כסף אמיתי שאבד על ידי בונים שלא עשו את החשבון. התרחקו משווקים מתומחרים ב־0.95+ אלא אם האסטרטגיה שלכם בנויה במיוחד לפרופיל redemption-arbitrage.
קוד: להתחבר ל־games book ולהגיב
Reference: להתחבר ל־WebSocket של משחק NBA מסוים, לרשום עדכוני book, ולשלוח 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()
תוספות לייצור: cooldown בין שליחות, מגבלת inventory לכל token, וכיבוי על book stale (אין הודעה במשך 30 שניות).





