← लेखों की सूची पर वापस जाएँ
June 28, 2026
5 मिनट का पठन

ऑब्जेक्टिव-फंक्शन डिज़ाइन: जिस मेट्रिक को आप ऑप्टिमाइज़ करते हैं वही गुप्त रूप से आपकी रणनीति चुन लेती है

#algotrading
#backtest
#overfitting
#objective-function
#optimization
#sharpe
#validation
🎯
Part 1 of 9 · Collection
Backtesting Without Fooling Yourself

"बिना भ्रम के बैकटेस्ट" सीरीज़ का हिस्सा।

📄 यह लेख एक रिसर्च पेपर बन गया। नीचे दिया गया हर आंकड़ा एक डिटरमिनिस्टिक स्क्रिप्ट से आता है जो नियंत्रित ग्राउंड ट्रुथ बनाता है — एक सिंथेटिक मार्केट जिसमें मध्यम सिग्नल बैंड में एक ज्ञात एज हो और हर जगह फैट-टेल्ड नॉइज़ हो — फिर छह अलग-अलग ऑब्जेक्टिव फंक्शनों के तहत एक थ्रेशोल्ड सर्च चलाता है और out of sample मापता है कि हर ऑब्जेक्टिव वास्तव में कौन-सी रणनीति चुनता है। पेपर ऑनलाइन (इंटरैक्टिव वर्ज़न + PDF) objective-design.marketmaker.cc पर पढ़ें, कोड और डेटा github.com/suenot/objective-design-degeneracy पर।

आप सर्वश्रेष्ठ रणनीति चाहते हैं। तो आप एक सर्च चलाते हैं — एक थ्रेशोल्ड, एक लुकबैक, एक स्टॉप डिस्टेंस स्वीप करते हैं, और जो भी सेटिंग सबसे ऊंचा स्कोर करे उसे रखते हैं। सर्च समाप्त होता है और आपको एक विजेता सौंपता है। तर्कसंगत। मानक। यही तो हर ऑप्टिमाइज़र, ग्रिड सर्च और हाइपरपैरामीटर ट्यूनर धरती पर करता है।

लेकिन क्रिया पर ध्यान दें: सबसे ऊंचा स्कोर करेकिसमें सबसे ऊंचा? सर्च कुछ भी ताज पहनाने से पहले, आपको उसे मैक्सिमाइज़ करने के लिए एक ही संख्या देनी पड़ी — एक ऑब्जेक्टिव फंक्शन। PnL। Sharpe। जिन बार्स पर ट्रेड किया उन पर Sharpe। रिटर्न-ओवर-मैक्स-ड्रॉडाउन। आपने इनमें से एक टाइप किया, शायद बिना ज़्यादा सोचे, और फिर सर्च ने दस लाख इवैल्युएशन ठीक वही करने में बिताए जो आपने कहा था।

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

पूरा लेख एक तालिका में यहाँ है। एक थ्रेशोल्ड सर्च, एक असली, ज्ञात एज वाला सिंथेटिक मार्केट, छह ऑब्जेक्टिव — और वे छह रणनीतियाँ जो वे चुनते हैं, held-out डेटा पर मापी गईं:

ऑब्जेक्टिव (सर्च क्या मैक्सिमाइज़ करता है) औसत मार्केट एक्सपोज़र In-sample Sharpe Out-of-sample Sharpe डिजेनरेट विजेता
Raw PnL 0.859 1.76 1.61 0%
Full-Timeline Sharpe 0.740 1.82 1.71 0%
Per-Trade ("सक्रिय") Sharpe 0.286 1.00 0.70 57%
एक्सपोज़र फ्लोर (emin=0.20e_{\min}=0.20) 0.740 1.82 1.71 0%
Trade-Count श्रिंकेज (conf_k=40=40) 0.523 1.54 1.31 20.7%
रोबस्ट (फ्लोर + conf_k) 0.675 1.78 1.70 0.2%

600 स्वतंत्र सीड्स, हर एक में T=2000T = 2000 बार्स, प्रति सर्च 80 उम्मीदवार थ्रेशोल्ड, in-sample और out-of-sample स्वतंत्र रूप से लिए गए। वार्षिकीकृत Sharpe (252 पीरियड/वर्ष)। "डिजेनरेट" = चुना गया विजेता 5% से कम समय मार्केट में रहता है, या नॉन-पॉज़िटिव out-of-sample Sharpe देता है। इस मार्केट का सच्चा ऑप्टिमम 1.77 का वार्षिकीकृत out-of-sample Sharpe है।

तीसरी पंक्ति को तब तक पढ़ें जब तक चुभे नहीं। Per-Trade Sharpe — एक्टिविटी-कंडीशनल मेट्रिक्स के पूरे परिवार का प्रतिनिधि (per-trade Sharpe, expectancy, van Tharp का SQN, win rate), सभी केवल उन बार्स पर गणना की गई जिन पर ट्रेड किया गया — एक ऐसी रणनीति चुनता है जो out of sample आधे से ज़्यादा दूसरों से खराब है, और यह 57% बार डिजेनरेट रूप से करता है। यह कोई सूक्ष्म रूप से खराब ऑब्जेक्टिव नहीं है। इस डेटा पर यह एक जाल है, और सर्च आधे से ज़्यादा बार उसमें फंस जाता है। अब ठीक ऊपर वाली पंक्ति पढ़ें: साधारण Full-Timeline Sharpe कभी डिजेनरेट नहीं होता और out of sample 1.71 स्कोर करता है। यही पूरी मरम्मत का पंचलाइन है, जो जल्दी ही खुल गया — ईमानदार समाधान बस पूरी टाइमलाइन पर मापना है; नीचे की पंक्तियों में ज़्यादा शानदार सुधार, अपने सर्वश्रेष्ठ पर भी, केवल उस संख्या के बराबर पहुँचते हैं, कभी उससे आगे नहीं। यह लेख उस जाल और उसकी मरम्मत की एनाटॉमी है, जिसमें ग्राउंड ट्रुथ पूरे समय ज्ञात रहती है ताकि "क्या ऑब्जेक्टिव ने सही रणनीति चुनी?" एक तथ्य हो, राय नहीं।

एक्ट 1 — गुप्त फैसला: गुडहार्ट का नियम ही सर्च है

A parameter search drawn as a funnel of many candidate strategy curves, with a single lens labeled OBJECTIVE stamping one curve as the winner while identical-looking curves are discarded, illustrating that the choice of metric silently selects the strategy

1975 में अर्थशास्त्री चार्ल्स गुडहार्ट ने एक वाक्य लिखा जो उनके बाकी सारे काम से ज़्यादा जीवित रहा:

"Any observed statistical regularity will tend to collapse once pressure is placed upon it for control purposes."

लोकप्रिय व्याख्या, आमतौर पर मैरिलिन स्ट्रैदर्न के नाम, ज़्यादा कसी हुई है: जब कोई माप लक्ष्य बन जाता है, तो वह एक अच्छा माप नहीं रह जाता।

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

यह वही चूक है जिसे AI-सेफ्टी साहित्य रिवॉर्ड हैकिंग कहता है: एक एजेंट जो आपके चाहे हुए के प्रॉक्सी को ऑप्टिमाइज़ कर रहा है, वह प्रॉक्सी और लक्ष्य के बीच हर खाई का फ़ायदा उठाएगा। आपका सर्च वही एजेंट है। "Sharpe ratio" वह प्रॉक्सी है। "एक रणनीति जिस पर मैं अगली तिमाही असली पैसा ट्रेड करने का भरोसा कर सकूं" वह लक्ष्य है। उनके बीच की खाई में ही पूरा अनुशासन बसता है।

उस खाई को खुलते देखने के लिए, हमें एक ऐसी दुनिया चाहिए जहाँ हम सच्चाई जानते हों। तो हम एक बनाते हैं।

