2 सितंबर 2026 · माइक्रोस्ट्रक्चर

आपका लिमिट ऑर्डर भरा नहीं: क्यू पोज़िशन, मेकर बैकटेस्ट और आपके गढ़े हुए Sharpe पर एक पत्र

आपका लिमिट ऑर्डर भरा नहीं: क्यू पोज़िशन, मेकर बैकटेस्ट और आपके गढ़े हुए Sharpe पर एक पत्र

आपने पिछले हफ़्ते नोटबुक भेजी थी: वही सिग्नल, वही यूनिवर्स, BTCUSDT perp डेटा के वही 14 महीने। सिर्फ़ execution बदला था। आपने स्प्रेड पार करना बंद किया और एक टिक अंदर बोली लगाकर ऑर्डर बिठाने शुरू किए, और Sharpe 0.42 से बढ़कर 2.14 हो गया। आपने पूछा कि क्या यह असली है या आपने कुछ गड़बड़ कर दी।

आपने कुछ गड़बड़ की है। मैं आपको ठीक-ठीक दिखाना चाहता हूँ कि कहाँ, क्योंकि बग एक लाइन का है और उससे मिलने वाला सबक उस लाइन से कहीं बड़ा है।

यह रहा आपका fill rule, आपके इंजन से जस का तस लिया हुआ:

if bar.low <= limit_price: fill(limit_price)

इसका मतलब है: अगर इस मिनट में बाज़ार में मेरे भाव पर या उससे नीचे ट्रेड हुआ, तो मेरा ऑर्डर मेरे भाव पर भर गया। असल में यह नियम दर्ज करता है कि भाव आपके स्तर को छू गया। छूना और ऑर्डर भरना एक बात नहीं हैं। इन दोनों के बीच एक क्यू है, और आपने मॉडल में उस क्यू को खाली मान लिया है।

आपके आगे कौन खड़ा है

जब आप BTCUSDT perp पर 84,120.0 की बोली लगाते हैं, तो वहाँ पहले से मौजूद सारे ऑर्डरों के पीछे लगते हैं। उस कॉन्ट्रैक्ट के टॉप-ऑफ़-बुक स्तर पर, दिन के समय के हिसाब से वहाँ आम तौर पर 4 से 30 BTC तक होते हैं; आपकी सैंपल अवधि में मध्यिका करीब 12 BTC है। आपका ऑर्डर 0.4 BTC का है। आपके ट्रेड के लिए विक्रेताओं को उस स्तर पर इतना कुल आकार बेचना होगा कि आपसे पहले वहाँ आए सभी ऑर्डर पूरे हो जाएँ। यह भी आपके ऑर्डर के नीचे से स्तर रद्द हो जाने या बाज़ार के ऊपर निकल जाने से पहले होना चाहिए।

इसलिए आपके बैकटेस्ट को यह नहीं पूछना चाहिए कि "क्या भाव 84,120.0 तक पहुँचा", बल्कि यह कि "क्या मेरा ऑर्डर वहाँ रहने के दौरान कम से कम 12.4 BTC की मार्केट सेल्स 84,120.0 पर निष्पादित हुईं।" ये दोनों घटनाएँ बिल्कुल अलग हैं। आपके डेटा में इनके बीच करीब तीन गुना का फ़र्क है।

12.4 BTCभाव छूने पर आपके आगे मौजूद आकार की मध्यिका
100%वह fill rate जिसे आपका बैकटेस्ट मानकर चलता है
31%वे भाव-स्पर्श जिनमें आपकी क्यू पूरी हुई
4,180ट्रेड, जो घटकर करीब 1,300 रह गए

तीन fill rules, तीन अलग रणनीतियाँ

मैंने उसी सिग्नल को, उन्हीं एंट्री, फीस और फंडिंग के साथ, तीन execution models में फिर चलाया। सिर्फ़ fill logic बदला।

Fill ruleFillsभरने के बाद औसत 60s बढ़तSharpe
स्पर्श: low <= limit4,180+2.6 bp2.14
कड़ाई से पार होना: low < limit - 1 tick1,712+0.4 bp0.61
स्तर पर वॉल्यूम आधारित क्यू सिमुलेशन1,306+0.9 bp0.77

