प्रेडिक्शन मार्केट्स बैकटेस्ट करने के लिए दुनिया की सबसे आसान चीज़ लगते हैं। कीमत [0, 1] के बीच रहती है। पेऑफ़ एक डॉलर है या कुछ भी नहीं। न लीवरेज, न फंडिंग, न बेसिस, न 00:00 UTC पर perpetual swap की अजीबोगरीबी। हमारे पास पहले से ऐसा बैकटेस्टर था जो फीस, फंडिंग और इम्पैक्ट सहित क्रिप्टो परप्स संभालता था, और योजना थी कि इसे ढालने में दो दिन लगाएँ और फिर रणनीतियाँ बनाना शुरू कर दें।
आठ दिन लगे। यह रहा घटनाक्रम, लगभग उसी क्रम में — उस दिन सहित जब इक्विटी कर्व शानदार दिख रही थी, और सचमुच थी भी।
दिन 1: वह अडैप्टर जो बेहद आसान होना चाहिए था
शुरुआती मैपिंग एक-से-एक थी और साफ़-सुथरी लग रही थी। एक मार्केट एक इंस्ट्रूमेंट है। YES की कीमत ही कीमत है। YES खरीदना लॉन्ग है, NO खरीदना शॉर्ट। रिज़ॉल्यूशन पर 1.00 या 0.00 में जबरन पोज़िशन बंद हो जाती है। प्रति घंटे की प्राइस सीरीज़ को उसी इवेंट लूप में डालें, और काम पूरा।
असली डेटा से सामना होने पर यह मैपिंग लगभग नब्बे मिनट ही टिकती है। सबसे पहले रिटर्न्स सीरीज़ ने दम तोड़ा। हमारी पूरी रिस्क लेयर — पोज़िशन साइज़िंग, वोल टार्गेटिंग, Sharpe रिपोर्टिंग — एक जारी रहने वाले इंस्ट्रूमेंट के लॉग रिटर्न्स मानकर चलती थी। 0.04 से 0.00 पर जाने वाले मार्केट का लॉग रिटर्न अपरिभाषित है, जबकि कुल नुकसान स्पष्ट है। और रिज़ॉल्यूशन से तीन दिन पहले 0.04 पर बैठा मार्केट, रिज़ॉल्यूशन से चार मिनट पहले 0.04 पर बैठे मार्केट से मूल रूप से अलग चीज़ है, हालाँकि दोनों पंक्तियों में 0.04 लिखा है।
आखिरकार हमने पूरी सीरीज़ को दीवार की घड़ी के बजाय रिज़ॉल्यूशन तक बचे समय के हिसाब से फिर से पैरामीटराइज़ किया, और PnL को मार्क किए गए मूल्य के बजाय अंतिम माना। यह सही फैसला था, और इसके कारण आगे का हर रिपोर्टिंग कोड अमान्य हो गया।
दिन 2: फीस का फ़ॉर्मूला ही रणनीति है
Kalshi पर ट्रेडिंग फीस बेसिस-पॉइंट की कटौती नहीं है। यह कीमत के वर्ग के अनुपात में होती है: लगभग 0.07 × contracts × P × (1−P), और हर ऑर्डर के स्तर पर अगले सेंट तक ऊपर की ओर राउंड की जाती है। इसका मतलब है कि फीस ठीक वहीं सबसे ज़्यादा है जहाँ सिक्का-उछाल जैसा मार्केट सबसे दिलचस्प होता है, और छोरों पर लगभग मुफ़्त।
| कीमत | प्रति कॉन्ट्रैक्ट फीस | ज़रूरी बढ़त (संभाव्यता अंक) | दांव के % के रूप में फीस |
|---|---|---|---|
| 5¢ | 0.33¢ | 0.33 | 6.7% |
| 10¢ | 0.63¢ | 0.63 | 6.3% |
| 25¢ | 1.31¢ | 1.31 | 5.3% |
| 50¢ | 1.75¢ | 1.75 | 3.5% |
| 75¢ | 1.31¢ | 1.31 | 1.8% |
| 90¢ | 0.63¢ | 0.63 | 0.7% |
| 95¢ | 0.33¢ | 0.33 | 0.35% |
तीसरे कॉलम को असली कसौटी समझें: 50¢ पर खरीदकर रिज़ॉल्यूशन तक रखने पर ब्रेक-ईवन के लिए आपकी संभाव्यता का अनुमान बाज़ार से 1.75 अंक बेहतर होना चाहिए। 1.75 प्रतिशत सापेक्ष रूप से नहीं, बल्कि निरपेक्ष अंतर। रिज़ॉल्यूशन तक रखने के बजाय पहले निकलें, तो यह लागत दो बार चुकानी पड़ती है, स्प्रेड अलग से।
Polymarket के CLOB पर ऐतिहासिक रूप से फीस का ढाँचा बिल्कुल अलग रहा है: खुद ट्रेड पर फीस लगभग शून्य, जिससे पूरी लागत स्प्रेड और डेप्थ में चली जाती है। इसलिए वेन्यू के हिसाब से एक ही रणनीति के अर्थशास्त्र बिल्कुल अलग होते हैं, और एक ही फीस मॉडल इस्तेमाल करने वाली किसी भी क्रॉस-वेन्यू तुलना का कोई आधार नहीं। अब हम एक स्थिर संख्या के बजाय हर वेन्यू के लिए अलग फीस callable रखते हैं।
अगर प्रेडिक्शन-मार्केट बैकटेस्ट रिपोर्ट की केवल एक पंक्ति पढ़ें, तो उसे संभाव्यता अंकों में दी गई फीस की पंक्ति बनाएँ। 50¢ वाले मार्केट में 1.2 अंक की अनुमानित बढ़त वाली रणनीति Kalshi पर बाकी किसी भी लागत से पहले ही घाटे की रणनीति है। यह बात पहले पन्ने पर दिखनी चाहिए, पाठक को हिसाब लगाकर निकालनी नहीं पड़नी चाहिए।
दिन 3: बुक सीढ़ीनुमा है, और छोटी है
हमारा इम्पैक्ट मॉडल BTC परप ऑर्डर बुक के डेटा पर कैलिब्रेट किया गया square-root फ़ंक्शन था। उसका आकार यहाँ गलत है। $1 के इंस्ट्रूमेंट पर 1¢ का टिक होने से पूरी बुक में कीमत के केवल 99 संभावित स्तर होते हैं, और मध्यम लिक्विडिटी वाले मार्केट में सबसे ऊपरी स्तर पर कुछ सौ कॉन्ट्रैक्ट हो सकते हैं, फिर एक खाली जगह।
हम जिस आर्थिक-डेटा मार्केट को सैंपल कर रहे थे, उसका YES पक्ष का एक स्नैपशॉट यह है, रिज़ॉल्यूशन से लगभग 30 घंटे पहले:
| स्तर | मात्रा (कॉन्ट्रैक्ट) | खरीद की संचयी लागत |
|---|---|---|
| 42¢ | 310 | 310 @ औसत 42.0¢ |
| 43¢ | 85 | 395 @ औसत 42.2¢ |
| 45¢ | 140 | 535 @ औसत 42.9¢ |
| 49¢ | 600 | 1,135 @ औसत 46.1¢ |
1,000 कॉन्ट्रैक्ट का ऑर्डर — पाँच सौ डॉलर का जोखिम, क्रिप्टो में मामूली रकम — प्रभावी कीमत को चार सेंट ऊपर ले जाता है। चार सेंट फीस से दोगुने से भी ज़्यादा हैं। यहाँ कोई ऐसा सहज फ़ंक्शन नहीं जिसे फिट किया जा सके; आपको हर स्तर पर बुक में आगे बढ़ना होगा, वरना आँकड़े गढ़ रहे होंगे। हमने इस एसेट क्लास के लिए sqrt मॉडल हटाया और सीधे बुक पर चलने वाला कोड लिखा, जो धीमा है और सही भी।
इसी दौरान मैंने खुद को यह सोचकर चिढ़ते पकड़ा कि ये मार्केट “इतने छोटे हैं कि मायने ही नहीं रखते।” वे छोटे इसलिए हैं क्योंकि यहाँ एक समय-सीमा वाले एक वास्तविक दुनिया के सवाल की कीमत तय होती है, और बुधवार को अमेरिका में शुरुआती बेरोज़गारी दावों पर राय रखने वाले लोग सीमित हैं। आकार ही है मार्केट। इसकी शिकायत करना वैसा है जैसे शिकायत करना कि पोकर टेबल पर केवल नौ लोग बैठ सकते हैं।
दिन 4: वह दिन जब इक्विटी कर्व खूबसूरत थी
1,400 मार्केट पर Sharpe 4.1। एकदम सुचारु। इसे देखकर हर शोधकर्ता का पेट बैठ जाना चाहिए — मेरा भी बैठा, आखिरकार, स्क्रीनशॉट लेने के लगभग चालीस मिनट बाद।
बग resampler में था। कम लिक्विडिटी वाले मार्केट की प्राइस हिस्ट्री अनियमित टाइमस्टैम्प पर मिलती है, इसलिए हमने उसे नियमित प्रति-घंटा ग्रिड पर दोबारा इंडेक्स किया। हर संग्रहित सीरीज़ का आखिरी बिंदु सेटलमेंट वैल्यू होता है, 1.00 या 0.00। हमारी reindex प्रक्रिया ने दिशा पर रोक लगाए बिना nearest-neighbour fill किया, इसलिए जिन मार्केट्स में आखिरी ट्रेड रिज़ॉल्यूशन से कई घंटे पहले हुआ था, उनमें सेटलमेंट वैल्यू उस खाली अंतराल में पीछे की ओर फैल गई। मॉडल आज की पंक्ति में कल का जवाब पढ़ रहा था — ठीक उन्हीं कम लिक्विडिटी वाले मार्केट्स में जहाँ डेप्थ की सीमा से टकराए बिना बड़ा दांव लगाया जा सकता था।
लगातार चलने वाले इंस्ट्रूमेंट पर nearest-neighbour fill ठीक है। जिस इंस्ट्रूमेंट का आखिरी अवलोकन ही सही जवाब हो, उस पर यह lookahead मशीन बन जाता है। अब हम यह assert करते हैं कि हर fill केवल आगे की दिशा में हो और सेटलमेंट पंक्ति पर टैग लगाकर उसे फ़ीचर की गणना से बाहर रखा जाए। यह assert नौ पंक्तियों का है और पूरे हफ़्ते में लिखा हमारा सबसे मूल्यवान कोड है।
दिन 5–6: 1,412 मार्केट, लगभग 180 दांव
प्रेडिक्शन मार्केट्स में सैंपल साइज़ दोस्ताना चेहरे वाला जाल है। आप 1,412 मार्केट निपटाते हैं, लगता है आपके पास 1,412 अवलोकन हैं, और उसी हिसाब से t-stat निकालते हैं। लेकिन एक ही रविवार को हुए चौदह NFL गेम्स में मौसम की एक ही प्रणाली, चोट की रिपोर्ट का एक ही प्रकाशन और सट्टेबाज़ों का साझा प्रवाह होता है। राज्य-स्तर के इक्यावन चुनावी मार्केट एक राष्ट्रीय झुकाव साझा करते हैं। “क्या X 31 मार्च तक होगा” और “क्या X 30 जून तक होगा” अलग एक्सपायरी वाले एक ही दांव हैं, और दोनों साथ निपटते हैं।
हमने मार्केट्स को मूल घटना-स्रोत और रिज़ॉल्यूशन तारीख के आधार पर क्लस्टर किया और प्रभावी स्वतंत्र संख्या लगभग 180 निकली। जिन प्रभाव आकारों को हम देख रहे थे, उनमें असली बढ़त को शोर से अलग करने के लिए यह पर्याप्त नहीं है। प्रति-मार्केट बूटस्ट्रैपिंग से भी समस्या नहीं सुलझती, क्योंकि बूटस्ट्रैप को पंक्तियों के बजाय क्लस्टर फिर से सैंपल करने होते हैं। इसे गलत करने से सांख्यिकीय महत्त्व चुपचाप दो या तीन गुना बढ़ जाता है।
दिन 7: रिज़ॉल्यूशन भी एक संभाव्यता वितरण है
जिन बातों का हमने बिल्कुल मॉडल नहीं बनाया था, और जिन्हें मुश्किल से सीखना पड़ा:
- समय से पहले रिज़ॉल्यूशन। “31 दिसंबर तक” वाला मार्केट 4 अगस्त को ही निपट सकता है, जब घटना वास्तव में घट जाए। आपकी पूँजी जल्दी वापस आ जाती है और होल्डिंग अवधि कभी भी कॉन्ट्रैक्ट के नाम से निकलने वाली अवधि थी ही नहीं।
- विवाद। Oracle से निपटने वाले मार्केट्स में चुनौती देने की अवधि होती है। घटना के बाद भी पोज़िशन कई दिन अनिर्णीत रह सकती है, और कुछ मामलों में नतीजा उस स्पष्ट लगने वाली व्याख्या से पलट जाता है।
- रद्दीकरण। अस्पष्ट स्रोत डेटा के चलते मार्केट रद्द हो जाता है और सभी को पैसा वापस मिल जाता है। हमारे नमूने में ऐसे मार्केट 1% से कम हैं, लेकिन वे ठीक उन्हीं अस्पष्ट सवालों में समूहित होते हैं जिन्हें मॉडल गलत कीमत वाला पाता है।
- पूँजी का अटकना। 90 दिनों में मिला 3-पॉइंट का लाभ और 6 घंटों में मिला 3-पॉइंट का लाभ तुलनीय नहीं हैं, और पूँजी-समय के हर से विभाजित किए बिना कुल बढ़त बताने वाला बैकटेस्ट हमेशा धीमी रणनीति को तरजीह देगा।
हमने सिम्युलेटर में होल्डिंग लागत का एक घटक और रिज़ॉल्यूशन तारीख में थोड़ा बदलाव जोड़ा। दोनों का सटीक होना मुश्किल है। दोनों इस निहित मान्यता से बेहतर हैं कि रिज़ॉल्यूशन बताई गई तारीख पर ही और निश्चित रूप से होगा।
दिन 8: हम क्या छोड़ेंगे और सबसे पहले क्या करेंगे
- रिटर्न-आधारित ढाँचे को पूरी तरह छोड़ दें। टर्मिनल पेऑफ़ वाले इंस्ट्रूमेंट पर वोल-टार्गेटिंग रिस्क लेयर न ढालें। संभाव्यता और दांव की भाषा समझने वाली बेट-साइज़िंग लेयर लिखें। पुरानी लेयर को फिट करने की कोशिश में हमारे दो दिन गए।
- रणनीति से पहले फीस फ़ंक्शन बनाएँ। जिस हर वेन्यू पर ट्रेड करने का इरादा है, उसके लिए ब्रेक-ईवन बढ़त कर्व निकालें और उसे डेस्क के ऊपर टाँगें। इससे लगभग आधे विचार बैकटेस्ट चलाने की लागत आने से पहले ही खारिज हो जाते हैं।
- पहले दिन से बुक में आगे बढ़कर ऑर्डर निष्पादित करें। लगातार चलने वाले मार्केट से लाया गया कोई भी पैरामीट्रिक इम्पैक्ट मॉडल ऐसी तरह गलत होगा जिससे आपको अपनी रणनीति बेहतर लगेगी।
- गिनती से पहले क्लस्टर करें। प्रभावी सैंपल साइज़ के लिए क्लस्टरिंग कुंजी उसी समय तय करें जब आप यूनिवर्स तय करें, अपना पसंदीदा Sharpe मिलने के बाद नहीं।
- Fill की दिशा पर assert लगाएँ। हर join पर एक पंक्ति। अगर सीरीज़ सही नतीजे पर खत्म होती है, तो backward fill को समीक्षा में पकड़ने लायक चीज़ के बजाय शुरू से ही बग मानें।
ये आठ दिन सार्थक रहे, मुख्यतः इसलिए कि प्रेडिक्शन मार्केट्स उस अस्पष्टता को हटा देते हैं जो क्रिप्टो बैकटेस्ट में खुद को आसानी से धोखा देने देती है। न हाथ के इशारे से समझाने वाली फंडिंग रेट है, न बहस करने लायक मार्क-प्राइस परंपरा। बस एक सवाल, एक समय-सीमा और एक जवाब। यहाँ बैकटेस्ट गलत हो, तो उस गलती की ओर उंगली उठाई जा सकती है।
← सभी पोस्ट