मार्केट। हर पीरियड में, एक प्रेडिक्टर sts_t (एक स्टैंडर्ड-नॉर्मल सिग्नल) आता है, उसके बाद वह रिटर्न rtr_t जिसे वह आंशिक रूप से प्रेडिक्ट करता है। एज असली है लेकिन सीमित है — यह केवल एक मध्यम सिग्नल बैंड st1|s_t| \le 1 के भीतर मौजूद है, और उसके बाहर गायब हो जाता है:

rt=βst1[st1]+εt,β=0.3,εtt4 (unit variance).r_t = \beta\, s_t \cdot \mathbf{1}\big[\,|s_t| \le 1\,\big] + \varepsilon_t, \qquad \beta = 0.3, \qquad \varepsilon_t \sim t_{4}\ (\text{unit variance}).

दो डिज़ाइन चुनाव मायने रखते हैं। पहला, एज मध्यम बैंड में रहता है: एक्सट्रीम सिग्नल कोई प्रेडिक्टिव जानकारी नहीं रखते, इसलिए एक रणनीति को बीच का हिस्सा ट्रेड करना चाहिए और टेल्स को छोड़ देना चाहिए। दूसरा, नॉइज़ εt\varepsilon_t फैट-टेल्ड है (Student-tt 4 डिग्री ऑफ़ फ़्रीडम के साथ, वैसी भारी टेल जो असली रिटर्न्स में वास्तव में होती है) — लेकिन यह इंग्रेडिएंट यहाँ यथार्थवाद के लिए है, मैकेनिज़्म के लिए नहीं। यह कहना लुभावना है कि फैट टेल्स ही वह चीज़ हैं जो जाल को संभव बनाती हैं, और हमने ठीक यही माना जब तक हमने कंट्रोल नहीं चलाया: इस मार्केट का एक गॉसियन-नॉइज़ वर्ज़न (परिणामों में gaussian_control, 300 सीड्स) जाल को लगभग अपरिवर्तित रूप से दोहराता है — per-trade ऑब्जेक्टिव गॉसियन नॉइज़ के तहत अब भी 55.7% समय डिजेनरेट होता है फैट टेल्स के 57.0% के मुकाबले, और उसका out-of-sample Sharpe 0.71 है 0.70 के मुकाबले। तो जाल फैट टेल्स के बारे में नहीं है। यह एक शुद्ध स्मॉल-सैंपल-प्लस-सिलेक्शन प्रभाव है: ~20 लो-एक्सपोज़र थ्रेशोल्ड में से, मुट्ठी भर ऑब्ज़र्वेशन पर गणना किए गए Sharpe का मैक्सिमम लें, और कोई न कोई लकी कोना हमेशा शानदार दिखेगा। कोई भी नॉइज़ डिस्ट्रीब्यूशन यह करता है; कुछ ही बार्स तक मार्केट में रहने वाली रणनीति महज़ किस्मत से कुछ फेवरेबल मूव्स झेल सकती है और एक ऐसा in-sample आंकड़ा पेश कर सकती है जिसका कोई मतलब नहीं। हम फैट टेल्स इसलिए रखते हैं क्योंकि असली रिटर्न्स में वे होती हैं, इसलिए नहीं कि जाल को उनकी ज़रूरत है।

रणनीति। एक-पैरामीटर परिवार। सिग्नल की दिशा में ट्रेड करें जब भी उसका मैग्नीट्यूड एक थ्रेशोल्ड θ\theta से कम हो, वरना फ्लैट रहें:

post=sign(st)1[stθ].\text{pos}_t = \operatorname{sign}(s_t)\cdot \mathbf{1}\big[\,|s_t| \le \theta\,\big].

एक बहुत छोटा θ\theta केवल सबसे छोटे, सबसे साधारण सिग्नल पर ट्रेड करता है — एक रेयर-ट्रेड लॉटरी, लगभग कभी मार्केट में नहीं। बैंड एज के पास वाला θ\theta पूरा असली एज पकड़ लेता है और अच्छी तरह एक्सपोज़्ड है। एक बहुत बड़ा θ\theta सब कुछ ट्रेड करता है, उन आउट-ऑफ़-बैंड बार्स सहित जो कोई एज नहीं रखते और केवल नॉइज़ जोड़ते हैं।

def gen_dataset(T, rng, beta=0.30, band=1.0, tail_df=4):
    s    = rng.standard_normal(T)
    edge = beta * np.where(np.abs(s) <= band, s, 0.0)          # edge ONLY inside |s| <= 1
    t    = rng.standard_t(tail_df, T) / np.sqrt(tail_df / (tail_df - 2.0))  # fat tails, unit var
    return s, edge + t

def simulate(s, r, theta):
    pos      = np.where(np.abs(s) <= theta, np.sign(s), 0.0)   # trade the band, skip outliers
    strat    = pos * r
    active   = pos != 0.0
    exposure = active.mean()                                   # fraction of bars in a position
    sharpe_full   = strat.mean()         / strat.std(ddof=1)            # on the WHOLE timeline
    sharpe_active = strat[active].mean() / strat[active].std(ddof=1)    # on ONLY the active bars
    return dict(exposure=exposure, n_trades=int(active.sum()),
                sharpe_full=sharpe_full, sharpe_active=sharpe_active, pnl=strat.sum())

क्योंकि हमने मार्केट खुद बनाया, हम सच्चाई सीधे गिन सकते हैं — 600 सीड्स पर हर थ्रेशोल्ड पर औसत परफ़ॉर्मेंस, out of sample। सच्चा ऑप्टिमम θ1.04\theta \approx 1.04 पर है: ठीक सिग्नल बैंड के किनारे पर, लगभग 70% समय मार्केट में (व्युत्पन्न: एक स्टैंडर्ड-नॉर्मल सिग्नल P(s1.04)=0.70P(|s|\le 1.04)=0.70 प्रायिकता के साथ s1.04|s|\le 1.04 के भीतर आता है), एक वार्षिकीकृत out-of-sample Sharpe 1.77 देता है। यह वह संख्या है जिसे हर ऑब्जेक्टिव खोजने की कोशिश कर रहा है। इसे नज़र में रखें: θ≈1.04, OOS Sharpe 1.77, टाइमलाइन का लगभग 70% मार्केट में। कोई भी ऑब्जेक्टिव जो इससे दूर कुछ चुनता है, वह ऑब्जेक्टिव की विफलता है, मार्केट की कठिनाई नहीं।

एक्ट 2 — जाल: आठ लकी ट्रेड्स, 21 का Sharpe, एक मृगतृष्णा

A slot machine paying out on a single lucky spin, showing eight trade tickets and a towering in-sample per-trade Sharpe of 21 that collapses to 0.13 out of sample, dramatizing a rare-trade lottery winner selected by a naive objective

अब इस मार्केट के एक कंक्रीट ड्रॉ पर एक भोला-भाला ऑब्जेक्टिव छोड़ते हैं — सीड 6। सीड के बारे में पूरी पारदर्शिता: यह पहला ड्रॉ था कोई रैंडम एक। हमने एक स्पष्ट रूप से डिजेनरेट per-trade विजेता के लिए सीड्स स्कैन किए और यही चुना, ठीक इसलिए ताकि मैकेनिज़्म को नज़रअंदाज़ करना असंभव हो। जो नतीजा यह दिखाता है वह पूरी तरह सामान्य है — जैसा एक्ट 3 पुष्टि करेगा, per-trade ऑब्जेक्टिव सभी सीड्स के 56% में 5% से कम एक्सपोज़र वाली लॉटरी चुनता है — लेकिन सीड 6 का मैग्नीट्यूड उस डिस्ट्रीब्यूशन के एक्सट्रीम छोर पर है। इसे एक आम विफलता के एक विशेष रूप से स्पष्ट उदाहरण की तरह पढ़ें, माध्य की तरह नहीं। हम Per-Trade Sharpe ऑप्टिमाइज़ करते हैं: वह Sharpe ratio जो केवल उन बार्स पर गणना की जाती है जिन पर रणनीति वास्तव में पोज़ीशन में है। यह रिपोर्ट करने के लिए एक बेहद स्वाभाविक चीज़ है। "जब यह ट्रेड करती है, तो इसके ट्रेड कितने अच्छे हैं?" यह ऐसा महसूस होता है जैसे यह स्किल को निष्क्रियता से अलग कर देता है। यह उल्टा करता है।

