Polymarket Bot Tutorial · Chapter 22 of 32
Polymarket پر NegRisk multi-outcome bots: sum-to-1 mechanics، جب YES legs 1 کے برابر نہ ہوں تو leg arbitrage، legs کے درمیان hedging، اور multi-outcome markets کے لیے مخصوص execution pitfalls۔
یہ chapter کیا cover کرتا ہے
Multi-outcome NegRisk markets mutually exclusive ہوتے ہیں - یعنی بالکل ایک ہی outcome YES resolve ہوتا ہے۔ یہ chapter chapter 11 کی execution mechanics کے اوپر strategy layer ہے: legs کے درمیان hedge کیسے کرنا ہے، sum-to-1 arb کب واقعی ہوتا ہے، اور وہ bugs جو اکثر NegRisk bots کو پہلی deploy پر لگتے ہیں۔
- NegRisk vs binary recap
- Sum-to-1 invariant اور arbitrage
- Leg-by-leg hedge construction
- Execution: orders میں neg_risk flag
- NegRisk bots میں common bugs
- Code: تمام legs کا snapshot لیں اور under-1.00 sum detect کریں
NegRisk vs binary recap
Binary: ایک yes/no market، دو tokens، sum to 1.0۔ NegRisk: N mutually exclusive outcomes، N tokens، event کے دوران تمام YES legs مجموعی طور پر تقریباً 1.0 بنتے ہیں۔
Execution کے لحاظ سے، NegRisk میں ہر order پر negRisk: true درکار ہوتا ہے (chapter 11) اور یہ ایک الگ exchange contract کے ذریعے route ہوتا ہے۔ Strategy کے لحاظ سے، NegRisk دو منفرد مواقع دیتا ہے جو binaries میں نہیں ہوتے: جب sum 1.0 سے ہٹ جائے تو cross-leg arb، اور متعدد YES legs خرید کر hedge construction۔
NegRisk کے unique costs: زیادہ legs = زیادہ spread tax (ہر traded leg پر تقریباً 0.5-1c spread cost)، illiquid events میں sum-to-1 deviations زیادہ (arb زیادہ دفعہ available ہوتا ہے مگر smaller ہوتا ہے)۔
Sum-to-1 invariant اور arbitrage
Arb premise: اگر تمام N YES legs خریدنے کی لاگت $1.00 سے کم ہو، تو resolution پر آپ نے guaranteed profit lock کر لیا ہے (ایک leg کو لازماً $1.00 ملے گا؛ باقی $0 پر چلے جائیں گے)۔
عملی طور پر، arb gap عموماً 0-3c ہوتا ہے، اور ہر leg پر spread + fees اسے کھا جاتے ہیں، اور opening کے چند منٹوں میں غائب ہو جاتا ہے۔ Capacity سب سے thin leg کی liquidity سے محدود ہوتی ہے۔
Arb مخصوص resolution failure modes کے تابع بھی ہوتا ہے: ایک "none of the above" outcome جو صراحتاً تب YES resolve ہوتا ہے جب کوئی named candidate qualify نہ کرے۔ اگر event میں ایسا leg موجود ہے اور آپ نے اسے نہیں خریدا، تو آپ کا "complete hedge" اصل payout miss کر دیتا ہے۔
Leg-by-leg hedge construction
اگر آپ کے پاس ایک NegRisk leg پر position ہے، تو آپ proportion کے مطابق competing legs پر YES خرید کر hedge کر سکتے ہیں۔ اگر آپ کے پاس Trump-YES 0.50 پر ہے اور Trump loss کے خلاف hedge کرنا چاہتے ہیں، تو آپ دوسرے named legs کا portfolio خریدتے ہیں۔
ہر leg کا hedge weight تقریباً اس leg کی current implied probability ہوتا ہے، بشرطیکہ Trump lose کرے۔ Approximation: weight_i = price_i / (1 - trump_price)۔
یہ hedge imperfect ہوتا ہے کیونکہ استعمال ہونے والی prices point-in-time ہوتی ہیں اور news آنے کے ساتھ conditional probabilities بدلتی رہتی ہیں۔ Hedge کو weekly یا major news پر rebalance کریں۔ اسے زیادہ over-engineer نہ کریں؛ hedge کا مقصد variance کم کرنا ہے، eliminate کرنا نہیں۔
Execution: orders میں neg_risk flag
NegRisk-specific سب سے common bug: order placement payload میں negRisk: true بھول جانا۔ Order API سے accept ہو جاتا ہے مگر settlement غلط ہوتی ہے کیونکہ وہ NegRisk exchange کے بجائے standard CTF exchange پر route ہو جاتا ہے۔
// CORRECT for NegRisk markets:
await client.createAndPostOrder(
{ tokenID, price, size, side: Side.BUY },
{ tickSize: '0.01', negRisk: true }, // <-- REQUIRED
OrderType.FOK
);
Source of truth: Gamma API سے market.negRisk۔ اسے read کریں؛ پھر pass through کریں۔ کبھی بھی اندازے کی بنیاد پر flag hardcode نہ کریں۔
NegRisk bots میں common bugs
Multiple bots کے production debug logs سے۔
- Missing negRisk flag: orders accepted، settlement fail ہو جاتی ہے۔ علاج: ہر wrapper میں flag enforce کریں۔
- "Other" leg کے بغیر hedging: ایسے events میں جہاں "None of the above" outcome ہو، اسے exclude کر کے بنایا گیا hedge portfolio incomplete ہوتا ہے۔ علاج: hedge بناتے وقت ہمیشہ Other leg چیک کریں۔
- Sum-to-1 arb under-sizing: arber 1c edge تو realize کر لیتا ہے مگر ہر leg پر 5 shares trade کرتا ہے؛ total profit spread سے پہلے 5 cents بنتا ہے، net negative۔ علاج: arb کو meaningful absolute dollars نکالنے کے لیے size کریں، headline percentages chase نہ کریں۔
- Stale leg pricing: bot 3 leg prices fetch کرتا ہے، total 200ms لگتے ہیں، fetch کے دوران آخری leg کی price بدل گئی۔ علاج: تمام legs parallel میں fetch کریں + snapshot کو ایک observation سمجھیں۔
Code: تمام legs کا snapshot لیں اور under-1.00 sum detect کریں
Reference: NegRisk event کے تمام YES legs parallel میں snapshot کریں، arb detect کریں۔
import asyncio, aiohttp
async def fetch_leg_ask(session, token_id):
async with session.get(f"https://clob.polymarket.com/book?token_id={token_id}") as r:
d = await r.json()
asks = d.get("asks", [])
return float(asks[0]["price"]) if asks else None
async def check_arb(event_slug):
event = await fetch_event(event_slug)
if not event["markets"][0]["negRisk"]: return None
legs = []
for m in event["markets"]:
toks = json.loads(m["clobTokenIds"])
yes_token = toks[0]
legs.append(yes_token)
async with aiohttp.ClientSession() as s:
asks = await asyncio.gather(*[fetch_leg_ask(s, t) for t in legs])
if any(a is None for a in asks): return None
total = sum(asks)
if total < 0.97:
return {"edge": 1 - total, "legs": list(zip(legs, asks))}
return None
تمام legs کی atomic execution زیادہ مشکل مسئلہ ہے اور اس کے لیے per-leg FOK + partial fill پر rollback درکار ہوتا ہے (chapter 16 کے stat-arb code جیسا pattern)۔





