Polymarket Bot Tutorial · الفصل 15 من 32
روبوتات البنية الدقيقة للأسواق الرياضية على Polymarket: أفضلية أثناء المباراة، سوء التسعير المدفوع بنتيجة اللقاء، وسم NBA (745) ووسم Tennis (864)، ومصادر البيانات الحية، وأنماط التنفيذ لأسواق الرياضة عالية التردد.
ما يغطيه هذا الفصل
الأسواق الرياضية هي الجزء غير السياسي الأكثر نشاطًا باستمرار على Polymarket. الروبوتات التي تنجح تقع في فئتين واضحتين: روبوتات اقتناص الخط قبل المباراة التي تتداول بمجرد تثبيت الخط، وروبوتات البنية الدقيقة أثناء المباراة التي تتفاعل مع حركة دفتر الأوامر خلال اللعب. يغطي هذا الفصل كلا النوعين مع معرّفات الوسوم المحددة، ومصادر البيانات، وحدود التأخير الزمنية المناسبة لكل منهما.
الأسواق الرياضية هي الجزء غير السياسي الأكثر ازدحامًا على Polymarket. نمط التنفيذ الذي ينجح يجمع بين بث نتيجة حيّة (ESPN, PandaScore) وإشارات البنية الدقيقة لدفتر الأوامر. يغطي هذا الفصل ما ينجح في NFL وNBA وكرة القدم والتنس تحديدًا، وأين يختلف esports.
- لماذا يمكن تداول الأسواق الرياضية
- قبل المباراة مقابل أثناء المباراة (روبوتات مختلفة)
- معرّفات الوسوم الموثقة (745 NBA، 864 Tennis)
- مصادر البيانات: ESPN، APIs الرسمية، على الشاشة
- ميزانية التأخير الزمني أثناء المباراة
- فخ 0.99 / 0.01
- Code: الاشتراك في دفتر مباراة والتفاعل
Why sports markets are tradeable
الأسواق الرياضية تُغلق ضمن أطر زمنية محددة (من ساعات إلى أيام)، ولديها بيانات حية عامة، وتجذب تدفق أوامر مستمرًا أثناء المباريات. هذه العناصر الثلاثة كلها ضرورية لسوق قابل للتداول - فالأسواق السياسية تفتقر إلى "الإطار الزمني المحدد"، وأسواق الطقس تفتقر إلى "التدفق المستمر"، والبطولات الغامضة تفتقر إلى "البيانات الحية العامة".
كما أن قاعدة المتداولين في الأسواق الرياضية أكثر تنوعًا من، مثلًا، أسواق الانتخابات. المراهنون العاديون على الرياضة يضعّرون عاطفيًا؛ أما المتداولون المطلعون فيصححون السعر باتجاه القيمة العادلة مع مرور المباراة. والفجوة بين الاثنين هي أفضلية الروبوت.
توزيع الحجم غير متساوٍ: يوم أحد في NFL قد يدور فيه مئات الملايين من الدولارات عبر أسواق Polymarket الرياضية؛ بينما قد لا يتجاوز لقاء في الدوري السعودي للمحترفين مساء الثلاثاء 50 ألف دولار. صمّم استراتيجيتك بحسب المكان الذي توجد فيه الحركة فعلًا.
Pre-game vs in-game (different bots)
تصميمان مختلفان جذريًا للروبوت.
Pre-game line-catcher: يفحص الأسواق التي فُتحت للتو، يحدد الخطوط المسعّرة بشكل خاطئ مقارنة بنموذجك أو مقارنةً بمنصة أدق، ثم يضع FOK buy. يحتفظ بالمركز حتى in-play، وأحيانًا حتى التسوية النهائية. السرعة: دقائق لا ثوانٍ. الأفضلية: النموذج + line-shopping.
In-game microstructure: يشترك في WebSocket لدفتر أوامر المباراة الحي، ويتفاعل مع إشارات عدم التوازن + أحداث الأهداف/التسجيل خلال ثوانٍ. السرعة: ثوانٍ لا دقائق. الأفضلية: زمن الوصول + قراءة تدفق الأوامر.
النوعان يشتركان في القليل جدًا من الشيفرة. لديهما ملفات مخاطر مختلفة، ومصادر بيانات مختلفة، واستراتيجيات خروج مختلفة. الروبوت الذي يحاول فعل الأمرين غالبًا لا يتقن أيًّا منهما؛ اختر واحدًا.
Verified tag IDs (745 NBA, 864 Tennis)
معرّفات الوسوم الإنتاجية الموثقة في مايو 2026 للفئات الرياضية الرئيسية. استخدمها لتصفية استدعاءات /events بكفاءة.
| Sport / League | Tag ID | Tag slug | Notes |
|---|---|---|---|
| NBA | 745 | nba | أعلى حجم من Oct-Jun |
| NFL | 450 | nfl | الذروة Sun/Mon Sep-Feb |
| 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 | الذروة Apr-Oct |
| NHL | 823 | nhl | الذروة Oct-Jun |
معرّفات الوسوم مستقرة عبر السنوات. تُضاف وسوم جديدة (Saudi Pro League, IPL) لكن الوسوم القديمة لا يُعاد ترقيمها.
Data sources: ESPN, official APIs, on-screen
بالنسبة للرياضات التقليدية، تغطي ESPN scoreboard API المجانية كل ما تحتاجه: النتائج، الفترة/الساعة، احتمال الفوز، وأحيانًا موقع التسديدة. لا يلزم مفتاح؛ والتقييد الوحيد يكون على مستوى IP. نمط نقطة النهاية: https://site.api.espn.com/apis/site/v2/sports/<sport>/<league>/scoreboard.
بالنسبة إلى esports، لا يوجد تغطية من ESPN. الخيارات: PandaScore (30-60 دولار/شهر، المعيار الصناعي)، HLTV (خاص بـ CS2 فقط، قابل للاستخراج scraping، بلا API)، Liquipedia (تُدار مجتمعيًا، قابلة للاستخراج، وتحديثاتها أبطأ).
تعمل التغذيات على الشاشة (الدفع مقابل بث تلفزيوني وقراءة لوحة النتيجة OCR) لكنها ثقيلة تشغيليًا. يُنصح بها فقط إذا كانت لديك استراتيجية تتطلب تحديثات أسرع من 3 ثوانٍ في رياضة لا تغطيها أي API في الزمن الحقيقي.
Latency budget for in-game
ميزانية التأخير من البداية إلى النهاية لروبوت تفاعلي أثناء المباراة.
- حدث التسجيل/النتيجة يقع: t=0
- تغذية المصدر تعكسه: t+3-15s (ESPN: حوالي 10s؛ PandaScore: حوالي 3s)
- روبوتك يقرأ التغذية: t+10-16s
- الروبوت يقرر الإجراء: +50ms
- وضع أمر FOK: +200-500ms
- يتم المطابقة على CLOB: +300-1000ms (الشبكة + المطابقة)
الإجمالي: 11-17 ثانية. أسرع الشركات الاحترافية تحقق 3-5 ثوانٍ من البداية إلى النهاية عبر تغذيات مدفوعة مميزة وVPS قريب من المصدر co-located. أما الروبوتات التجزئية التي تعمل على hosts عادية ومع ESPN المجانية فتكون في الطرف الأبطأ.
الاستراتيجيات التي تحتاج أقل من 5 ثوانٍ غير مجدية للتجزئة. أما الاستراتيجيات التي تنجح في نافذة 10-17 ثانية فهي: اقتناص الخط بعد التسجيل، ومجاراة المبالغات في رد الفعل، وصفقات اليقين المتأخرة.
The 0.99 / 0.01 trap
أكثر فشل شائع لروبوتات الرياضة أثناء اللعب: شراء المرشح الأوفر حظًا بسعر 0.99 مع بقاء دقيقة واحدة، متوقعًا ربحًا سهلًا قدره +1 سنت. يفشل ذلك لثلاثة أسباب.
أولًا، الاحتمال الضمني 1% لعودة الفريق الأضعف ليس صفرًا - فالعودة المتأخرة تحدث بتكرار غير مهمل. فوز مؤكّد بنسبة 99.5%، إذا طُبق 200 مرة، ينتج عنه خسارة واحدة بحجم المركز الكامل.
ثانيًا، الفارق عند 0.99/0.01 يعني أنك تدفع 99 سنتًا للسهم، وتربح 1 سنت عند النجاح، وتخسر 99 سنتًا عند الانقلاب النادر. العائد مقابل المخاطرة قاسٍ جدًا.
ثالثًا، الروبوت الذي يستخدم بيع GTC عند 0.999 نادرًا ما يتم ملؤه - لا يوجد مشترون بذلك السعر. فيستمر المركز حتى التسوية. إذا فاز، فقد ربحت سنتًا واحدًا. وإذا حدث الانقلاب، فستخسر 99 سنتًا.
هذا الفخ هو خسارة حقيقية للأموال على أيدي المطورين الذين لم يجروا الحسابات. ابتعد عن الأسواق المسعّرة عند 0.95+ ما لم تكن استراتيجيتك مصممة تحديدًا لنمط redemption-arbitrage.
Code: subscribe to a games book and react
مرجع: اشترك في WebSocket لمباراة NBA محددة، وسجّل تحديثات الدفتر، وفعّل 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()
إضافات إنتاجية: فترة تهدئة بين الإشارات، حد أقصى للمخزون لكل token، وإيقاف عند قدم دفتر الأوامر (عدم وصول أي رسالة خلال 30 ثانية).