सीड 6 पर Per-Trade Sharpe जिस रणनीति को ताज पहनाता है वह यह है:

  • थ्रेशोल्ड θ=0.005\theta = 0.005 — यह केवल सबसे छोटे सिग्नल पर ट्रेड करता है।
  • मार्केट एक्सपोज़र 0.4% — 99.6% समय फ्लैट।
  • आठ ट्रेड्स। आठ। 2000 बार्स में।
  • In-sample per-trade वार्षिकीकृत Sharpe: 21.09
  • In-sample full-timeline Sharpe: 0.82
  • Out-of-sample full-timeline Sharpe: 0.13

Per-trade मेट्रिक 21.09 दिखाती है — एक ऐसी संख्या जो किसी असली रणनीति ने कभी नहीं दी, वह आंकड़ा जो एक फंड लॉन्च करवा देता। और यह एक पूर्ण मृगतृष्णा है। उन आठ ट्रेड्स ने संयोगवश कुछ फेवरेबल मूव्स पकड़ लिए; केवल उन आठ बार्स पर मापे जाने पर, मीन और स्टैंडर्ड डेविएशन का अनुपात खगोलीय है। लेकिन पूरी टाइमलाइन पर — जहाँ रणनीति 99.6% समय फ्लैट है — वह "एज" लगभग कुछ भी योगदान नहीं देता: in-sample 0.82 का full-timeline Sharpe, जो नए डेटा पर गिरकर 0.13 रह जाता है। ऑब्जेक्टिव द्वारा चुना गया विजेता, सभी ट्रेडिंग उद्देश्यों के लिए, फ्लैट है।

और उस थ्रेशोल्ड पर यह असली एज भी नहीं है। मार्केट याद करें: एज बैंड s1|s|\le 1 में रहता है, और θ=0.005\theta = 0.005 ठीक बीच में है जहाँ सिग्नल सबसे कमज़ोर है। θ=0.005\theta = 0.005 पर सच्चा out-of-sample कर्व −0.01 है — शून्य से अप्रभेद्य (ग्राउंड-ट्रुथ कर्व से व्युत्पन्न)। सर्च को कोई छोटा असली एज नहीं मिला। इसे नॉइज़ के आठ लकी ड्रॉ मिले और उसने उन्हें 21 का Sharpe बताकर रिपोर्ट किया।

यही जाल संक्षेप में है: Per-Trade Sharpe रणनीति को जितना संभव हो उतना कम ट्रेड करने के लिए इनाम देता है, क्योंकि जितनी कम बार्स पर आप टिके रहते हैं, उतना आसान है कि उनमें से कुछ लकी निकलें, और मेट्रिक कभी नहीं पूछता "लेकिन क्या तुम वाकई मार्केट में थे?" सीड 6 का मैग्नीट्यूड चुन-चुनकर लिया गया है — हम जान-बूझकर एक स्पष्ट उदाहरण ढूंढ रहे थे — लेकिन इसका प्रकार नहीं है। 600 सीड्स में, Per-Trade Sharpe 57% में एक डिजेनरेट विजेता चुनता है (एक जो मुश्किल से ट्रेड करता है, या out of sample हारता है), और खासतौर पर 56% में 5% से कम एक्सपोज़र वाली लॉटरी। सामान्य डिजेनरेट चुनाव सीड 6 के 21 के Sharpe से कहीं ज़्यादा हल्का है: सभी 600 सीड्स पर औसत लेने पर, per-trade ऑब्जेक्टिव के विजेता का in-sample per-trade Sharpe 4.58 है और औसत एक्सपोज़र 0.286 — फिर भी ज़्यादातर समय फ्लैट, बस 99.6% फ्लैट नहीं। सीड 6 मैकेनिज़्म को नाटकीय बनाता है; 56% वह हिस्सा है जो आपको चिंतित करना चाहिए। आधे से ज़्यादा बार, यह रोज़मर्रा की मेट्रिक आपको एक लॉटरी टिकट देती है और उसे रणनीति कहती है।

एक्ट 3 — सांख्यिकीय सच्चाई: छह ऑब्जेक्टिव, 600 सीड्स

Six objective functions as contestants on a leaderboard, the per-trade Sharpe glowing brightest in sample but stamped degenerate 57 percent while the exposure-aware objectives hold steady out of sample, illustrating that a great in-sample number does not mean a good selection

एक सीड कुछ साबित नहीं करता; यह केवल इलस्ट्रेट करता है। एक ऑब्जेक्टिव मापने के लिए हमें पूछना होगा कि यह औसतन क्या चुनता है, कई स्वतंत्र मार्केट्स में, और उस चुनाव को उस डेटा पर स्कोर करना होगा जो सर्च ने कभी नहीं देखा। तो: 600 सीड्स, हर एक मार्केट का स्वतंत्र ड्रॉ; हर एक पर, हर ऑब्जेक्टिव के तहत 80-थ्रेशोल्ड सर्च चलाएँ; एक्सपोज़र, चुनी गई चीज़ का in-sample और out-of-sample Sharpe, और क्या वह चुनाव डिजेनरेट था, रिकॉर्ड करें।

ऑब्जेक्टिव औसत एक्सपोज़र In-sample Sharpe Out-of-sample Sharpe IS→OOS गिरावट (एब्स.) डिजेनरेट
Raw PnL 0.859 1.76 1.61 0.15 0.0%
Full-Timeline Sharpe 0.740 1.82 1.71 0.11 0.0%
Per-Trade Sharpe 0.286 1.00 0.70 0.30 57%
एक्सपोज़र फ्लोर (emin=0.20e_{\min}=0.20) 0.740 1.82 1.71 0.11 0.0%
conf_k श्रिंकेज (k=40k=40) 0.523 1.54 1.31 0.23 20.7%
रोबस्ट (फ्लोर + conf_k) 0.675 1.78 1.70 0.08 0.2%

"IS→OOS गिरावट" कॉलम in-sample से out-of-sample तक वार्षिकीकृत Sharpe में एब्सोल्यूट गिरावट है (जैसे 1.000.701.00\to0.70 0.30 की गिरावट है), प्रतिशत नहीं। और ध्यान दें कि "एक्सपोज़र फ्लोर" पंक्ति "Full-Timeline Sharpe" से बाइट-फ़ॉर-बाइट समान है: यह संयोग नहीं है, और एक्ट 5 बताता है क्यों।

तीन तथ्य उभरते हैं, और हर एक एक सबक है।

Per-Trade Sharpe इकलौता भोला ऑब्जेक्टिव है जो डिजेनरेट होता है। इसका औसत एक्सपोज़र 0.286 है — यह ऐसी रणनीतियाँ चुनता है जो ज़्यादातर समय फ्लैट रहती हैं — और इसका in-sample Sharpe 1.00 0.30 गिरकर out-of-sample 0.70 पर आता है, फ़ील्ड में सबसे खराब। ध्यान दें: इसकी in-sample संख्या (1.00) प्रभावशाली भी नहीं है, फिर भी किसी एक सीड पर यह खुशी-खुशी 21 का per-trade आंकड़ा रिपोर्ट कर देगा। औसत इसलिए धुल जाता है क्योंकि लकी विंडोज़ रैंडम दिशाओं में इशारा करती हैं; out-of-sample तक जो बचता है वह केवल 0.70 है, और 57% अलग-अलग चुनाव सीधे कचरा हैं।