बीच वाली पंक्ति वह मोटा-मोटा सुधार है जिसे लोग सबसे पहले अपनाते हैं: fill तभी गिनें जब बाज़ार आपके भाव को साफ़ तौर पर पार करके ट्रेड करे। तर्क यह है कि भाव आपके आगे निकल गया, तो उसने आपका ऑर्डर ज़रूर खपाया होगा। मोटे तौर पर यह सही है और ज़्यादातर कल्पित नतीजों को मिटा देता है। लेकिन इसमें एक गंभीर पक्षपात भी है, जिस पर आगे बात करूँगा।

आख़िरी पंक्ति वाला मॉडल आपको बनाना चाहिए। इसके लिए L3 फ़ीड या हर ऑर्डर का अलग-अलग पुनर्निर्माण ज़रूरी नहीं है। आपके पास इसका ज़्यादातर डेटा पहले से है।

aggTrades से बनाया जा सकने वाला क्यू सिमुलेशन

क्लाइन्स के बजाय एग्रीगेट ट्रेड स्ट्रीम लें। हर ट्रेड रिकॉर्ड में भाव, मात्रा, टाइमस्टैम्प और maker-side फ़्लैग होता है, जो बताता है कि आक्रामक पक्ष खरीद रहा था या बेच रहा था। आपके अपने पैसिव ऑर्डर का कामचलाऊ सिमुलेशन बनाने के लिए इतना काफ़ी है:

  1. जब आपका ऑर्डर लगता है, तो अपने भाव पर मौजूद कुल आकार का स्नैपशॉट लें। अगर आपके पास सिर्फ़ 100ms की बुक फ़ीड है, तो आख़िरी स्नैपशॉट इस्तेमाल करें; आप जिस गलती को सुधार रहे हैं, उसके मुकाबले यह त्रुटि छोटी है।
  2. queue_ahead = resting_size सेट करें। सावधानी बरतें और मानें कि आप क्यू में सबसे पीछे हैं। आप वहीं होते हैं, बशर्ते स्तर बनाने वाले आप खुद न हों।
  3. ट्रेड स्ट्रीम को आगे बढ़ाएँ। आपकी कीमत पर या उससे नीचे होने वाला हर sell-aggressor ट्रेड अपनी मात्रा से queue_ahead घटाता है। जब यह ऋणात्मक हो जाए, तो आपका ऑर्डर उसी टाइमस्टैम्प पर, आपके भाव पर भर जाता है।
  4. अगर भाव एक टिक दूर चला जाए, तो क्यू को शून्य पर रीसेट न करें। उसे धीरे-धीरे घटाएँ। स्तर पुराना पड़ने पर आपके आगे के कुछ ऑर्डर रद्द हो जाते हैं, कुछ नहीं। भाव से पूरी तरह दूर रहने पर हर सेकंड 30-40% की कमी मेरे पुनर्निर्माणों से बेहतर मेल खाती थी, दोनों चरम मान्यताओं से भी बेहतर।
  5. अगर आपकी रणनीति ऑर्डर रद्द करके दोबारा लगाने वाली है, तो दोबारा लगाया गया ऑर्डर नए स्तर की क्यू के पीछे रखें। लोग यही चरण छोड़ देते हैं, और यहीं बाकी कल्पित नतीजे छिपे रहते हैं।

चरण 2 पर आप मुझसे बहस करना चाहेंगे। हाँ, कभी-कभी आप क्यू के आगे होते हैं, क्योंकि आपने स्तर बनते ही ऑर्डर लगा दिया। ठीक है—इसे मापें, मानकर न चलें। ऑर्डर लगाते समय मौजूद कुल आकार लॉग करें और डेटा से पता करें कि आपके कितने ऑर्डर सच में शुरुआत में लगे थे। आपकी रणनीति में यह 11% था, क्योंकि आपका सिग्नल भाव में हलचल के बाद आता है। यानी जिस स्तर पर आप जुड़ रहे हैं, वह पहले से मौजूद है और वहाँ पहले से भीड़ है।

आपको वही fills मिलते हैं जिन्हें न पाने की आप कामना करते हैं

