पॉलीमार्केट बॉट ट्यूटोरियल · अध्याय 22 / 32
पॉलीमार्केट पर NegRisk मल्टी-आउटकम बॉट: sum-to-1 यांत्रिकी, जब हाँ वाली लेग का जोड़ 1 नहीं होता तब लेग आर्बिट्राज, लेग के बीच हेजिंग, और मल्टी-आउटकम बाज़ारों से जुड़े एग्ज़ीक्यूशन के नुकसान।
इस अध्याय में क्या शामिल है
मल्टी-आउटकम NegRisk बाज़ार परस्पर अपवर्जी होते हैं - ठीक एक ही परिणाम हाँ पर रिज़ॉल्व होता है। यह अध्याय, अध्याय 11 की एग्ज़ीक्यूशन यांत्रिकी के ऊपर एक रणनीति की परत है: लेग के बीच हेज कैसे करें, sum-to-1 आर्बिट्राज कब असली होती है, और पहली बार डिप्लॉय करने पर ज़्यादातर NegRisk बॉट किन बग से टकराते हैं।
- NegRisk बनाम बाइनरी का सार
- Sum-to-1 नियम और आर्बिट्राज
- लेग-दर-लेग हेज निर्माण
- एग्ज़ीक्यूशन: ऑर्डर में neg_risk फ़्लैग
- NegRisk बॉट में आम बग
- कोड: सभी लेग का स्नैपशॉट लें और 1.00 से कम जोड़ पकड़ें
NegRisk बनाम बाइनरी का सार
बाइनरी: एक हाँ/नहीं बाज़ार, दो टोकन, जिनका जोड़ 1.0 होता है। NegRisk: N परस्पर अपवर्जी परिणाम, N टोकन, और इवेंट की सभी हाँ लेग का जोड़ लगभग 1.0 होता है।
एग्ज़ीक्यूशन के लिहाज़ से, NegRisk को हर ऑर्डर पर negRisk: true चाहिए (अध्याय 11) और यह एक अलग एक्सचेंज कॉन्ट्रैक्ट के ज़रिए रूट होता है। रणनीति के लिहाज़ से, NegRisk बाइनरी की तुलना में दो अनोखे अवसर देता है: जब जोड़ 1.0 से हटे तो लेग-के-बीच आर्बिट्राज, और कई हाँ लेग ख़रीदकर हेज निर्माण।
NegRisk की अनोखी लागतें: ज़्यादा लेग = ज़्यादा स्प्रेड कर (आप जिस भी लेग को ट्रेड करते हैं उसकी लागत लगभग 0.5-1c स्प्रेड होती है), और कम लिक्विडिटी वाले इवेंट में sum-to-1 का विचलन ज़्यादा चौड़ा होता है (आर्बिट्राज अक्सर मौजूद रहती है पर छोटी होती है)।
Sum-to-1 नियम और आर्बिट्राज
आर्बिट्राज का आधार: अगर सभी N हाँ लेग को ख़रीदने की लागत $1.00 से कम है, तो रिज़ॉल्यूशन पर आपने पक्का मुनाफ़ा लॉक कर लिया (किसी एक लेग को $1.00 चुकाना ही होगा; बाकी $0 पर चले जाएँगे)।
व्यवहार में, आर्बिट्राज का अंतर आम तौर पर 0-3c होता है, जो हर लेग पर स्प्रेड और फ़ीस खा जाते हैं, और खुलने के कुछ मिनटों में गायब हो जाता है। क्षमता सबसे पतली लेग की लिक्विडिटी तक सीमित होती है।
आर्बिट्राज कुछ ख़ास रिज़ॉल्यूशन विफलताओं के भी अधीन होती है: एक "none of the above" परिणाम जो तब स्पष्ट रूप से हाँ पर रिज़ॉल्व होता है जब कोई नामित उम्मीदवार योग्य नहीं होता। अगर इवेंट में ऐसी लेग है और आपने उसे नहीं ख़रीदा, तो आपका "पूरा हेज" असली भुगतान चूक जाता है।
लेग-दर-लेग हेज निर्माण
किसी NegRisk लेग पर पोज़ीशन रखते हुए, आप प्रतिस्पर्धी लेग की हाँ अनुपात में ख़रीदकर हेज कर सकते हैं। अगर आपके पास Trump-हाँ 0.50 पर है और आप Trump के हारने के ख़िलाफ़ हेज करना चाहते हैं, तो आप बाकी नामित लेग का एक पोर्टफोलियो ख़रीदते हैं।
प्रति-लेग हेज भार ≈ Trump के हारने पर उस लेग की मौजूदा निहित प्रायिकता। सन्निकटन: weight_i = price_i / (1 - trump_price).
हेज अपूर्ण होता है क्योंकि इस्तेमाल की गई कीमतें एक क्षण-विशेष की होती हैं और ख़बर आने पर सशर्त प्रायिकताएँ बदल जाती हैं। हेज को साप्ताहिक या किसी बड़ी ख़बर पर रीबैलेंस करें। इसे ज़रूरत से ज़्यादा जटिल न बनाएँ; हेज का मकसद वैरियंस घटाना है, ख़त्म करना नहीं।
एग्ज़ीक्यूशन: ऑर्डर में neg_risk फ़्लैग
NegRisk से जुड़ा सबसे आम बग: ऑर्डर देने वाले पेलोड में negRisk: true भूल जाना। ऑर्डर API से स्वीकार हो जाता है पर गलत तरीके से सेटल होता है क्योंकि वह NegRisk एक्सचेंज के बजाय मानक CTF एक्सचेंज पर रूट हो जाता है।
// CORRECT for NegRisk markets:
await client.createAndPostOrder(
{ tokenID, price, size, side: Side.BUY },
{ tickSize: '0.01', negRisk: true }, // <-- REQUIRED
OrderType.FOK
);
सत्य का स्रोत: Gamma API से market.negRisk। इसे पढ़ें और आगे भेजें। कभी भी अंदाज़े के आधार पर फ़्लैग हार्डकोड न करें।
NegRisk बॉट में आम बग
कई बॉट के प्रोडक्शन डिबग लॉग से।
- negRisk फ़्लैग का न होना: ऑर्डर स्वीकार होते हैं, सेटलमेंट विफल होता है। उपाय: हर रैपर में फ़्लैग को लागू करें।
- "Other" लेग के बिना हेजिंग: "None of the above" परिणाम वाले इवेंट में, उसे छोड़ने वाला हेज पोर्टफोलियो अधूरा होता है। उपाय: हेज बनाते समय हमेशा Other लेग जाँचें।
- Sum-to-1 आर्बिट्राज को कम साइज़ में करना: आर्बर 1c बढ़त (edge) हासिल करता है पर प्रति लेग सिर्फ 5 शेयर ट्रेड करता है; कुल मुनाफ़ा स्प्रेड से पहले 5 सेंट, यानी शुद्ध रूप से नकारात्मक। उपाय: आर्बिट्राज को इतना साइज़ दें कि सार्थक पूर्ण डॉलर निकलें, दिखावटी प्रतिशत के पीछे न भागें।
- बासी लेग कीमत: बॉट 3 लेग की कीमतें लाता है, कुल 200ms लगता है, और लाने के दौरान आख़िरी लेग की कीमत बदल जाती है। उपाय: सभी लेग को समानांतर में लाएँ और स्नैपशॉट को एक ही अवलोकन की तरह मानें।
कोड: सभी लेग का स्नैपशॉट लें और 1.00 से कम जोड़ पकड़ें
संदर्भ: NegRisk इवेंट की सभी हाँ लेग को समानांतर में स्नैपशॉट करें, आर्बिट्राज पकड़ें।
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
सभी लेग का परमाणविक एग्ज़ीक्यूशन एक कठिन समस्या है और इसके लिए प्रति-लेग FOK और आंशिक फ़िल पर रोलबैक चाहिए (अध्याय 16 के stat-arb कोड जैसा ही पैटर्न)।