एक्सपोज़र-अवेयर ऑब्जेक्टिव स्वाभाविक रूप से सुरक्षित हैं। Raw PnL और Full-Timeline Sharpe कभी डिजेनरेट नहीं होते (0.0%)। कारण संरचनात्मक है: दोनों पूरी टाइमलाइन पर मापे जाते हैं, इसलिए 99.6% समय फ्लैट रहने वाली रणनीति इनके तहत लगभग कुछ नहीं कमाती। कोई भी फुल-टाइमलाइन मेट्रिक को कभी-कभार ट्रेड करके गेम नहीं कर सकता — फ्लैट रहना सीधे और स्वचालित रूप से दंडित होता है, क्योंकि फ्लैट बार्स डिनॉमिनेटर में हैं। यह इस लेख का सबसे महत्वपूर्ण विचार है, और हम एक्ट 6 में इस पर लौटते हैं।

Raw PnL सुरक्षित है लेकिन ऑप्टिमल नहीं — यह ओवर-एक्सपोज़ करता है। ध्यान से देखें: Raw PnL का औसत एक्सपोज़र 0.859 है, सबसे ऊंचा, और इसका out-of-sample Sharpe (1.61) full-timeline Sharpe (1.71) और सच्चे ऑप्टिमम (1.77) से एक पायदान नीचे है। PnL मार्केट में होने को इनाम देता है, इसलिए सर्च θ\theta को बहुत ऊंचा धकेलती है (सीड 6 पर, raw PnL ऑप्टिमल 1.04 के मुकाबले θ=1.84\theta=1.84 चुनता है), जो ऐसे आउट-ऑफ़-बैंड बार्स खींच लाता है जो कोई एज नहीं रखते और केवल नॉइज़ जोड़ते हैं। यह उड़ता नहीं है — लेकिन यह per-trade जाल की विपरीत दिशा में सच्चे ऑप्टिमम से आगे बह जाता है। अलग ऑब्जेक्टिव, अलग बायस, वही सबक: मेट्रिक ने रणनीति चुनी।

जिन दो पंक्तियों पर हमने अभी तक चर्चा नहीं की — एक्सपोज़र फ्लोर और conf_k — वे मरम्मत हैं। यह अगला एक्ट है।

एक्ट 4 — आठ ट्रेड्स पर कभी भरोसा क्यों नहीं किया जा सकता

A single Sharpe point estimate marked with an enormous confidence-interval error bar because it rests on only eight observations, beside a ruler labeled minimum track record length, illustrating that a ratio measured on a handful of trades is statistically meaningless

जाल की मरम्मत करने से पहले, यह जानना ज़रूरी है कि क्यों आठ ट्रेड्स 21 का ऐसा Sharpe देते हैं जिसका कोई मतलब नहीं — क्योंकि समाधान सीधे इसी कारण से निकलता है।

एक Sharpe ratio एक अनुमान है, और अनुमानों में एरर बार होते हैं। एंड्रयू लो का 2002 का नतीजा TT ऑब्ज़र्वेशन से अनुमानित Sharpe ratio का स्टैंडर्ड एरर देता है, सबसे उदार संभव धारणा के तहत (IID गॉसियन रिटर्न्स):

SE(SR^)1+SR^2/2T.\operatorname{SE}\big(\widehat{SR}\big) \approx \sqrt{\frac{1 + \widehat{SR}^{\,2}/2}{T}}.

एरर केवल 1/T1/\sqrt{T} के अनुसार सिकुड़ता है। इसे जाल पर लगाएं। सीड 6 पर per-trade Sharpe 21.0921.09 वार्षिकीकृत है, जो प्रति ऑब्ज़र्वेशन 1.331.33 है, T=8T = 8 बार्स पर गणना की गई। स्टैंडर्ड एरर है

SE1+1.332/280.49 प्रति ऑब्ज़र्वेशन = 7.7 वार्षिकीकृत\operatorname{SE} \approx \sqrt{\frac{1 + 1.33^2/2}{8}} \approx 0.49 \ \text{प्रति ऑब्ज़र्वेशन} \ = \ \textbf{7.7 वार्षिकीकृत}

(लो के फ़ॉर्मूले से व्युत्पन्न)। पॉइंट एस्टिमेट 21.0921.09 है; इसका वन-सिग्मा एरर बार ±7.7\pm 7.7 की क्रम में है — इसे एक इलस्ट्रेटिव ऑर्डर-ऑफ़-मैग्नीट्यूड के रूप में पढ़ें, कैलिब्रेटेड कॉन्फिडेंस इंटरवल के रूप में नहीं, क्योंकि फ़ॉर्मूला IID गॉसियन रिटर्न्स मानता है जिसे हमारा फैट-टेल्ड t4t_4 नॉइज़ तोड़ता है। फिर भी, संदेश स्पष्ट है: "21 का Sharpe" इतनी चौड़ी डिस्ट्रीब्यूशन से खींचा गया आंकड़ा है कि यह लगभग कोई जानकारी नहीं रखता — और यह उदार गणना है, क्योंकि मर्टेंस का विस्तार दिखाता है कि फैट टेल्स और स्क्यू केवल स्टैंडर्ड एरर को और फुलाते हैं। एक रेयर-ट्रेड बैकटेस्ट का Sharpe अपने पॉइंट वैल्यू से हर दिशा में एक साथ कम भरोसेमंद है: बहुत कम ऑब्ज़र्वेशन, और गलत डिस्ट्रीब्यूशन।

यही ठीक वह है जिसे Minimum Track Record Length औपचारिक रूप देता है (Bailey & López de Prado, 2012)। यह सवाल पलट देता है — मुझे कॉन्फिडेंस pp पर इस साइज़ के Sharpe पर भरोसा करने से पहले कितने ऑब्ज़र्वेशन चाहिए?

MinTRL=1+[1γ^3SR^+γ^414SR^2](Z1pSR^SR)2,\text{MinTRL} = 1 + \Big[\,1 - \hat\gamma_3\,\widehat{SR} + \tfrac{\hat\gamma_4 - 1}{4}\,\widehat{SR}^{\,2}\,\Big]\left(\frac{Z_{1-p}}{\widehat{SR} - SR^*}\right)^{2},

"कम-ट्रेड बैकटेस्ट पर कम भरोसा करो" को ट्रेड्स की एक स्पष्ट, जाँच-योग्य संख्या में बदलते हुए। ऑब्जेक्टिव डिज़ाइन के लिए गहरी बात यह है: एक अच्छे ऑब्जेक्टिव को अंदर से ही मिनिमम ट्रैक रिकॉर्ड लागू करना चाहिए, बजाय इसके कि एक इंसान बाद में यह नोटिस करे कि विजेता आठ ऑब्ज़र्वेशन पर टिका है। Per-Trade Sharpe इसके उलट करता है — यह ऑब्ज़र्वेशन काउंट को न्यूनतम की ओर धकेल कर मैक्सिमाइज़ होता है। कोई भी ऑब्जेक्टिव जिसका ऑप्टिमम "जितने कम ट्रेड्स हो सकें" पर हो, बनावट से ही, ऐसा ऑब्जेक्टिव है जो अपना ही सबसे अविश्वसनीय अनुमान खोजता है।

जाल में दो विफलताएँ मिलकर काम करती हैं, और दोनों को नाम देना हमें बताता है कि इसे कैसे ठीक करें। पहला, स्मॉल-सैंपल नॉइज़: आठ ऑब्ज़र्वेशन किसी भी रेशियो को पिन नहीं कर सकते। दूसरा, सिलेक्शन: वे आठ बार्स हमें दी नहीं गई थीं — सर्च ने वह थ्रेशोल्ड चुना जो उन पर उतरा, आंशिक रूप से क्योंकि वे लकी थीं। सर्च एक मैक्सिमाइज़र है; यह हमेशा स्पेस का वह कोना ढूंढ लेगा जहाँ नॉइज़ संयोगवश सिग्नल जैसा दिखता है। इसे बेहतर पॉइंट एस्टिमेट से आउट-क्लेवर नहीं किया जा सकता। "सर्वश्रेष्ठ" का मतलब बदलना होगा ताकि लकी कोना मैक्सिमम न हो।

एक्ट 5 — मरम्मत: एक एक्सपोज़र फ्लोर और एक ट्रेड-काउंट श्रिंकेज

