يحتاج مكتب التداول الذي يفحص الفوارق بين Kalshi وPolymarket إلى سعري الحدث نفسه، وإلى معرفة ما إذا كان العقدان يدفعان بالشروط نفسها. يعيد Narwhal الأسعار ونص قواعد كل منصة ومصدر التسوية وحجم التداول وأي علامة تخص القواعد في استجابة واحدة.
قراءة المنصتين على حدث واحد
يبدأ الفحص من حدث واحد تسعّره المنصتان معًا. يقرأ الطلب أدناه قرار الاحتياطي الفيدرالي لشهر ديسمبر 2026 ويعيد سعر كل منصة لكل نتيجة. اختُصرت الاستجابة إلى نتيجة رفع الفائدة 25 bps وحُذف نص قواعد المنصات الذي يقرؤه الفحص في الخطوة التالية.
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/predictions/scalar/usa-fed-2026-12"{
"event_id": "usa-fed-2026-12",
"question": "Federal Reserve rate decision, 9 December 2026",
"status": "trading",
"closes_at": "2026-12-09T18:59:00Z",
"resolves_at": "2026-12-09T19:00:00Z",
"as_of": "2026-11-03T03:09:00Z",
"stale": false,
"venues": [
{
"venue": "kalshi",
"url": "https://kalshi.com/markets/kxfeddecision/kxfeddecision-26dec",
"rules_url": "https://assets.kalshi.com/contract_terms/FEDDECISION.pdf",
"settlement_source": "Federal Reserve",
"weight": "0.0624",
"volume_24h_usd": "32792.43",
"open_interest_usd": "426866.37"
},
{
"venue": "polymarket",
"url": "https://polymarket.com/event/fed-decision-in-december-20260729232808632",
"settlement_source": "Federal Reserve",
"weight": "0.9376",
"volume_24h_usd": "665452.98"
}
],
"outcomes": [
{
"key": "hike_25",
"label": "Hike of 25 bps",
"lower": "12.5",
"upper": "37.5",
"probability": "0.7185",
"quotes": [
{
"venue": "kalshi",
"probability": "0.7073",
"market_ids": [
"KXFEDDECISION-26DEC-H25"
]
},
{
"venue": "polymarket",
"probability": "0.7192",
"market_ids": [
"111662129652828266889360374468657435151479595863413519836161861837506140152890"
]
}
]
}
]
}للحدث as_of واحد وcloses_at واحد وresolves_at واحد، لذا يؤخذ السعران في اللحظة نفسها. في نتيجة الرفع يسعّر Kalshi عند 0.7073 ويسعّر Polymarket عند 0.7192، بفارق 0.0119. يحمل إدخال كل منصة settlement_source وvolume_24h_usd، ويحمل إدخال Kalshi أيضًا open_interest_usd. وweight هو مقدار ما تُسهم به كل منصة في probability الإجمالي.
عند اختلاف القواعد، اقرأ الفارق على أنه عقدان مختلفان
يخبرك فارق السعر أن رقمين مختلفان، ولا يخبرك أن العقدين يدفعان بالشروط نفسها. ويُظهر سؤال الركود حالة تضع الاستجابة علامة عليها بنفسها: إذ يحصل إدخال المنصة على excluded_reason وملاحظة match تبيّن ما يختلف.
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/predictions/binary/usa-recession-2026"{
"event_id": "usa-recession-2026",
"question": "US recession by end of 2026?",
"as_of": "2026-11-03T03:09:00Z",
"stale": false,
"probability": "0.0550",
"quotes": [
{
"venue": "kalshi",
"probability": "0.0250",
"market_ids": [
"KXRECSSNBER-26"
]
},
{
"venue": "polymarket",
"probability": "0.0550",
"market_ids": [
"100379208559626151022751801118534484742123694725746262280150222742563282755057"
]
}
],
"venues": [
{
"venue": "kalshi",
"url": "https://kalshi.com/markets/kxrecssnber/kxrecssnber-26",
"rules_url": "https://assets.kalshi.com/contract_terms/NBERRECSS.pdf",
"settlement_source": "Bureau of Economic Analysis",
"excluded_reason": "rules",
"match": {
"differences": [
"rules"
],
"note": "Kalshi resolves on two negative GDP quarters only; Polymarket also counts an NBER recession call"
},
"volume_24h_usd": "125.68",
"open_interest_usd": "17994.22"
},
{
"venue": "polymarket",
"url": "https://polymarket.com/event/us-recession-by-end-of-2026",
"settlement_source": "Bureau of Economic Analysis; NBER",
"weight": "1.0000",
"volume_24h_usd": "4195.50"
}
]
}يسعّر Kalshi عند 0.0250 ويسعّر Polymarket عند 0.0550، بفارق 0.0300. وprobability الإجمالي هو 0.0550، وهو سعر Polymarket وحده، لأن Kalshi مستبعد بسبب rules. وتقول الملاحظة إن Kalshi يحسم فقط عند ربعين سالبين للناتج المحلي الإجمالي، بينما يحتسب Polymarket أيضًا إعلان الركود من الجهة البحثية. ومصادر التسوية تختلف أيضًا. ينبغي للفحص أن يُسقط هذا الفارق من قائمة المرشحين أو يضع عليه وسمًا بأنه عقد مختلف.
فحص كل نتيجة وكتابة صف في السجل
يقرأ البرنامج النصي أدناه قائمة أحداث، ويحسب الفارق بين Polymarket وKalshi (سعر Polymarket ناقص سعر Kalshi) لكل نتيجة تسعّرها المنصتان معًا، ثم يطبع صفًّا لكل نتيجة مع العلامات التي يرشّح بها المكتب.
import csv, json, os, sys, urllib.request
from decimal import Decimal
def get(path):
req = urllib.request.Request("https://api.narwhalapi.com" + path,
headers={"Authorization": "Bearer " + os.environ["NARWHAL_API_KEY"]})
with urllib.request.urlopen(req, timeout=30) as r:
return json.load(r)
def scan(shape, event_id):
e = get(f"/v1/predictions/{shape}/{event_id}")
venues = {v["venue"]: v for v in e["venues"]}
flags = [v["venue"] + ":" + ",".join(v.get("match", {}).get("differences", [])) for v in e["venues"] if v.get("excluded_reason")]
sources = {v["settlement_source"] for v in e["venues"]}
rows = e["outcomes"] if shape == "scalar" else [{"key": "yes", "quotes": e["quotes"]}]
for row in rows:
q = {x["venue"]: Decimal(x["probability"]) for x in row["quotes"]}
if len(q) < 2:
continue
yield [e["as_of"], e["stale"], event_id, row["key"], q["kalshi"], q["polymarket"],
q["polymarket"] - q["kalshi"], len(sources), ";".join(flags) or "none",
venues["kalshi"]["volume_24h_usd"], venues["polymarket"]["volume_24h_usd"]]
out = csv.writer(sys.stdout)
out.writerow(["as_of", "stale", "event", "outcome", "kalshi", "polymarket", "gap", "sources", "flags", "k_vol_24h", "p_vol_24h"])
for shape, event_id in [("scalar", "usa-fed-2026-12"), ("binary", "usa-recession-2026")]:
out.writerows(scan(shape, event_id))
as_of,stale,event,outcome,kalshi,polymarket,gap,sources,flags,k_vol_24h,p_vol_24h
2026-11-03T03:09:00Z,False,usa-fed-2026-12,cut_50_plus,0.0049,0.0035,-0.0014,1,none,32792.43,665452.98
2026-11-03T03:09:00Z,False,usa-fed-2026-12,cut_25,0.0146,0.0055,-0.0091,1,none,32792.43,665452.98
2026-11-03T03:09:00Z,False,usa-fed-2026-12,hold,0.2586,0.2530,-0.0056,1,none,32792.43,665452.98
2026-11-03T03:09:00Z,False,usa-fed-2026-12,hike_25,0.7073,0.7192,0.0119,1,none,32792.43,665452.98
2026-11-03T03:09:00Z,False,usa-fed-2026-12,hike_50_plus,0.0146,0.0188,0.0042,1,none,32792.43,665452.98
2026-11-03T03:09:00Z,False,usa-recession-2026,yes,0.0250,0.0550,0.0300,2,kalshi:rules,125.68,4195.50صفوف Fed الخمسة تشترك في مصدر تسوية واحد ولا تحمل علامة، فهي قابلة للمقارنة من حيث التسوية. وتجمع الأسعار الخمسة لكل منصة إلى 1.0000، فتجمع الفوارق إلى صفر. أما صف الركود فله مصدرا تسوية وعلامة kalshi:rules. وصياغة القواعد لا تزال تتطلب مراجعة بشرية أو مقارنة diff: ينص نص Kalshi على أن إلغاء الاجتماع يحسم نتيجة عدم التغيير بـ Yes، بينما يقرّب نص Polymarket التغيير إلى مستوى غير مدرج إلى أقرب 25 bps، ويحسم لصالح فئة عدم التغيير إذا لم يصدر بيان بحلول نهاية الاجتماع المجدول التالي.
ما الذي يُسجَّل في كل مسح
لا يفيد المسح لاحقًا إلا إذا أمكن إعادة تشغيله. سجّل المدخلات إلى جانب الفارق.
| حقل | سبب الاحتفاظ به |
|---|---|
as_of وstale | وقت السعرين، وهل كانت بيانات الحدث حديثة |
event_id وkey الخاص بالنتيجة | زوج العقود الذي جرت مقارنته بالضبط |
| السعران والفارق | الأرقام، محفوظة كسلاسل نصية أو كأعداد عشرية |
market_ids لكل سعر | عقد المنصة الذي يقف وراء كل رقم |
excluded_reason وmatch | سبب كون الفارق عقدًا مختلفًا |
settlement_source لكل منصة | هل تحسم النتيجة الجهة نفسها |
volume_24h_usd, open_interest_usd | حجم التداول الذي يقف وراء السعر |
تجزئة (hash) لكل rules_text | يتبيّن أي تعديل في القواعد بين مسحين |
يوضح مثال Fed سبب تسجيل الحجم. في هذا المسح بلغ حجم تداول Kalshi خلال 24 ساعة 32,792.43 دولارًا وبلغ حجم Polymarket 665,452.98، فالفارق نفسه يستند إلى عمق مختلف جدًا. وفي صف الركود يبلغ حجم Kalshi 125.68.
هل يعني وجود فارق أنه يمكن تنفيذ أمر بهذه الأسعار؟
لا تقول الواجهة ذلك، ولا تدّعي هذه الصفحة شيئًا عن العوائد. السعر احتمال وليس أمرًا. ولا تتضمن الاستجابة جدول رسوم ولا عمق دفتر أوامر ولا سعرًا يستطيع المكتب التداول عنده. يضيّق الفحص قائمة الأحداث التي تستحق القراءة.
ماذا تخبر أوزان المنصات المكتب؟
weight هو حصة المنصة في probability الإجمالي، ومجموع الأوزان يساوي 1. في هذا المسح هي 0.0624 لـ Kalshi و0.9376 لـ Polymarket. وعند تطبيقها على أسعار الإبقاء دون تغيير تعطي 0.25335، مقابل 0.2533 للقيمة الإجمالية. الوزن الكبير لمنصة واحدة يعني أن القيمة الإجمالية تتبع تلك المنصة في الغالب، لذا ينبغي للفحص الذي يقارن الأسعار أن يستخدم أسعار المنصات لا القيمة الإجمالية.
ماذا لو عرضت إحدى المنصات النتائج بشكل مختلف؟
يبلّغ إدخال المنصة عن outcome_set في match.differences ويشرح الدمج في ملاحظة match. وتكون الأسعار في quotes حينها على الصفوف نفسها بالفعل. اقرأ match قبل أن تقارن قائمتي نتائج بالتسميات. ويعرض دليل مقارنة Polymarket وKalshi خطوات السؤال الواحد.
هل تختلف أوقات الإغلاق والحسم بين المنصات؟
يعطي الحدث closes_at واحدًا وresolves_at واحدًا. وصياغة كل منصة المتعلقة بالتوقيت موجودة في rules_text، لذا يقارن الفحص الذي يهتم بذلك النصين. ويسمّي نص Polymarket لهذا الحدث بيان FOMC مصدرًا للحسم، مع الرجوع إلى فئة عدم التغيير إذا لم يصدر أي بيان.
نُشر في .