अब उस हिस्से पर आते हैं जो सचमुच मायने रखता है, और जिसकी वजह से कड़ाई से पार होने वाला नियम पक्षपाती है।

सोचिए कि आपकी बोली पूरी तरह कब खपती है। ऐसा तब होता है जब बिकवाली का दबाव पूरे स्तर को खा जाने जितना बड़ा हो। यानी परिभाषा से ही यह वह पल है जब बाज़ार आपके भाव से नीचे जा रहा होता है। जिन fills को लेकर आप सबसे ज़्यादा पक्के होते हैं, उन्हीं के तुरंत बाद आपका भाव बाज़ार के उलट पड़ जाता है।

अपने fills को उनके तरीके के हिसाब से बाँटें और 60-सेकंड का मार्क-आउट मापें:

Fill का प्रकारfills का हिस्सा60s पर मार्क-आउट
स्तर पर ट्रेड हुआ, भाव उछलकर ऊपर गया38%+3.1 bp
स्तर पर ट्रेड हुआ, भाव स्थिर रहा21%+0.2 bp
भाव 2+ टिक पार करके गया41%−2.4 bp

आपके भोले-भाले बैकटेस्ट में तीनों समूहों के fills शामिल थे और तीनों को मुफ़्त मान लिया गया था। कड़ाई से पार होने वाला नियम लगभग सिर्फ़ तीसरा समूह देता है, इसीलिए उसकी बढ़त क्यू सिमुलेशन से भी ज़्यादा गिर गई। दोनों ही सही नहीं हैं। क्यू सिमुलेशन आपको एक यथार्थवादी मिश्रण देता है, और पूरा खेल उसी मिश्रण का है: पैसिव execution से आपको स्प्रेड मिलता है और प्रतिकूल चयन की कीमत चुकानी पड़ती है। इन दोनों का अनुपात ही आपकी असली रणनीति है।

इक्विटीज़ डेस्क की पुरानी व्याख्या आज भी सही बैठती है: maker ऑर्डर वह मुफ़्त विकल्प है जो आपने बाज़ार को दिया है। कोई उसे तभी इस्तेमाल करता है जब उसका इस्तेमाल करना फ़ायदेमंद हो। आपके बैकटेस्ट ने प्रीमियम तो गिना, पर यह भूल गया कि विकल्प का भुगतान वाला हिस्सा भी है।

जो ट्रेड आपको नहीं मिले, वे सिर्फ़ लागत नहीं, पूरी रणनीति बदल देते हैं

यह वह बात है जिस पर मैं चाहता हूँ कि आप सबसे ज़्यादा विचार करें। जब taker execution का मॉडल गलत होता है, तो सही ट्रेड गलत भाव पर मिलते हैं और फीस का सुधार ज़्यादातर समस्या ठीक कर देता है। जब maker execution का मॉडल गलत होता है, तो आपको पूरी तरह गलत ट्रेड मिलते हैं। आपकी 4,180 एंट्री में से करीब 2,900 कभी हुई ही नहीं। उनमें से कुछ आपके बेहतरीन सिग्नल थे—ऐसी कैंडलों पर जो तेज़ी से उछलीं और पलट गईं। ठीक यही वह स्थिति है जिसमें बाज़ार आपके बिना आगे निकल गया।

इसलिए आपका unfilled branch असली नियमों के साथ होना चाहिए। जब सिग्नल पुराना पड़ जाए और एंट्री न भरी हो, तो रणनीति क्या करती है? taker ऑर्डर से पीछा करके स्प्रेड और इम्पैक्ट चुकाती है? नीचे नया ऑर्डर लगाकर अलग एंट्री आधार स्वीकार करती है? ट्रेड छोड़कर बिना पोज़िशन रहती है? हर विकल्प से इक्विटी कर्व में बड़ा फ़र्क पड़ता है, और इनमें से कोई भी "मान लो कि ऑर्डर भर गया" नहीं है। हमारे रन में, एक ईमानदार पीछा करने का नियम जोड़ने से (20 सेकंड तक न भरने पर भाव पार करके ऑर्डर लगाना, अधिकतम 3 bp स्लिपेज तक) छूटे हुए ट्रेडों का करीब एक तिहाई और भोले बैकटेस्ट व क्यू-सिम Sharpe के बीच के अंतर का लगभग आधा वापस मिला। यह सचमुच दिलचस्प नतीजा है, और यह तभी सामने आता है जब fill model इतना वास्तविक हो कि सवाल के मायने हों।