A control panel with two knobs labeled exposure floor and conf_k shrinkage, both lifting an out-of-sample performance surface up onto a high flat plateau while a degeneracy indicator goes dark, illustrating two independent fixes that together recover the true optimum

हमारे पास दो पहचानी गई बीमारियाँ हैं — बहुत कम ट्रेड करना और बहुत कम ऑब्ज़र्वेशन पर टिकना — तो हम दो इलाज लिखते हैं, हर एक एक पर लक्षित।

इलाज 1: एक एक्सपोज़र फ्लोर। सबसे सरल संभव समाधान। किसी भी रणनीति को साफ़ रिजेक्ट करें जो कम से कम emine_{\min} समय मार्केट में नहीं है — अगर वह मुश्किल से ट्रेड करती है, तो उसका स्कोर -\infty है और सर्च उसे चुन नहीं सकती। लेकिन क्या फ्लोर किया जाए में एक ईमानदार सूक्ष्मता है, और यही पूरे लेख का शांत सबक है। एक स्टैंडअलोन ऑब्जेक्टिव के रूप में हमने Full-Timeline Sharpe को फ्लोर किया, और इस मार्केट पर इससे बिल्कुल कुछ नहीं बदलता: Full-Timeline Sharpe का अपना विजेता पहले से ही ~74% एक्सपोज़र पर है, इसलिए 20% फ्लोर कभी बाइंड नहीं करता। यही वजह है कि ऊपर की टेबल में "एक्सपोज़र फ्लोर" और "Full-Timeline Sharpe" पंक्तियाँ बाइट-फ़ॉर-बाइट समान हैं — एक पहले से सुरक्षित मेट्रिक पर फ्लोर लगाना बस पूरे Sharpe को दोबारा व्युत्पन्न करना है। फ्लोर तभी दृश्यमान काम करता है जब वह एक ऐसी मेट्रिक की रक्षा कर रहा हो जो वरना कोने की ओर दौड़ जाती — एक Per-Trade मेट्रिक, जैसे नीचे रोबस्ट ऑब्जेक्टिव में। दूसरे शब्दों में, "एक्सपोज़र की मांग करना" और "पूरी टाइमलाइन पर मापना" इस डेटा पर एक ही हस्तक्षेप के दो नाम हैं।

इलाज 2: एक ट्रेड-काउंट श्रिंकेज — "conf_k"। जब आप per-trade मेट्रिक में फंसे हों और हार्ड कटऑफ की बजाय एक सॉफ्ट करेक्शन चाहते हों: Sharpe को लगातार डिस्काउंट करें इस आधार पर कि वह कितने ट्रेड्स पर टिका है। n/(n+k)n/(n+k) से गुणा करें, जहाँ nn ट्रेड काउंट है और kk एक फिक्स्ड "कॉन्फिडेंस कॉन्स्टेंट" है — सर्च से पहले चुनी गई ट्रेड-इक्विवैलेंट प्रायर स्ट्रेंथ:

score(θ)=SR^(θ)n(θ)n(θ)+k.\text{score}(\theta) = \widehat{SR}(\theta)\cdot \frac{n(\theta)}{n(\theta) + k}.

