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 থেকে।

  1. negRisk flag missing: order accept হয়, settlement fail করে। Cure: প্রতিটি wrapper-এ flag enforce করুন।
  2. "Other" leg ছাড়া hedging: "None of the above" outcome থাকা event-এ, সেটি exclude করা hedge portfolio incomplete। Cure: hedge construct করার সময় সবসময় Other leg চেক করুন।
  3. 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 নিন।
  4. 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)।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

NegRisk market-এ sum-to-1 invariant কী?
একটি NegRisk multi-outcome market-এর সব YES leg জুড়ে, YES price-এর sum 1 USD-এর কাছাকাছি থাকে কারণ ঠিক একটি outcome জেতে। Fees বাদ দিয়ে sum যদি 1.00-এর নিচে নেমে যায়, তাহলে প্রতিটি leg proportion অনুযায়ী কিনলে arbitrage profit লক হয়। Arb বিরল এবং খুব দ্রুত sniped হয় - এটিকে primary strategy নয়, বরং একটি curiosity হিসেবে ধরুন।
NegRisk pricing binary থেকে কীভাবে আলাদা?
Binary: YES price আপনার direct probability estimate। NegRisk: একটি leg-এর YES price হলো Nটি alternative-এর মধ্যে সেই specific outcome জেতার probability। N বাড়লে individual price ছোট হয় (probability sum 1 হয়)। NegRisk trade করতে হলে absolute Yes/No নয়, relative probability নিয়ে ভাবতে হয়।
সবচেয়ে common NegRisk bot bug কী?
Order placement-এ neg_risk: true flag দিতে ভুলে যাওয়া। Order either reject হয় বা ভুল CTF position-এ route করে। আমরা production-এ এই সমস্যায় পড়েছিলাম - আমাদের trader history-র commit 06deaef ছিল বিশেষভাবে এই fix। NegRisk order-এ সবসময় neg_risk=true (Python) বা negRisk: true (Node) সেট করুন।
Leg hedge করে কি NegRisk-এ টাকা করা যায়?
তত্ত্বগতভাবে হ্যাঁ (দুই leg-এর spread lock in করা যায়)। বাস্তবে বেশিরভাগ retail bot-এর জন্য fees hedge edge খেয়ে ফেলে। Hedging market making-এর সময় inventory neutral রাখতে কাজ করে, standalone strategy হিসেবে নয়।
আমি NegRisk market কীভাবে খুঁজব?
gamma /events filter করুন: যেখানে markets count > 2 এবং negRisk flag set আছে। Common category: championship winners (NBA Finals MVP), election fields (next Speaker), tournament brackets. প্রতিটি gamma event-এর child markets array থাকে।
NegRisk market binary-এর চেয়ে বেশি না কম liquid?
প্রতি leg-এ কম, aggregate-এ বেশি। একটি 30-team NBA Champion event-এ 24h total volume 50K হতে পারে, কিন্তু প্রতিটি team market-এ মাত্র 1.6K - ফলে প্রতি leg trading কঠিন হয়। Aggregate liquidity বাস্তব, শুধু fragmented।