10 मिनट की आसान जाँच: अपने लाइव पेपर-ट्रेडिंग लॉग और बैकटेस्ट की एक ही समयावधि लें। PnL नहीं, fill rate की तुलना करें। अगर बैकटेस्ट आराम से पड़े 100% ऑर्डर भर देता है और पेपर ट्रेडिंग में 34% भरते हैं, तो आप रणनीतियों की तुलना नहीं कर रहे; आपके fill model में बग है। किसी भी रिटर्न नंबर को देखने से पहले इसे ठीक करें।

जब बात चल ही रही है, दो छोटी बातें और

Post-only अस्वीकृतियाँ। अगर maker fee tier पक्का करने के लिए आप post-only इस्तेमाल करते हैं और आपके फ़ैसले व एक्सचेंज की पुष्टि के बीच बुक बदल जाती है, तो ऑर्डर वहाँ लगने के बजाय अस्वीकार होकर लौटता है। हमारे पेपर लॉग में सामान्य समय के दौरान BTCUSDT पर ऐसे प्रयासों में 3-6% और अमेरिकी CPI आँकड़ा जारी होने के बाद वाले मिनट में 15% से ज़्यादा अस्वीकार हुए। अस्वीकृत ऑर्डर न भरा हुआ ऑर्डर है, न ही ऐसा आराम से पड़ा ऑर्डर जो नहीं भरा; वह ऐसा ट्रेड है जो कभी था ही नहीं। अगर आपके बैकटेस्ट में यह स्थिति नहीं है, तो जिन बाज़ार स्थितियों की आपको सबसे ज़्यादा परवाह है, उन्हीं में आपके ट्रेडों की संख्या बढ़ा-चढ़ाकर दिखाई जाएगी।

खुद के साथ ट्रेड रोकना और आपका बाज़ार पर असर। 0.4 BTC पर आप BTCUSDT को नहीं हिला रहे, इसलिए इसे छोड़ दें। लेकिन आपने कहा था कि इसे एक मिड-कैप alt perp पर चलाना चाहते हैं, जहाँ टॉप-ऑफ़-बुक का कुल मूल्य अक्सर $15k से कम होता है। वहाँ आपका ऑर्डर क्यू का एक अहम हिस्सा है, और आपके स्नैपशॉट में क्यू-आहेड का आँकड़ा आपके पिछले ऑर्डर की मौजूदगी का असर भी शामिल करता है। जब आपका आकार वहाँ पड़े कुल आकार के करीब 10% से ज़्यादा हो जाए, तो सिमुलेशन को यह मानना होगा कि दूसरे प्रतिभागी आपकी मौजूदगी पर प्रतिक्रिया देते हैं। सच कहूँ तो, उस मुकाम पर मैं आपके या मेरे बनाए किसी भी सिमुलेशन से ज़्यादा पेपर ट्रेडिंग पर भरोसा करूँगा।

क्यू सिमुलेशन के साथ इसे फिर चलाएँ और fill के प्रकार के हिसाब से बाँटी गई मार्क-आउट तालिका मुझे भेजें। अगर उछाल वाले समूह में अब भी ज़्यादातर बढ़त है और पार होने वाला समूह सारी बढ़त नहीं खा रहा, तो शायद आपके पास पेपर ट्रेडिंग में आज़माने लायक कुछ है। अगर पूरी रणनीति उन 2,900 fills पर टिकी थी जो आपको कभी मिलने ही नहीं थे, तो यह अभी जान लेना बेहतर है—चार हफ़्ते पेपर अकाउंट को वह करते देखते रहने से, जिसका वादा नोटबुक ने किया था।

लिमिट ऑर्डरक्यू पोज़िशनप्रतिकूल चयनबैकटेस्टिंगक्रिप्टो फ्यूचर्स
साझा करेंXLinkedInFacebookRedditHacker NewsWhatsAppTelegramEmail
← सभी पोस्ट