जैसे n0n \to 0, स्कोर शून्य की ओर कुचल जाता है चाहे रॉ Sharpe कितना भी बड़ा हो; जैसे nn \to \infty, स्कोर रॉ Sharpe की ओर कन्वर्ज करता है। यह वही करेक्टिव लॉजिक है जो MinTRL और एक्ट 4 के स्टैंडर्ड एरर में है — एक स्मॉल-सैंपल अनुमान को उसके सैंपल साइज़ के घटते फंक्शन के रूप में शून्य की ओर सिकोड़ना — जो पोस्ट-हॉक फ़िल्टर के रूप में लगाने की बजाय सीधे ऑब्जेक्टिव में समा गया है। सबसे नज़दीकी नामित पूर्ववृत्त है van Tharp का System Quality Number (SQN=Ntrade/σtrade\text{SQN} = \sqrt{N}\cdot \overline{\text{trade}}/\sigma_{\text{trade}}), जो इसी तरह एक per-trade क्वालिटी मेट्रिक को ट्रेड काउंट NN के साथ स्केल करता है — हालाँकि फंक्शनल फॉर्म अलग है (N\sqrt{N} बिना सीमा के बढ़ता है, जबकि n/(n+k)n/(n+k) 1 पर सैचुरेट होता है। शेप में हमारा वाला एक Bayesian precision-weighted / empirical-Bayes-स्टाइल श्रिंकेज है; यह इस समस्या के लिए हमारा निर्माण है, साहित्य से लिया गया कोई नामित एस्टिमेटर नहीं।

def obj_active_sharpe(m):                  # the trap: Sharpe on only the active bars
    return m["sharpe_active"]

def _shrink(n, conf_k):                     # trade-count shrinkage n / (n + k)
    return n / (n + conf_k) if (n + conf_k) > 0 else 0.0

def obj_confk(m, conf_k=40.0):              # few trades -> little credit
    return m["sharpe_active"] * _shrink(m["n_trades"], conf_k)

def obj_robust(m, e_min=0.20, conf_k=40.0): # both cures at once
    if m["exposure"] < e_min:               # floor: reject strategies that barely trade
        return -np.inf
    return m["sharpe_active"] * _shrink(m["n_trades"], conf_k)

अब ईमानदार हिस्सा: कितना फ्लोर, कितना श्रिंकेज? दोनों को स्वीप करें और पूरी सतह पढ़ें। हर सेल 200 सीड्स पर औसत out-of-sample Sharpe है (600 का एक-तिहाई सबसेट, ताकि टू-डायमेंशनल स्वीप सस्ता रहे) साथ में डिजेनरेसी रेट:

emine_{\min} \ conf_k k=0k=0 k=40k=40 k=80k=80
0.00 0.66 (59.5%) 1.26 (22.5%) 1.47 (11.5%)
0.05 1.43 (10.0%) 1.53 (6.0%) 1.60 (4.0%)
0.10 1.64 (1.5%) 1.65 (1.0%) 1.67 (1.0%)
0.20 1.71 (0.0%) 1.71 (0.0%) 1.71 (0.0%)
0.35 1.73 (0.0%) 1.73 (0.0%) 1.73 (0.0%)

औसत वार्षिकीकृत out-of-sample Sharpe, कोष्ठक में डिजेनरेसी रेट के साथ। टॉप-लेफ्ट सेल (0,0)(0,0) रॉ per-trade Sharpe है — बिना फ्लोर, बिना श्रिंकेज: OOS 0.66, डिजेनरेट 59.5%। यह वही ऑब्जेक्टिव है जो एक्ट 3 की per-trade पंक्ति है, जिसने 0.70 / 57% पढ़ा; छोटा अंतर पूरी तरह सीड सेट से है — यह स्वीप 200 सीड्स इस्तेमाल करता है, मॉन्टे कार्लो ने सभी 600। वही मेट्रिक, छोटा सैंपल।

सतह तीन रीडिंग में एक साफ़ कहानी बताती है।

हर इलाज अकेले काम करता है। टॉप रो के साथ दाईं ओर बढ़ें (श्रिंकेज जोड़ें, फ्लोर नहीं): OOS चढ़ता है 0.661.261.470.66 \to 1.26 \to 1.47 और डिजेनरेसी गिरती है 59.5%22.5%11.5%59.5\% \to 22.5\% \to 11.5\%। लेफ्ट कॉलम में नीचे बढ़ें (फ्लोर जोड़ें, श्रिंकेज नहीं): OOS चढ़ता है 0.661.431.641.710.66 \to 1.43 \to 1.64 \to 1.71 और डिजेनरेसी गिरती है 59.5%10%1.5%0%59.5\% \to 10\% \to 1.5\% \to 0\%। कोई भी नॉब, अकेले घुमाया गया, स्वतंत्र रूप से out-of-sample परफ़ॉर्मेंस बढ़ाता है और डिजेनरेसी को खत्म करता है। एक्सपोज़र फ्लोर यहाँ स्ट्रॉन्गर सिंगल लीवर है, क्योंकि यह जाल की परिभाषित विशेषता — शून्य के करीब एक्सपोज़र — पर सीधा हमला करता है।

साथ मिलकर वे प्लेटो तक पहुँचते हैं — और वह प्लेटो बस Full-Timeline Sharpe है। emin=0.20e_{\min} = 0.20 तक पंक्ति OOS 1.71 पर हर श्रिंकेज लेवल पर 0% डिजेनरेसी के साथ फ्लैट है; emin=0.35e_{\min}=0.35 तक धकेलने पर यह 1.73 तक रेंगता है। लेकिन गौर से देखें कि वह 1.71 क्या है: यह ठीक वही स्कोर है जो एक्ट 3 में साधारण Full-Timeline Sharpe बिना फ्लोर, बिना किसी श्रिंकेज के पोस्ट करता है। अपने सर्वश्रेष्ठ पर भी, ये सुधार Full-Timeline Sharpe को पार नहीं करते — वे इसे पुनर्निर्मित करते हैं। और पूरी तरह से सुधारा गया रोबस्ट ऑब्जेक्टिव वहाँ तक भी पूरी तरह नहीं पहुँचता: सभी 600 सीड्स पर यह OOS 1.70 पर उतरता है 0.17% रेजिड्यूअल डिजेनरेसी के साथ, फुल Sharpe के 1.71 / 0% से बाल भर नीचे — यह सरल मेट्रिक द्वारा कमज़ोर रूप से डॉमिनेटेड है। एक मध्यम सेटिंग, emin=0.10e_{\min}=0.10 के साथ k=40k=40, OOS 1.65 पर 1% डिजेनरेसी के साथ पहुँचती है — काम की अगर per-trade मेट्रिक ज़बरदस्ती दी गई हो, लेकिन कभी उसे प्रिफर करने का कारण नहीं।

*सटीक संख्याएँ स्केल-निर्भर हैं — आकार नतीजा है। विशेष मान emin=0.20e_{\min}=0.20, k=40k=40 जो इस मार्केट को पूरी तरह ठीक करते हैं, इस डेटा-जेनरेशन प्रक्रिया के अनुरूप हैं; अलग ट्रेड फ़्रीक्वेंसी और टेल थिकनेस वाले अलग मार्केट पर, प्लेटो कहीं और होगा। जो सामान्यीकृत होता है वह कोऑर्डिनेट्स नहीं बल्कि सतह है: दोनों दिशाओं में मोनोटोन उठान, डिजेनरेसी शून्य की ओर, सच्चाई पर एक प्लेटो। आप अपने खुद के कोऑर्डिनेट्स स्वीप करके पाते हैं, ठीक ऊपर जैसे।

दोनों इलाज साथ रखें — रोबस्ट ऑब्जेक्टिव, फ्लोर 0.20 प्लस conf_k 40 — और सीड 6 पर लौटें। जाल ने θ=0.005\theta = 0.005, आठ ट्रेड्स, 0.13 का full-timeline OOS Sharpe ताज पहनाया था। रोबस्ट ऑब्जेक्टिव इसके बजाय θ=0.979\theta = 0.979 चुनता है: मार्केट एक्सपोज़र 0.66, 447 ट्रेड्स, वार्षिकीकृत out-of-sample Sharpe 1.77। वह θ=0.979\theta = 0.979 सच्चे ऑप्टिमम θ=1.04\theta = 1.04 से एक ग्रिड पॉइंट नीचे है, इसलिए यह एक नियर-ऑप्टिमल, अच्छी तरह एक्सपोज़्ड थ्रेशोल्ड को रिकवर करता है बजाय बुल्सआई पर उतरने के — इसका सिंगल-सीड out-of-sample Sharpe (1.77) संयोगवश पॉपुलेशन ऑप्टिमम से मेल खाता है। वही डेटा, वही सर्च, वही 80 उम्मीदवार थ्रेशोल्ड। केवल "सर्वश्रेष्ठ" की परिभाषा बदली, और इसने विजेता को एक फ्लैट आठ-ट्रेड मृगतृष्णा से असली, अच्छी तरह एक्सपोज़्ड एज की ओर ले गया — जो, दिलचस्प रूप से, इस सीड पर साधारण Full-Timeline Sharpe जो चुनता है वही थ्रेशोल्ड है।

एक चेतावनी जो स्वीप स्पष्ट करता है: इस मार्केट पर conf_k अकेला काफ़ी नहीं है। बिना फ्लोर के k=40k=40 पर, डिजेनरेसी सीड्स में अब भी 22.5% है — और खासतौर पर सीड 6 पर, conf_k अकेला θ=0.015\theta = 0.015 चुनता है, 35 ट्रेड्स, out-of-sample Sharpe −0.06। पैंतीस ट्रेड्स 35/(35+40)0.4735/(35+40) \approx 0.47 की श्रिंकेज को जीतने के लिए पर्याप्त बचे स्कोर के साथ झेल जाते हैं। एक्सपोज़र फ्लोर वह है जो उस आखिरी गैप को बंद करता है, क्योंकि यह जाल के सच्चे सिग्नेचर — फ्लैट होना — पर सीधे निशाना साधता है, बजाय ट्रेड काउंट को उसके प्रॉक्सी के रूप में भरोसा करने के।

एक्ट 6 — गहरा सबक: पूरी टाइमलाइन पर मापें

Two ways of scoring the same strategy contrasted: a narrow spotlight illuminating only the few bars a strategy traded versus a floodlight measuring the entire timeline including the flat stretches, illustrating that exposure-aware objectives cannot be gamed by rare lucky trades

मरम्मत से एक कदम पीछे हटें और ध्यान दें कि सुरक्षित ऑब्जेक्टिव को जाल से वास्तव में क्या अलग करता है। यह कोई परिष्कार नहीं था। Raw PnL और Full-Timeline Sharpe, Per-Trade Sharpe से सरल हैं, और ये कभी डिजेनरेट नहीं हुए — 600 सीड्स में 0% — बिना फ्लोर, बिना श्रिंकेज, बिना किसी ट्यूनिंग के।

बंटवारे की रेखा एक ही गुण है: मेट्रिक कौन-सी विंडो मापती है? Per-Trade Sharpe केवल उन बार्स को मापता है जिन पर रणनीति ने टिकना चुना — एक सेल्फ़-सिलेक्टेड विंडो जिसे सर्च मर्ज़ी से सिकोड़ सकती है। Full-Timeline Sharpe और टोटल PnL पूरी टाइमलाइन मापते हैं, फ्लैट बार्स सहित। और आप कभी-कभार ट्रेड करके फुल-टाइमलाइन मेट्रिक को बड़ा नहीं बना सकते, क्योंकि जिस भी घंटे आप फ्लैट रहते हैं वह डिनॉमिनेटर में एक घंटा है जो कुछ नहीं कमाता। एक्सपोज़र फ्लोर और conf_k, आख़िरकार, per-trade मेट्रिक को उस एक्सपोज़र-अवेयरनेस से नवीनीकृत करने के तरीके भर हैं जो फुल-टाइमलाइन मेट्रिक्स को मुफ़्त में मिलती है — और स्वीप हमें पहले ही उस नवीनीकरण की सीमा बता चुका है: अपने सर्वश्रेष्ठ पर यह Full-Timeline Sharpe से मेल खाता है (OOS 1.70 बनाम 1.71), कभी पार नहीं करता। अगर आप विंडो चुनने के लिए स्वतंत्र हैं, तो पूरी टाइमलाइन चुनें और नवीनीकरण को पूरी तरह छोड़ दें।

तो डिज़ाइन सिद्धांत, स्पष्ट रूप से कहा गया:

ऑब्जेक्टिव को इस तरह डिज़ाइन करें कि इसे कभी-कभार के लकी ट्रेड्स से गेम न किया जा सके। आपके पास तीन उपकरण हैं, अनुमानित प्राथमिकता क्रम में:

  1. पूरी टाइमलाइन पर मापें। डिफ़ॉल्ट जिससे लगभग कभी नहीं हटना चाहिए। Full-Timeline Sharpe और टोटल रिटर्न बनावट से ही एक्सपोज़र-अवेयर हैं — निष्क्रियता स्वतः दंडित होती है क्योंकि फ्लैट बार्स गिने जाते हैं। अगर आप खुद को "केवल उन बार्स पर" गणना की गई मेट्रिक रिपोर्ट करते पाते हैं जिन पर हम सक्रिय थे, तो रुकें और पूछें कि उन बार्स को चुनने की स्वतंत्रता के साथ सर्च क्या करेगी।
  2. एक्सपोज़र की मांग करें। अगर आपको एक्टिविटी-कंडीशनल मेट्रिक इस्तेमाल करनी ही है, तो एक्सपोज़र को फ्लोर करें ताकि सर्च ऐसी रणनीति न चुन सके जो मुश्किल से ट्रेड करती है। यह इस विशेष जाल के खिलाफ सबसे मज़बूत सिंगल लीवर है।
  3. ट्रेड काउंट से सिकोड़ें। किसी भी रेशियो को n/(n+k)n/(n+k) से डिस्काउंट करें ताकि मुट्ठी भर ऑब्ज़र्वेशन पर टिका Sharpe हज़ारों पर टिके Sharpe के क्रेडिट का बस एक अंश कमाए। यह Minimum Track Record Length का ऑब्जेक्टिव-लेवल एन्फोर्समेंट है: कम ऑब्ज़र्वेशन से आई संख्या अविश्वसनीय है (एक्ट 4), इसलिए एक ईमानदार ऑब्जेक्टिव उस अविश्वसनीयता को पहले से भाव में शामिल करता है बजाय यह भरोसा करने के कि एक इंसान इसे बाद में पकड़ेगा।

इनमें से कोई भी सर्च को स्मार्ट नहीं बनाता। यह लक्ष्य को ईमानदार बनाता है, ताकि जब सर्च ठीक वही करे जो यह हमेशा करती है — मैक्सिमम खोजना — तो वह मैक्सिमम एक ऐसी रणनीति हो जिसे आप वाकई चाहते हैं।

ईमानदारी के नोट्स

तीन चेतावनियाँ, स्पष्ट रूप से कही गईं, क्योंकि एक नियंत्रित अध्ययन अपने निष्कर्ष तभी अर्जित करता है जब वह अपनी सीमाओं को नाम देता है।

  • मार्केट सिंथेटिक है, और जान-बूझकर। एक स्टैंडर्ड-नॉर्मल सिग्नल, s1|s|\le 1 तक सीमित एक लीनियर एज, फैट-टेल्ड Student-tt(44) नॉइज़ — नियंत्रित ग्राउंड ट्रुथ के लिए चुने गए, मार्केट यथार्थवाद के लिए नहीं। हम यह साबित कर सकते हैं कि कोई ऑब्जेक्टिव गलत रणनीति चुनता है केवल उसे उस डेटा पर चला कर जहाँ हम जानते हैं कि कौन-सी रणनीति सही है। असली मार्केट्स नॉन-स्टेशनरी, ऑटोकॉरिलेटेड और रिजीम-शिफ्टिंग होते हैं। फैट टेल्स एक यथार्थवादी इंग्रेडिएंट हैं जिन्हें हमने रखा, लेकिन — एक स्वाभाविक पहले अंदाज़े के विपरीत, और इसी लेख के पहले ड्राफ्ट के विपरीत — वे जाल को चलाने वाली चीज़ नहीं हैं: एक गॉसियन-नॉइज़ कंट्रोल (300 सीड्स) यहाँ के 57.0% के मुकाबले 55.7% समय डिजेनरेट होता है, out-of-sample Sharpe 0.71 के मुकाबले 0.70 के साथ। जाल एक स्मॉल-सैंपल-प्लस-सिलेक्शन आर्टिफ़ैक्ट है जो भारी टेल्स के साथ या बिना जीवित रहता है। डिलिवरेबल डायग्नोसिस और मरम्मत का पैटर्न है, कोई रणनीति या यूनिवर्सल कॉन्स्टेंट नहीं।
  • मरम्मत के मान स्केल-निर्भर हैं। विशेष फ्लोर emin=0.20e_{\min}=0.20 और श्रिंकेज k=40k=40 जो जाल को पूरी तरह बंद करते हैं, इस डेटा-जेनरेशन प्रक्रिया के अनुरूप फ़िट हैं — इसकी ट्रेड फ़्रीक्वेंसी, इसकी टेल थिकनेस, इसकी एज साइज़। दूसरे डेटा पर, प्लेटो शिफ्ट हो जाता है। जो ट्रांसफर होता है वह स्वीप सतह का आकार है (दोनों नॉब्स में मोनोटोन उठान, डिजेनरेसी शून्य पर, सच्चाई पर एक प्लेटो) और अपने खुद के कोऑर्डिनेट्स खोजने की विधि: दोनों को स्वीप करें और सतह पढ़ें, संख्याएँ कॉपी न करें।
  • conf_k हमारा निर्माण है, कोई नामित एस्टिमेटर नहीं। ट्रेड-काउंट श्रिंकेज SR^n/(n+k)\widehat{SR}\cdot n/(n+k) एक Bayesian precision-weighted / empirical-Bayes-स्टाइल डिवाइस है जिसे हमने इस समस्या के लिए बनाया; इसका तर्क वेरिफ़ाइड Lo/Mertens स्टैंडर्ड-एरर नतीजे और Bailey–López de Prado MinTRL पर आधारित है, और इसका सबसे नज़दीकी नामित रिश्तेदार van Tharp का System Quality Number है (Ntrade/σtrade\sqrt{N}\cdot \overline{\text{trade}}/\sigma_{\text{trade}}, एक अलग फंक्शनल फॉर्म), लेकिन हम यह दावा नहीं करते कि n/(n+k)n/(n+k) खुद साहित्य में किसी नाम के तहत आता है। इसके साथी इलाज — एक्सपोज़र फ्लोर, फुल-टाइमलाइन मेज़रमेंट — सटीक रूप से बताई गई मानक प्रैक्टिस हैं। और ध्यान दें कि यहाँ कौन-से ऑब्जेक्टिव पहले से ही सुरक्षित थे: Raw PnL और Full-Timeline Sharpe को कभी मरम्मत की ज़रूरत नहीं पड़ी, क्योंकि वे शुरू से ही एक्सपोज़र-अवेयर हैं — इतने कि Full-Timeline Sharpe को फ्लोर करना बस Full-Timeline Sharpe पर वापस आ जाता है, जिसका विजेता पहले से ही किसी भी उचित फ्लोर को पार कर जाता है। जाल विशेष रूप से Per-Trade / Active Sharpe है — और पूरी तरह मरम्मत किए गए per-trade ऑब्जेक्टिव भी बस Full-Timeline Sharpe के बराबर पहुँचते हैं (OOS 1.70 बनाम 1.71), कभी उसे पार नहीं करते। प्राथमिक सबक मरम्मत नहीं है; यह शुरुआत से ही पूरी टाइमलाइन पर मापना है।

मुख्य निष्कर्ष

  1. ऑब्जेक्टिव ही फैसला है, कोई औपचारिकता नहीं। एक सर्च "एक अच्छी रणनीति" नहीं खोजती — यह आपके दिए किसी भी स्केलर का मैक्सिमाइज़र खोजती है, और अलग-अलग स्केलर एक जैसे डेटा पर बिल्कुल अलग रणनीतियाँ चुनते हैं। ऑब्जेक्टिव चुनना ही रणनीति चुनना है; उसके बाद सब कुछ बुककीपिंग है। यही गुडहार्ट का नियम है: जिस पल आपकी मेट्रिक सर्च का लक्ष्य बनती है, सर्च उसके और आपके मतलब के बीच की हर खाई का फ़ायदा उठाएगी।
  2. Per-Trade Sharpe एक जाल है। केवल उन बार्स पर मापा गया जिन पर रणनीति ट्रेड करती है, यह जितना संभव हो उतना कम ट्रेड करके मैक्सिमाइज़ होता है — जितने कम ऑब्ज़र्वेशन, उतना आसान है कि कुछ लकी मूव्स रेशियो को फुला दें (एक गॉसियन कंट्रोल पुष्टि करता है कि फैट टेल्स ज़रूरी नहीं हैं; यह एक स्मॉल-सैंपल-प्लस-सिलेक्शन प्रभाव है)। 600 सीड्स में यह उनमें से 56% में 5% से कम एक्सपोज़र वाली लॉटरी चुनता है और 57% में डिजेनरेट होता है; सामान्य डिजेनरेट चुनाव औसतन 4.58 का in-sample per-trade Sharpe देता है। एक जान-बूझकर चुने गए स्पष्ट सीड पर, इसने आठ-ट्रेड, 0.4%-एक्सपोज़र रणनीति को 21.09 के in-sample per-trade Sharpe के साथ ताज पहनाया जो गिरकर 0.13 का full-timeline out-of-sample Sharpe रह गया। आठ ऑब्ज़र्वेशन पर बना रेशियो लगभग ±7.7 वार्षिकीकृत का स्टैंडर्ड एरर रखता है (एक्ट 4) — यह कभी जानकारी नहीं थी।
  3. एक्सपोज़र-अवेयर ऑब्जेक्टिव स्वाभाविक रूप से सुरक्षित हैं। Raw PnL और Full-Timeline Sharpe कभी डिजेनरेट नहीं हुए (0%), क्योंकि वे पूरी टाइमलाइन मापते हैं और निष्क्रियता स्वतः दंडित होती है। आप कभी-कभार ट्रेड करके फुल-टाइमलाइन मेट्रिक को गेम नहीं कर सकते। Raw PnL का इकलौता दोष विपरीत बायस है — यह ओवर-एक्सपोज़ करता है (औसत एक्सपोज़र 0.859, OOS 1.61 सच्चे 1.77 के मुकाबले), θ\theta को ऑप्टिमम से आगे बहाकर मार्केट में ज़्यादा रहने के लिए।
  4. मरम्मत काम करती हैं — लेकिन ये आपको केवल Full-Timeline Sharpe तक वापस लाती हैं। एक एक्सपोज़र फ्लोर और एक ट्रेड-काउंट (conf_k) श्रिंकेज हर एक स्वतंत्र रूप से out-of-sample Sharpe बढ़ाते हैं और डिजेनरेसी को शून्य की ओर धकेलते हैं; साथ में वे एक प्लेटो तक पहुँचते हैं। लेकिन वह प्लेटो है Full-Timeline Sharpe: डिजेनरेसी (emin,k)=(0,0)(e_{\min},k)=(0,0) पर 59.5% से emin=0.20e_{\min}=0.20 पर 0% तक गिरती है और OOS Sharpe 0.66 से 1.71 तक चढ़ता है — ठीक वह संख्या जो साधारण Full Sharpe बिना किसी मदद के पोस्ट करता है, और पूरी तरह मरम्मत किया गया रोबस्ट ऑब्जेक्टिव वास्तव में उससे बाल भर नीचे उतरता है (OOS 1.70, 0.17% डिजेनरेसी: कमज़ोर रूप से डॉमिनेटेड)। सीड 6 पर रोबस्ट ऑब्जेक्टिव एक नियर-ऑप्टिमल, अच्छी तरह एक्सपोज़्ड थ्रेशोल्ड रिकवर करता है (θ=0.979\theta = 0.979, सच्चे 1.041.04 से एक ग्रिड पॉइंट नीचे; 447 ट्रेड्स; OOS Sharpe 1.77)। conf_k को एक फ़ॉलबैक की तरह मानें उस स्थिति के लिए जब per-trade मेट्रिक ज़बरदस्ती दी गई हो, न कि पूरी टाइमलाइन मापने के मुकाबले एक अपग्रेड के रूप में। सटीक कोऑर्डिनेट्स स्केल-निर्भर हैं; सतह का आकार ट्रांसफ़रेबल नतीजा है।
  5. ऑब्जेक्टिव को इस तरह डिज़ाइन करें कि इसे कभी-कभार के लकी ट्रेड्स से गेम न किया जा सके। प्राथमिकता क्रम में: पूरी टाइमलाइन पर मापें (डिफ़ॉल्ट), एक्सपोज़र की मांग करें (सबसे मज़बूत सिंगल लीवर), ट्रेड काउंट से सिकोड़ें (ऑब्जेक्टिव-लेवल Minimum Track Record Length)। इनमें से कोई भी सर्च को होशियार नहीं बनाता — यह लक्ष्य को ईमानदार बनाता है, ताकि सर्च जो मैक्सिमम अनिवार्य रूप से खोजती है वह एक ऐसी रणनीति हो जिसे आप वाकई ट्रेड करेंगे।

एक पैरामीटर सर्च एक आज्ञाकारी जिन्न है। यह ठीक वही इच्छा पूरी करता है जो आप बोलते हैं, वह नहीं जो आपका मतलब था — और "इस मेट्रिक को मैक्सिमाइज़ करो" वह इच्छा है। इसे per-trade Sharpe के रूप में बोलें और यह आठ लकी ट्रेड्स को बुला लाएगा और उन्हें किस्मत कहेगा। इसे इस तरह बोलें कि फ्लैट रहना दंडित हो और मुट्ठी भर ट्रेड्स को सिर्फ़ मुट्ठी भर क्रेडिट मिले, और वही जिन्न, उसी डेटा पर, आपको असली एज दे देता है। जिस रणनीति को आप तैनात करते हैं वह उसी पल चुनी गई थी जब आपने ऑब्जेक्टिव टाइप किया था। इसे जान-बूझकर चुनें।

पूरा प्रयोग — सिंथेटिक मार्केट, छह ऑब्जेक्टिव, 600-सीड मॉन्टे कार्लो, और मरम्मत-स्वीप सतह, हर संख्या एक डिटरमिनिस्टिक स्क्रिप्ट से दोबारा जनरेट करने योग्य — साथी पेपर में है objective-design.marketmaker.cc पर, कोड और डेटा के साथ github.com/suenot/objective-design-degeneracy पर।

यह उसी युद्ध का एक मोर्चा है जो हमारे बाकी अध्ययन अलग-अलग कोणों से लड़ते हैं। Deflated Sharpe Ratio मल्टीपल टेस्टिंग के बाद सर्च के विजेता की कीमत तय करता है — जहाँ यह लेख पूछता है कि क्या ऑब्जेक्टिव ने शुरू में सही रणनीति चुनी, DSR पूछता है कि क्या चुनी गई रणनीति उसे हरा देती है जो सिर्फ़ किस्मत से मिलता। आने वाला probability of backtest overfitting अध्ययन उसी सिलेक्शन बायस पर रीसैंपलिंग साइड से हमला करता है, विजेता की बजाय प्रक्रिया को स्कोर करते हुए। और look-ahead bias taxonomy नकली Sharpe के दूसरे बड़े निर्माता को कैटलॉग करती है — भविष्य से एक लीक — जो पूरी तरह अलग मैकेनिज़्म के ज़रिए वही समान लक्षण (एक शानदार बैकटेस्ट जो लाइव में मर जाता है) पैदा करता है। ऑब्जेक्टिव डिज़ाइन, डिफ्लेशन, ओवरफिटिंग प्रोबेबिलिटी, लुक-अहेड: एक ही अनुशासन के चार नाम — अपने ही बैकटेस्ट से धोखा न खाना।

blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

बाज़ार से आगे रहें

AI ट्रेडिंग इनसाइट्स, मार्केट एनालिसिस और प्लेटफ़ॉर्म अपडेट के लिए हमारे न्यूज़लेटर को सब्सक्राइब करें।

हम आपकी गोपनीयता का सम्मान करते हैं। किसी भी समय अनसब्सक्राइब करें।