Polymarket Bot Tutorial · অধ্যায় 22 of 32
Polymarket-এ NegRisk multi-outcome bot: sum-to-1 mechanics, YES legs একসাথে 1 না হলে leg arbitrage, legs জুড়ে hedging, এবং multi-outcome market-এর নির্দিষ্ট execution pitfalls.
এই অধ্যায়ে কী আছে
Multi-outcome NegRisk market হলো mutually exclusive - ঠিক একটি outcome YES হিসেবে resolve হয়। এই অধ্যায়টি chapter 11-এর execution mechanics-এর উপর দাঁড়ানো strategy layer: কীভাবে legs জুড়ে hedge করবেন, কখন sum-to-1 arb সত্যিই কাজ করে, এবং প্রথম deploy-এ বেশিরভাগ NegRisk bot যে bugs-এ পড়ে।
- NegRisk বনাম binary recap
- Sum-to-1 invariant এবং arbitrage
- Leg-by-leg hedge construction
- Execution: orders-এ neg_risk flag
- NegRisk bot-এ common bugs
- Code: সব legs snapshot করা এবং under-1.00 sum detect করা
NegRisk বনাম binary recap
Binary: একটি yes/no market, দুইটি token, sum 1.0। NegRisk: Nটি mutually exclusive outcome, Nটি token, event জুড়ে সব YES legs-এর sum প্রায় 1.0।
Execution-এর দিক থেকে, NegRisk-এর প্রতিটি order-এ negRisk: true দরকার (chapter 11) এবং এটি আলাদা exchange contract-এর মাধ্যমে route হয়। Strategy-এর দিক থেকে, NegRisk binary-তে না থাকা দুইটি unique সুযোগ দেয়: sum 1.0 থেকে সরে গেলে cross-leg arb, এবং একাধিক YES leg কিনে hedge construction।
NegRisk-এর জন্য unique cost: leg যত বেশি, spread tax তত বেশি (আপনি ট্রেড করা প্রতিটি leg-এ প্রায় 0.5-1c spread খরচ), এবং illiquid event-এ sum-to-1 deviation আরও বড় হয় (arb বেশি পাওয়া যেতে পারে, কিন্তু সাধারণত ছোট হয়)।
Sum-to-1 invariant এবং arbitrage
Arb-এর মূল ধারণা: সব Nটি YES leg কিনতে যদি $1.00-এর কম লাগে, তাহলে resolution-এ আপনি guaranteed profit লক করে ফেলেছেন (একটি leg অবশ্যই $1.00 পাবে; বাকি legগুলো $0-তে যাবে)।
বাস্তবে, arb gap সাধারণত 0-3c, যা প্রতিটি leg-এ spread + fees খেয়ে ফেলে, এবং open হওয়ার কয়েক মিনিটের মধ্যেই disappear করে। Capacity নির্ধারিত হয় সবচেয়ে thin leg-এর liquidity দ্বারা।
Arb resolution failure mode-এরও মুখোমুখি হয়: "none of the above" outcome, যা কোনো named candidate qualify না করলে explicitly YES হিসেবে resolve হয়। যদি event-এ এমন একটি leg থাকে এবং আপনি সেটি না কেনেন, তাহলে আপনার "complete hedge" প্রকৃত payout মিস করবে।
Leg-by-leg hedge construction
একটি NegRisk leg-এ position ধরে রাখলে, আপনি proportion অনুযায়ী competing leg-এ YES কিনে hedge করতে পারেন। যদি আপনি Trump-YES 0.50-এ ধরে রাখেন এবং Trump loss-এর বিরুদ্ধে hedge করতে চান, তাহলে আপনি বাকি named legগুলোর একটি portfolio কিনবেন।
প্রতি leg-এর hedge weight ≈ Trump হারলে legটির current implied probability। Approximation: weight_i = price_i / (1 - trump_price).
এই hedge imperfect, কারণ ব্যবহৃত priceগুলো point-in-time এবং news আসার সাথে সাথে conditional probability বদলে যায়। Hedge সাপ্তাহিকভাবে বা বড় news এ rebalance করুন। এটাকে অতিরিক্ত জটিল করবেন না; hedge-এর উদ্দেশ্য variance কমানো, পুরোপুরি eliminate করা নয়।
Execution: orders-এ neg_risk flag
NegRisk-specific সবচেয়ে common bug: order placement payload-এ negRisk: true দিতে ভুলে যাওয়া। Order API-তে accept হয়, কিন্তু ভুলভাবে settle হয় কারণ এটি 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 bot-এ common bugs
Multiple bot-এর production debug logs থেকে।
- negRisk flag missing: order accept হয়, settlement fail করে। Cure: প্রতিটি wrapper-এ flag enforce করুন।
- "Other" leg ছাড়া hedging: "None of the above" outcome থাকা event-এ, সেটি exclude করা hedge portfolio incomplete। Cure: hedge construct করার সময় সবসময় Other leg চেক করুন।
- Sum-to-1 arb under-sizing: arber 1c edge detect করে কিন্তু প্রতি leg-এ 5 shares trade করে; total profit spread-এর আগে 5 cents, net negative। Cure: headline percentage chase না করে, meaningful absolute dollars extract করার মতো size নিন।
- Stale leg pricing: bot 3টি leg price fetch করে, total 200ms লাগে, fetch চলাকালীন শেষ leg-এর price বদলে যায়। Cure: সব leg parallel-এ fetch করুন + snapshot-কে one observation হিসেবে ধরুন।
Code: সব legs snapshot করুন এবং under-1.00 sum detect করুন
Reference: একটি NegRisk event-এর সব YES leg 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
সব leg-এর atomic execution আরও কঠিন সমস্যা এবং এর জন্য প্রতি-leg FOK + partial fill-এর উপর rollback দরকার (chapter 16-এর stat-arb code-এর মতো pattern)।





