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

डिफ्लेटेड शार्प रेशियो: मल्टीपल टेस्टिंग के बाद आपके बैकटेस्ट के कितने 'विजेता' असली बचते हैं?

#algotrading
#backtest
#overfitting
#statistics
#sharpe
#multiple-testing
#validation
🎯
Part 7 of 9 · Collection
Backtesting Without Fooling Yourself

"Backtests Without Illusions" सीरीज़ का हिस्सा।

📄 यह लेख एक रिसर्च पेपर में विकसित हुआ। नीचे दिया हर आंकड़ा एक ही डिटरमिनिस्टिक स्क्रिप्ट से आता है जो नियंत्रित ग्राउंड ट्रुथ बनाती है — शुद्ध-नॉइज़ सर्च, प्लांटेड-एज सर्च, और एक असली correlated पैरामीटर ग्रिड — फिर उस पर डिफ्लेटेड शार्प रेशियो, Harvey-Liu मल्टीपल-टेस्टिंग हेयरकट, और White के Reality Check / Hansen के SPA को चलाकर हर मेथड की फॉल्स-डिस्कवरी रेट और डिटेक्शन पावर को सीधे मापती है। पूरा पेपर ऑनलाइन (इंटरैक्टिव वर्शन + PDF) पढ़ें deflated-sharpe.marketmaker.cc पर, कोड और डेटा github.com/suenot/deflated-sharpe-search पर।

आप एक पैरामीटर स्वीप चलाते हैं। सोलह फास्ट लेंथ, चालीस स्लो लेंथ, मूविंग-एवरेज क्रॉसओवर के 640 कॉम्बिनेशन। ग्रिड खत्म होता है और एक सेल चमकती है: 3.9 का एनुअलाइज्ड शार्प, 6×10126\times10^{-12} का सिंगल-टेस्ट p-value। सिग्निफिकेंस के बारह ज़ीरो। आपको कुछ मिल गया है।

या आपको कुछ नहीं मिला, और सर्च ने इसे आपके लिए ढूंढ निकाला है।

पैरामीटर सर्च कोई टेस्ट नहीं है। यह एक मशीन है जो N कोशिशों में से सबसे किस्मतवाले को ढूंढती है, और जितनी ज़्यादा कोशिशें आप इसे देते हैं, इसका विजेता उतना ही ज़्यादा किस्मतवाला दिखता है — चाहे नीचे कोई असली एज हो या न हो। बेस्ट-ऑफ-N शार्प सिलेक्शन के कारण उतना ही बढ़ा-चढ़ा होता है जितना हज़ार रैंडम लोगों में सबसे लंबा व्यक्ति लंबा दिखता है: इसलिए नहीं कि लंबाई असली है, बल्कि इसलिए कि आपने सर्च किया। विजेता के बगल में छपे सिंगल-टेस्ट आंकड़े — उसका p-value, उसका t-stat, "क्या यह सिग्निफिकेंट है?" — एक अकेली प्री-रजिस्टर्ड हाइपोथिसिस के लिए डिज़ाइन किए गए थे। इन्हें एक सर्च के सर्वाइवर पर लगाइए और ये हर बार, पूरे आत्मविश्वास से, झूठ बोलेंगे।

यह लेख मापता है कि ये कितना बुरी तरह झूठ बोलते हैं, और फिर तीन ऐसे टूल्स को मापता है जो इसे ठीक करते हैं। पूरी बात नियंत्रित ग्राउंड ट्रुथ की है: हम ऐसे रिटर्न जेनरेट करते हैं जहां हमें पता है कि सही जवाब क्या है — कभी शून्य एज वाला शुद्ध नॉइज़, कभी जानी-पहचानी ताकत का प्लांटेड एज — ताकि "क्या मेथड ने सही जवाब दिया?" एक तथ्य हो, कोई राय न हो। पहले हेडलाइन देख लीजिए। known-null सर्च पर, जहां ईमानदार जवाब हमेशा "कोई डिस्कवरी नहीं" होता है, हर टेस्ट कितनी बार झूठा अलार्म बजाता है, यह देखिए:

टेस्ट known-null सर्च पर फॉल्स-डिस्कवरी रेट वर्डिक्ट
नैव "क्या बेस्ट शार्प सिग्निफिकेंट है?" 1.000 हर एक बार डिस्कवरी फ्लैग करता है
डिफ्लेटेड शार्प रेशियो (DSR ≥ 0.95) 0.001 नियंत्रित
Harvey-Liu हेयरकट — Bonferroni 0.057 ~नियंत्रित
Harvey-Liu हेयरकट — Holm 0.057 ~नियंत्रित
Harvey-Liu हेयरकट — BHY 0.007 नियंत्रित
White का Reality Check (bootstrap) 0.022 नियंत्रित

हर सर्च में 1,000 स्ट्रैटेजी, हर एक में 1,000 ऑब्ज़र्वेशन, 2,000 स्वतंत्र null सर्च, हर जगह असली शार्प = 0। सिंथेटिक iid नॉर्मल रिटर्न, seed 0, α = 0.05, 252 पीरियड्स/साल। नैव टेस्ट की फॉल्स-डिस्कवरी रेट ज़्यादा नहीं है — यह ठीक एक है।

पहली पंक्ति को तब तक पढ़िए जब तक यह चुभने न लगे। एक टेस्ट जिसे शुद्ध नॉइज़ पर सिर्फ 5% बार फायर करना चाहिए, वह 100% बार फायर करता है — क्योंकि आप इसे शुद्ध नॉइज़ नहीं दिखा रहे, आप इसे शुद्ध नॉइज़ के हज़ार ड्रॉ का मैक्सिमम दिखा रहे हैं, और हज़ार सिक्का-उछालने वालों का मैक्सिमम हमेशा किसी जीनियस जैसा दिखता है। बाकी हर पंक्ति एक ऐसा मेथड है जो यह जानता है और इसके लिए करेक्ट करता है। यही पूरा लेख है: पहली पंक्ति 1.000 क्यों है, बाकी क्यों नहीं हैं, और वह एक जगह (आखिरी सेक्शन) जहां अच्छे मेथड्स को भी ईमानदार रहने के लिए एक दूसरे करेक्शन की ज़रूरत पड़ती है।

एक्ट 1 — जाल: सर्च कुछ भी नहीं से शार्प बना देता है

A parameter search depicted as a slot machine feeding a thousand random strategy curves through a funnel, with a single luckiest curve emerging labeled with a tempting Sharpe ratio while the discarded curves fade into noise behind it

सबसे साफ जाल से शुरू करते हैं। N=1000N = 1000 स्ट्रैटेजी जेनरेट करें जिनके रिटर्न स्वतंत्र स्टैंडर्ड-नॉर्मल नॉइज़ हों — कोई ड्रिफ्ट नहीं, कोई स्किल नहीं, सबके लिए असली शार्प ठीक शून्य। हर एक में T=1000T = 1000 ऑब्ज़र्वेशन हैं। अब वही करें जो हर पैरामीटर सर्च करता है: सबसे अच्छे को रख लें।

बेस्ट-ऑफ-1000 प्रति-ऑब्ज़र्वेशन शार्प औसतन 0.1027 आता है, जो एनुअलाइज़ करने पर 1.63 बनता है (व्युत्पन्न: 0.1027×2521.630.1027 \times \sqrt{252} \approx 1.63)। यह कोई मामूली नंबर नहीं है। 1.63 का एनुअलाइज्ड शार्प वह नंबर है जो किसी स्ट्रैटेजी को फंडिंग दिला देता है, जिस पर आर्टिकल लिखा जाता है, जिसे एलोकेशन मिलता है। यह एक रैंडम-नंबर जेनरेटर से आया है जिसका ड्रिफ्ट शून्य पर सेट था।

अब विजेता को नैव सिग्निफिकेंस टेस्ट को सौंपिए — वह टेस्ट जिसे हर बैकटेस्ट लाइब्रेरी मुफ्त में प्रिंट करती है। इसके शार्प को t-statistic में बदलें (t=SR^Tt = \hat{SR}\sqrt{T}), वन-साइडेड p-value लें, और अगर p<0.05p < 0.05 हो तो इसे डिस्कवरी कहें:

t=SR^T,p=1Z(t),"डिस्कवरी" अगर p<αt = \hat{SR}\sqrt{T}, \qquad p = 1 - Z(t), \qquad \text{"डिस्कवरी" अगर } p < \alpha

इन नॉइज़ विजेताओं का मीडियन सिंगल-टेस्ट p-value 0.000686 है — बिना किसी एज वाली स्ट्रैटेजी के लिए "सिग्निफिकेंस" के तीन ज़ीरो। और 2,000 स्वतंत्र null सर्च में, नैव टेस्ट हर एक में डिस्कवरी घोषित करता है: फॉल्स-डिस्कवरी रेट 1.000। "बढ़ा-चढ़ा" नहीं। "थोड़ा ज़्यादा" नहीं। एक टेस्ट जो, कंस्ट्रक्शन के हिसाब से, एक सिंगल null हाइपोथिसिस पर ज़्यादा से ज़्यादा 5% बार सही होता है, वह किसी सर्च के विजेता पर 100% गलत निकलता है।

एक बार नाम दे दिया जाए तो मैकेनिज़्म बहुत सूक्ष्म नहीं रहता। नैव टेस्ट पूछता है "क्या यह शार्प संयोगवश null के तहत आ सकता है?" — एक ऐसी स्ट्रैटेजी के लिए यह उचित सवाल है जिसे आपने डेटा देखने से पहले चुना था। लेकिन आपने इसे इसलिए चुना क्योंकि इसका शार्प हज़ार में सबसे ऊंचा था। आपने मैक्सिमम पर कंडीशन लगाया है, और मैक्सिमम की सैंपलिंग डिस्ट्रीब्यूशन एक सिंगल ड्रॉ की सैंपलिंग डिस्ट्रीब्यूशन से बिल्कुल अलग है। यह वही बीमारी है जिसका निदान हमारी look-ahead bias taxonomy ने दूसरे छोर से किया था — वहां, एक-बार का लीक नॉइज़ से 15 का शार्प बना देता था; यहां, एक सर्च बिना किसी लीक के, सिर्फ सिलेक्शन से नॉइज़ से 1.63 का शार्प बना देता है। मैकेनिज़्म अलग, लक्षण एक जैसा: एक बहुत बढ़िया दिखने वाला शार्प जिसका कोई मतलब नहीं।

1.63 वाला नंबर अहम है, इसे याद रखिए। यह इस सर्च के लिए नॉइज़ सीलिंग है: वह शार्प जिसकी उम्मीद आपको 1,000 ज़ीरो-एज स्ट्रैटेजी में से सबसे किस्मतवाली से करनी चाहिए। किसी भी सर्च विजेता का ईमानदार टेस्ट इसे शून्य के मुकाबले नहीं, बल्कि इसके मुकाबले, यानी जब आप हज़ार बार देखते हैं तो सिर्फ किस्मत क्या देती है, उसके मुकाबले करना होगा।

एक्ट 2 — टूलकिट: सर्च की कीमत लगाने के तीन तरीके

Three measurement instruments laid out on a workbench, each aimed at the same inflated Sharpe number: a deflating gauge lowering a benchmark bar, a set of graduated haircut scissors, and a bootstrap resampling wheel spinning off many shadow copies of a returns series

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

PSR और डिफ्लेटेड शार्प रेशियो (Bailey & López de Prado, 2012 / 2014)

Probabilistic Sharpe Ratio "क्या शार्प पॉज़िटिव है?" से तीखा सवाल पूछता है। यह पूछता है: सैंपल की लंबाई और रिटर्न के आकार (स्क्यू, फैट टेल) को देखते हुए, असली शार्प के बेंचमार्क SRSR^* से ज़्यादा होने की प्रोबेबिलिटी क्या है?

PSR(SR)=Z ⁣((SR^SR)n11γ^3SR^+γ^414SR^2)\text{PSR}(SR^*) = Z\!\left( \frac{(\hat{SR} - SR^*)\sqrt{n-1}}{\sqrt{\,1 - \hat\gamma_3\,\hat{SR} + \frac{\hat\gamma_4 - 1}{4}\,\hat{SR}^2\,}} \right)

यहां ZZ स्टैंडर्ड-नॉर्मल CDF है, γ^3\hat\gamma_3 स्क्यू है, और γ^4\hat\gamma_4 non-excess convention में कर्टोसिस है (नॉर्मल ⇒ γ^4=3\hat\gamma_4 = 3; यहां एक्सेस कर्टोसिस को बिना 3 जोड़े इस्तेमाल करेंगे तो डिफ्लेशन गलत निकलेगा)। SR=0SR^* = 0 सेट करें तो PSR सिर्फ एक फिनाइट-सैंपल सिग्निफिकेंस टेस्ट है। जादू SRSR^* को सही चुनने में है।

डिफ्लेटेड शार्प रेशियो PSR है, जिसका मूल्यांकन ऐसे बेंचमार्क पर किया जाता है जो शून्य नहीं बल्कि पूरी सर्च का एक्सपेक्टेड मैक्सिमम शार्प है:

SR0=Var[{SRn}]  ((1γ)Z1 ⁣(11N)  +  γZ1 ⁣(11Ne))SR_0 = \sqrt{\operatorname{Var}[\{SR_n\}]}\;\Big(\,(1-\gamma)\,Z^{-1}\!\big(1 - \tfrac{1}{N}\big) \;+\; \gamma\,Z^{-1}\!\big(1 - \tfrac{1}{N e}\big)\Big)

जहां Var[{SRn}]\operatorname{Var}[\{SR_n\}] सभी N ट्रायल शार्प्स में वेरिएंस है (वह डिस्पर्शन जो सर्च ने खुद पैदा किया), γ0.5772\gamma \approx 0.5772 Euler-Mascheroni कॉन्स्टेंट है, और दोनों inverse-Normal टर्म NN स्टैंडर्ड-नॉर्मल ड्रॉ के एक्सपेक्टेड मैक्सिमम का Extreme-Value-Theory एप्रॉक्सिमेशन हैं। कोड में यह इतना छोटा है कि इम्प्रेस करने लायक भी नहीं लगता:

def expected_max_sharpe(sr_variance, N, mean_sr=0.0):
    """E[max of N independent SR estimates ~ N(mean_sr, sr_variance)]
    (Bailey & LdP 2014)."""
    g = EULER_MASCHERONI                       # 0.5772156649
    a = norm.ppf(1.0 - 1.0 / N)                # Z^{-1}(1 - 1/N)
    b = norm.ppf(1.0 - 1.0 / (N * E))          # Z^{-1}(1 - 1/(N e))
    return float(mean_sr + np.sqrt(sr_variance) * ((1.0 - g) * a + g * b))

फिर DSR बस उस डिफ्लेटेड बार वाला PSR है:

def deflated_sharpe(sr_max, sr_estimates, T, skew=0.0, kurt=3.0, N=None):
    """DSR = PSR(sr_max, SR0). Returns (dsr, sr0)."""
    v = float(np.asarray(sr_estimates).var(ddof=1))   # dispersion of the search
    m = float(np.asarray(sr_estimates).mean())
    if N is None:
        N = len(sr_estimates)
    sr0 = expected_max_sharpe(v, N, mean_sr=m)
    return psr(sr_max, sr0, T, skew, kurt), sr0

DSR एक प्रोबेबिलिटी है। हम DSR1α=0.95\text{DSR} \geq 1 - \alpha = 0.95 होने पर डिस्कवरी घोषित करते हैं: विजेता का असली शार्प 95% कॉन्फिडेंस के साथ किस्मत-से-बेस्ट को हरा देता है। ध्यान दीजिए SR0SR_0 में एक अहम धारणा छिपी है: NN ट्रायल को स्वतंत्र माना गया है। एक्ट 5 पूरी तरह इस बात पर है कि जब ऐसा नहीं होता तो क्या होता है।

Harvey-Liu हेयरकट (2015)

Harvey और Liu उसी समस्या पर मल्टीपल-टेस्टिंग p-value एडजस्टमेंट से हमला करते हैं — क्लासिकल मशीनरी "मैंने M टेस्ट चलाए, मुझे खुद को धोखा मत देने दो" के लिए। MM सिंगल-टेस्ट p-value को p(1)p(M)p_{(1)} \le \dots \le p_{(M)} के क्रम में लगाइए और उन्हें बढ़ाइए:

piBonf=min[Mp(i),1],piHolm=min ⁣[maxji{(Mj+1)p(j)},1]p_i^{\text{Bonf}} = \min[\,M\,p_{(i)},\,1\,], \qquad p_i^{\text{Holm}} = \min\!\Big[\max_{j\le i}\{(M-j+1)\,p_{(j)}\},\,1\Big]

Bonferroni एक भोथरा हथियार है (हर p-value को MM से गुणा करके किसी भी झूठे पॉज़िटिव की प्रोबेबिलिटी को नियंत्रित करें); Holm इसका यूनिफॉर्मली-ज़्यादा-पावरफुल स्टेप-डाउन चचेरा भाई है। तीसरा, Benjamini-Yekutieli (BHY), फॉल्स-डिस्कवरी रेट को नियंत्रित करता है — आपकी रिजेक्शन में गलत होने का एक्सपेक्टेड फ्रैक्शन — और, अहम बात, यह टेस्ट्स के बीच मनमानी डिपेंडेंसी के तहत भी ऐसा करता है, न्यूमरेटर में हार्मोनिक नॉर्मलाइज़र इस्तेमाल करके:

c(M)=j=1M1j,c(1000)7.49c(M) = \sum_{j=1}^{M} \frac{1}{j}, \qquad c(1000) \approx 7.49

वह c(1000)=7.49c(1000) = 7.49 वह कीमत है जो BHY आपके 1,000 ट्रायल को स्वतंत्र न मानने के लिए वसूलता है — यह FDR थ्रेशोल्ड को एक ऐसे फैक्टर से बढ़ाता है जो lnM\ln M की तरह बढ़ता है। "हेयरकट" खुद पंचलाइन मेट्रिक है: एडजस्ट किए गए p-value को वापस शार्प में बदलें और बताएं कि ओरिजिनल शार्प का कितना हिस्सा शेव करना पड़ा। 100% का हेयरकट मतलब विजेता पूरी तरह मल्टीपल टेस्टिंग से समझाया जा सकता है; 15% मतलब यह ज़्यादातर बचा रहता है।

White का Reality Check और Hansen का SPA (2000 / 2005)

तीसरा टूल कोई डिस्ट्रिब्यूशनल धारणा नहीं बनाता। White का Reality Check हर रूल के असली रिटर्न लेता है, max-over-rules statistic बनाता है, और इसकी null डिस्ट्रीब्यूशन को सीधे bootstrap करता है:

RCT=maxk=1,,KTfˉkRC_T = \max_{k=1,\dots,K} \sqrt{T}\,\bar{f}_k

जहां fˉk\bar{f}_k बेंचमार्क के मुकाबले रूल kk का मीन परफॉर्मेंस है। यह रिटर्न को stationary bootstrap से रीसैंपल करता है (Politis-Romano — रैंडम-लेंथ ब्लॉक्स ताकि सीरियल करेलेशन रीसैंपलिंग में बचा रहे), null को संतुष्ट करने के लिए हर ड्रॉ को रीसेंटर करता है, हर ड्रॉ पर मैक्सिमम फिर से कैलकुलेट करता है, और p-value को उन bootstrap मैक्सिमा के फ्रैक्शन के रूप में रिपोर्ट करता है जो ऑब्ज़र्व्ड वैल्यू को मात देते हैं। Hansen का SPA RC को दो तरीकों से तेज़ करता है: स्टूडेंटाइज़ेशन (हर रूल के मीन को उसके अपने स्टैंडर्ड एरर से भाग दें, ताकि कोई एक जंगली हाई-वेरिएंस रूल मैक्सिमम को हाईजैक न कर सके) और null का एक कंसिस्टेंट, सैंपल-डिपेंडेंट रीसेंटरिंग। हमारा इम्प्लीमेंटेशन स्टूडेंटाइज़ेशन तो जोड़ता है लेकिन पूरा कंसिस्टेंट-रीसेंटरिंग स्टेप नहीं — इसलिए जहां भी यह लेख SPA-type p-value रिपोर्ट करता है, उसे एक स्टूडेंटाइज़्ड Reality Check समझें, पूरा Hansen SPA नहीं। जहां DSR पूछता है "क्या विजेता इस सर्च के भीतर खास है?", वहां Reality Check पूछता है "क्या बेस्ट रूल, मैंने कितने रूल आज़माए इसका ईमानदारी से हिसाब लगाने के बाद भी, कैश को हराता है?" — और यह correlated रूल्स को नैटिवली, bootstrap के ज़रिए, बिना कभी ट्रायल गिने, हैंडल करता है। इस फर्क को याद रखें; आखिरी सेक्शन इसी पर टिका है।

एक्ट 3 — कैलिब्रेशन ही पूरा प्रूफ है

A calibration chart contrasting one bar towering at a false-discovery rate of one against five short bars pinned near the alpha level of five percent, with a horizontal reference line marking the noise ceiling Sharpe of one point six three

एक ऐसा मेथड जो कुछ भी फ्लैग न करे, उसकी फॉल्स-डिस्कवरी रेट भी शून्य होगी — और वह बेकार होगा। इसलिए इन टूल्स का इकलौता सार्थक टेस्ट दो-तरफा है: known-null डेटा पर इन्हें फॉल्स डिस्कवरी को α\alpha पर या उससे नीचे नियंत्रित करना होगा, और known-edge डेटा पर (अगला सेक्शन) इन्हें फिर भी फायर करना होगा। यह सेक्शन पहला आधा है।

2,000 स्वतंत्र सर्च चलाइए, हर एक 1,000 ज़ीरो-एज स्ट्रैटेजी पर, और गिनिए कि हर मेथड कितनी बार डिस्कवरी घोषित करता है। वह गिनती, 2,000 से भाग देने पर, फॉल्स-डिस्कवरी रेट है — और चूंकि सच्चाई कोई एज नहीं है, हर डिस्कवरी फॉल्स है:

टेस्ट फॉल्स-डिस्कवरी रेट (α = 0.05)
नैव सिग्निफिकेंस 1.000
डिफ्लेटेड शार्प रेशियो 0.001
Harvey-Liu — Bonferroni 0.057
Harvey-Liu — Holm 0.057
Harvey-Liu — BHY 0.007
White का Reality Check 0.022

हर सिद्धांतवादी मेथड 5% रेखा पर या उसके पास उतरता है — दोनों FWER हेयरकट थोड़ा ऊपर, DSR/BHY/RC नीचे — जबकि नैव टेस्ट 100 पर बैठा है। (Bonferroni और Holm यहां एक जैसा 0.057 प्रिंट करते हैं, और यह इत्तेफाक नहीं है: सिंगल बेस्ट स्ट्रैटेजी के लिए Holm का पहला स्टेप (M1+1)p(1)=Mp(1)(M-1+1)\,p_{(1)} = M\,p_{(1)} है, जो कंस्ट्रक्शन से ही Bonferroni के बराबर है, इसलिए यह एक कन्फर्मेशन है, दो नहीं।) लेकिन पूरे स्टडी का सबसे गहरा नंबर इस टेबल में नहीं है — यह वह डिफ्लेटेड बेंचमार्क है जो DSR कॉलम पैदा करता है। null सर्च में औसत निकालने पर, SR0SR_0 प्रति-ऑब्ज़र्वेशन 0.1030 आता है, जो एनुअलाइज़ करने पर 1.63 बनता है (व्युत्पन्न: 0.1030×2521.630.1030 \times \sqrt{252} \approx 1.63) — वही 1.63 जो औसत नॉइज़ विजेता पोस्ट करता है (1.63)। यह इत्तेफाक नहीं है; यही पूरा आइडिया काम कर रहा है:

डिफ्लेटेड बार ठीक नॉइज़ सीलिंग पर बैठता है। DSR किसी सर्च विजेता से शून्य को हराने के लिए नहीं कहता। यह विजेता से इस साइज़ की सर्च से सिर्फ किस्मत से मिलने वाला बेस्ट स्कोर हराने के लिए कहता है — यहां एनुअलाइज्ड 1.63। जो विजेता सिर्फ नॉइज़ सीलिंग को छूता है उसका DSR ≈ 0.5 (सिक्का उछालने के बराबर) होता है, इसीलिए औसत null DSR 0.495 है, कोई छोटा नंबर नहीं। डिस्कवरी बनने के लिए विजेता को 1.63 को और उससे ज़्यादा पार करना होगा — इतना कि PSR 0.95 से आगे निकल जाए।

यह पूरी एक्सरसाइज़ को नया फ्रेम देता है। नैव टेस्ट शून्य से दूरी मापता है; हर सर्च उस बार को आसानी से पार कर लेती है, इसीलिए यह बेकार है। DSR नॉइज़ सीलिंग से दूरी मापता है, और उस बार को पार करना वाकई मुश्किल है — जैसा होना चाहिए। Harvey-Liu हेयरकट और Reality Check अलग-अलग रास्तों से वही नियंत्रण हासिल करते हैं (BHY के लिए c(1000)=7.49c(1000)=7.49 का इनफ्लेशन, RC के लिए एक bootstrap मैक्सिमम-डिस्ट्रीब्यूशन), और लगभग एक ही जगह उतरते हैं: 0.001 से 0.057, α\alpha पर या उसके पास। Bonferroni/Holm का 0.057 5% रेखा से थोड़ा ऊपर है, लेकिन बस थोड़ा सा: 2,000 Monte-Carlo सर्च के साथ 0.05 के पास FDR एस्टिमेट पर स्टैंडर्ड एरर लगभग 0.005 है, इसलिए 0.057 α\alpha से लगभग 1.4 स्टैंडर्ड एरर ऊपर बैठता है — यह Monte-Carlo नॉइज़ है, टूटी हुई गारंटी नहीं। "FWER को नियंत्रित करता है" वैसे भी एक एसिम्प्टोटिक वादा है, T=1000T = 1000 पर बिट-एग्ज़ैक्ट वादा नहीं।

एक्ट 4 — पावर: क्या यह असली एज को अब भी रखता है?

An S-shaped detection-power curve rising from near zero to one as the planted true Sharpe increases along the horizontal axis, with a vertical dashed line at the noise-ceiling Sharpe of one point six three and the curve reaching fifty percent power just to the right of it, and a flat false-positive line pinned to the floor

फॉल्स डिस्कवरी को नियंत्रित करना टेस्ट का सिर्फ आधा हिस्सा है — एक पैरानॉइड मेथड जो सब कुछ रिजेक्ट कर दे, उसका स्कोर परफेक्ट 0.000 होगा और वह बेकार होगा। दूसरा आधा: जब असली एज मौजूद है, तो क्या DSR उसे ढूंढ पाता है?

एक प्लांट कीजिए। 1,000 स्ट्रैटेजी के फील्ड में, 25 को असली एज दें, जिसकी ताकत पहले से पता हो, और बाकी को नॉइज़ रहने दें, फिर सर्च चलाएं और पूछें कि क्या DSR विजेता को फ्लैग करता है। प्लांटेड एज को कमज़ोर से मज़बूत की तरफ स्वीप कीजिए और डिटेक्शन पावर एक साफ S-कर्व बनाता है (फॉल्स-पॉज़िटिव रेट पूरे समय ~0 पर रहती है):

प्लांटेड असली शार्प (एनुअलाइज्ड) DSR डिटेक्शन पावर DSR फॉल्स-पॉज़िटिव रेट
0.79 0.005 0.000
1.27 0.090 0.000
1.90 0.651 0.000
2.54 0.998 0.000
3.17 1.000 0.000

देखिए कर्व कहां मुड़ता है। नॉइज़ सीलिंग से नीचे — 0.79 का असली एनुअलाइज्ड शार्प, जो 1.63 से काफी नीचे है — DSR 0.5% बार फायर करता है, सही तरीके से इसे मानने से इनकार करता है: इतना कमज़ोर एज वाकई 1,000-ट्रायल सर्च से पैदा हुई किस्मत से अलग नहीं पहचाना जा सकता, और इसके उलट दिखावा करना पावरफुल होने के बजाय बेईमानी होगी। सीलिंग के आसपास कर्व तेज़ी से चढ़ता है (1.27 पर 0.09, 1.90 पर 0.65)। 2.54 के एनुअलाइज्ड शार्प तक पावर 0.998 हो जाती है; 3.17 तक यह परफेक्ट 1.000 है। मज़बूत एज लगभग हर बार बचे रहते हैं, फॉल्स पॉज़िटिव शून्य पर पिन रहते हैं, और 50%-पावर क्रॉसओवर लगभग 1.73 के एनुअलाइज्ड शार्प पर बैठता है (1.27 और 1.90 वाली पंक्तियों के बीच इंटरपोलेशन से व्युत्पन्न) — 1.63 की नॉइज़ सीलिंग से ठीक ऊपर, वहीं जहां एक ईमानदार बार को होना चाहिए: वह बिंदु जहां से एक एज 1,000-ट्रायल सर्च द्वारा गढ़े गए से आगे निकलना शुरू करता है।

यही वह प्रॉपर्टी है जो आप वाकई चाहते हैं, S-कर्व के रूप में बयान की गई: नॉइज़ सीलिंग से नीचे के एज सही तरीके से किस्मत मान लिए जाते हैं; इससे काफी ऊपर के एज लगभग एक के बराबर पावर के साथ रखे जाते हैं। नैव टेस्ट, इसके उलट, 0.79 के असली शार्प पर भी प्लांटेड एज को 67% बार "डिटेक्ट" करता है — लेकिन यह नंबर बेमानी है, क्योंकि हम पहले ही देख चुके हैं कि यह अस्तित्वहीन एज को 100% बार डिटेक्ट करता है। एक टेस्ट जो हर चीज़ पर फायर करता है, उसमें कोई पावर नहीं होती; उसमें कोई भेद करने की क्षमता नहीं होती। DSR मामूली एज के प्रति थोड़ी संवेदनशीलता (0.79 और 1.27 वाली पंक्तियां) की कुर्बानी देता है उस चीज़ के लिए जो मायने रखती है: इसकी डिस्कवरी असली होती हैं।

एक्ट 5 — प्रैक्टिशनर का जाल: correlated grids

A parameter-grid heatmap of moving-average crossover results glowing with strong pairwise correlation between neighboring cells, beside a horizontal axis of five different effective-trial estimates spanning from about two to nearly four hundred, with a shaded robustness band showing the genuine edge clearing the deflated bar across almost the entire range and only the far-right over-counting estimate dipping below

अब तक सब कुछ स्वतंत्र स्ट्रैटेजी पर था — सबसे साफ सेटिंग, और वह जगह जहां DSR की स्वतंत्रता वाली धारणा बिल्कुल सही बैठती है। असली पैरामीटर ग्रिड ऐसे नहीं होते, और यहीं एक टूल, जिसे भोलेपन से इस्तेमाल किया जाए, गलत होने का नया तरीका बन जाता है।

एक ईमानदार मूविंग-एवरेज क्रॉसओवर सर्च लीजिए: 16 फास्ट लेंथ ×\times 40 स्लो लेंथ =640= 640 ट्रायल, हर एक 755 ऑब्ज़र्वेशन का। इस तरह का ग्रिड करेलेशन में डूबा होता है — fast=45/slow=120 और fast=45/slow=125 लगभग एक जैसी स्ट्रैटेजी हैं, इसलिए उनकी रिटर्न स्ट्रीम साथ-साथ चलती है। 640 ट्रायल में मापा गया औसत पेयरवाइज़ करेलेशन: लगभग 0.61। ये 640 स्वतंत्र दांव नहीं हैं। बिल्कुल नहीं।

केस A — रैंडम वॉक (कोई एज नहीं): हर मेथड इसे सही तरीके से खारिज करता है

ग्रिड को एक शुद्ध रैंडम वॉक पर चलाइए। विजेता लुभावना दिखता है: पैरामीटर fast=45/slow=120, बेस्ट एनुअलाइज्ड शार्प 0.81, सिंगल-टेस्ट p-value 0.081। हर मेथड इसके पार देख लेता है:

मेथड परिणाम वर्डिक्ट
DSR (raw K = 640) 0.431 खारिज (< 0.95)
Reality Check p 0.570 खारिज
SPA-type p (studentized RC) 0.569 खारिज
Harvey-Liu हेयरकट 100% खारिज

उस निशानी से शुरू करते हैं जिसे किसी डिफ्लेशन की ज़रूरत नहीं: इस विजेता का बिना-एडजस्ट किया गया फिनाइट-सैंपल सिग्निफिकेंस, यानी शून्य के मुकाबले PSR\text{PSR}, सिर्फ 0.918 है — 640 ट्रायल में से एक के लिए भी करेक्ट किए बिना पहले ही 0.95 से कम। डिफ्लेशन फिर इसे दबा देता है: बार एक प्रति-ऑब्ज़र्वेशन SR0=0.057SR_0 = 0.057 है, एनुअलाइज्ड ~0.91 (व्युत्पन्न: 0.057×2520.057 \times \sqrt{252}) — विजेता के 0.81 से ऊपर। बेस्ट स्ट्रैटेजी नॉइज़ सीलिंग तक भी नहीं पहुंचती, DSR ≈ 0.43 (सिक्का उछालने से भी बुरा), और Reality Check, SPA-type टेस्ट, और 100% हेयरकट — सब सहमत हैं: यहां कुछ नहीं है। बिल्कुल सही। यह आसान केस है, और यह काम करता है — और, जैसा हम आगे देखेंगे, यह हर इफेक्टिव-ट्रायल गिनती पर खारिज ही रहता है जिसे हम आज़माते हैं।

केस B — एक असली रेजीम एज: रॉ DSR गलत निकलता है

अब उसी ग्रिड को एक रेजीम-स्विचिंग सीरीज़ पर चलाइए जिसमें एक असली, इस्तेमाल करने लायक एज है। विजेता ज़ोरदार है: पैरामीटर fast=3/slow=55, बेस्ट एनुअलाइज्ड शार्प 3.92 — यह इन-सैंपल, चुना हुआ शार्प है, खुद सर्च से सिलेक्शन-बढ़ा हुआ (कोई असली या आउट-ऑफ-सैंपल एज नहीं), लेकिन अंतर्निहित रेजीम इफेक्ट असली है — 6×10126\times10^{-12} के सिंगल-टेस्ट p-value और लगभग 1.000 के बिना-डिफ्लेट किए PSR\text{PSR}-वर्सेज़-शून्य सिग्निफिकेंस के साथ। यहां एक असली एज है और विजेता ने इसे ढूंढ लिया है। देखिए रॉ DSR इसे फिर भी कैसे खारिज कर देता है:

मेथड परिणाम वर्डिक्ट
DSR (raw K = 640) 0.748 खारिज (< 0.95) ✗ ओवर-डिफ्लेटेड
Reality Check p 0.0024 पुष्टि ✓
SPA-type p (studentized RC) 0.0038 पुष्टि ✓
Harvey-Liu हेयरकट 15% पुष्टि ✓

रॉ DSR का 0.748 एक असली एज की फॉल्स रिजेक्शन है। वजह है स्वतंत्रता वाली धारणा, जो अब बुरी तरह टूट चुकी है: DSR ने 640 correlated ट्रायल को 640 स्वतंत्र ड्रॉ मानकर अपना डिफ्लेटेड बार बनाया, जिससे expected-maximum SR0SR_0 बढ़कर प्रति-ऑब्ज़र्वेशन 0.221 हो जाता है — एनुअलाइज्ड ~3.51 (व्युत्पन्न: 0.221×2520.221 \times \sqrt{252})। 3.51 के बार के मुकाबले, 3.92 का विजेता इसे सिर्फ मामूली तरीके से पार करता है, और DSR 0.748 पर उतरता है — 0.95 से कम। दो चीज़ें उस बार को ऊपर पंप करती हैं: रॉ गिनती (640 नज़रें, न कि कुछ इफेक्टिव नज़रें), और ट्रायल्स के बीच असली स्किल डिस्पर्शन — कुछ पैरामीटर जोड़े वाकई रेजीम सीरीज़ पर बेहतर हैं, जो Var[{SRn}]\operatorname{Var}[\{SR_n\}] को बढ़ाता है और SR0SR_0 को उससे आगे ले जाता है जो सिर्फ किस्मत देती। दोनों एक ही दिशा में धकेलते हैं, और बार आखिर में बहुत ऊंचा हो जाता है क्योंकि सर्च वाकई कभी 640 स्वतंत्र नज़रें नहीं थी; यह कुछ स्वतंत्र दांव थे, जिन्हें 640 बार सैंपल किया गया।

DSR को इसके बजाय इफेक्टिव ट्रायल संख्या दीजिए। ऊपर इस्तेमाल किया गया वन-लाइनर औसत पेयरवाइज़ करेलेशन से एक मोटा-मोटा अनुमान है:

def effective_n_trials(returns_matrix):
    """N_eff = N / (1 + (N-1) * rho_bar), clipped to [1, N].
    Correlated trials -> fewer independent bets."""
    C = np.corrcoef(returns_matrix, rowvar=False)
    rho_bar = max(np.nanmean(C[np.triu_indices(C.shape[0], k=1)]), 0.0)
    N = returns_matrix.shape[1]
    neff = N / (1.0 + (N - 1) * rho_bar)
    return float(min(max(neff, 1.0), N))

ρˉ0.62\bar\rho \approx 0.62 और N=640N = 640 के साथ, यह ग्रिड को इफेक्टिव Neff1.6N_{\text{eff}} \approx 1.6 ट्रायल में समेट देता है (व्युत्पन्न: 640/(1+639×0.62)640 / (1 + 639 \times 0.62)), और DSR उछलकर 1.000 हो जाता है। लेकिन इस नंबर पर जश्न मनाने से पहले रुकिए, क्योंकि यह इस पूरे सेक्शन का सबसे कमज़ोर सबूत है। Neff1.6N_{\text{eff}} \approx 1.6 पर डिफ्लेटेड बार गिरकर एनुअलाइज्ड SR00.25SR_0 \approx 0.25 हो जाता है — लगभग ट्रायल मीन, लगभग शून्य। वहां डिफ्लेशन बंद हो चुका है: Neff1.6N_{\text{eff}} \approx 1.6 पर DSR सिर्फ विजेता के बिना-डिफ्लेट किए फिनाइट-सैंपल सिग्निफिकेंस (PSR\text{PSR}-वर्सेज़-शून्य =1.000= 1.000) को दोहरा रहा है। वर्डिक्ट रॉ सिग्निफिकेंस से विरासत में मिला है, मल्टीपल-टेस्टिंग करेक्शन से पैदा नहीं हुआ। और रैंडम-वॉक साइड पर उलटा नोट: उसकी Neff1.6N_{\text{eff}} \approx 1.6 पर रिजेक्शन तभी टिकती है जब वह विजेता शुरुआत में ही स्वतंत्र रूप से मामूली था (PSR\text{PSR}-वर्सेज़-शून्य =0.918<0.95= 0.918 < 0.95)। पूरे तर्क को 1.6 पर टिकाएं और एक शक करने वाला सही होगा अगर वह कंधे उचकाए: आपने करेक्शन बंद कर दिया और नीचे जो कुछ था उसे रिपोर्ट कर दिया।

तो एक अनुमान पर मत टिकिए। ईमानदार कदम — और ज़्यादा मज़बूत कदम — यह है कि NeffN_{\text{eff}} को पांच अलग-अलग मानक तरीकों से निकालें और पूरी रेंज में वर्डिक्ट पढ़ें। यहां वही 640-ट्रायल सिग्नल ग्रिड पर लगाए गए पांच एस्टिमेटर हैं, हर एक अपने बताए गए डिफ्लेटेड बार और उससे निकलने वाले DSR के साथ:

इफेक्टिव-ट्रायल एस्टिमेटर NeffN_{\text{eff}} डिफ्लेटेड बार SR0SR_0 (वार्षिक) DSR वर्डिक्ट
औसत करेलेशन 1.6 0.25 1.000 बरकरार
पार्टिसिपेशन रेशियो 2.4 0.43 1.000 बरकरार
PCA (95% वेरिएंस) 16 1.85 1.000 बरकरार
Kaiser (eigenvalues > 1) 21 2.00 0.999 बरकरार
Cheverud-Nyholt 370 3.31 0.845 खारिज
रॉ ग्रिड गिनती (कोई एडजस्टमेंट नहीं) 640 3.51 0.748 खारिज

एस्टिमेटर: औसत करेलेशन ऊपर वाला N/(1+(N1)ρˉ)N/(1+(N-1)\bar\rho) वन-लाइनर है; पार्टिसिपेशन रेशियो (λi)2/λi2(\sum\lambda_i)^2/\sum\lambda_i^2 और PCA-95%/Kaiser गिनतियां करेलेशन मैट्रिक्स के eigenvalues से इफेक्टिव डाइमेंशनैलिटी पढ़ती हैं; Cheverud-Nyholt जेनेटिक्स लिटरेचर से एक वेरिएंस-ऑफ-eigenvalues एस्टिमेटर है जो near-equicorrelation के तहत ओवर-काउंट करने के लिए जाना जाता है।

अब बात समझ आती है, और यह "कोई भी एडजस्टमेंट आपको बचा लेगा" नहीं है। डिफेंसिबल मिडल देखिए — PCA-95% (Neff=16N_{\text{eff}} = 16) और Kaiser (Neff=21N_{\text{eff}} = 21)। ये डिफ्लेशन-बंद वाला रीजीम नहीं हैं; ये 1.85 से 2.00 का असली एनुअलाइज्ड SR0SR_0 बार थोपते हैं — एक गंभीर हेयरकट, नॉइज़ से काफी ऊपर, 16-21 इफेक्टिव नज़रों के लिए एक असली मल्टीपल-टेस्टिंग जुर्माना। और 3.92 का एज इसे फिर भी पार करता है (DSR 1.000 और 0.999)। यह सिग्नल किसी भी NeffN_{\text{eff}} पर, 144.8 से नीचे (क्रॉसिंग पॉइंट से व्युत्पन्न), DSR के लिए बचा रहता है; यह सिर्फ Cheverud-Nyholt के Neff=370N_{\text{eff}} = 370 के तहत फेल होता है, ऐसा एस्टिमेटर जो near-equicorrelated ट्रायल में साबित तौर पर ओवर-काउंट करता है — और खुद रॉ, बिना-एडजस्ट की गई 640 की गिनती भी DSR को सिर्फ 0.748 तक नीचे धकेलती है, शून्य तक नहीं। रैंडम-वॉक वाला विजेता, इन्हीं पांच एस्टिमेटर से गुज़ारने पर, हर एक पर खारिज होता है (यह 1 से ऊपर किसी भी NeffN_{\text{eff}} के लिए नहीं बचता)। यही असली नतीजा है: कोई एक किस्मतवाला नंबर नहीं, बल्कि एक ऐसा वर्डिक्ट जो मानक इफेक्टिव-ट्रायल एस्टिमेटर की पूरी रेंज में स्थिर है — जो किसी एक पर भरोसा करने से कहीं ज़्यादा मज़बूत सबूत है।

सबसे भोंडे एस्टिमेटर पर एक तकनीकी चेतावनी, क्योंकि यह बताती है कि यह नरम छोर पर क्यों बैठता है: N/(1+(N1)ρˉ)N/(1+(N-1)\bar\rho) असल में correlated वेरिएबल्स के मीन के लिए वेरिएंस-रिडक्शन फैक्टर है (करेलेशन ρˉ\bar\rho के तहत एवरेजिंग आपको कितना फायदा देती है)। DSR का बेंचमार्क एक एक्सट्रीम-वैल्यू क्वांटिटी है — ट्रायल्स का एक्सपेक्टेड मैक्सिमम — इसलिए इसकी ट्रायल गिनती के रूप में एक मीन-वेरिएंस श्रिंकेज इस्तेमाल करना एक फंक्शनल मिसमैच है: दिशा में सही (correlated ⇒ कम इफेक्टिव ट्रायल), लेकिन वह क्वांटिटी नहीं जिस पर मैक्सिमम की डिस्ट्रीब्यूशन वाकई निर्भर करती है। यही ठीक वजह है कि रेंज के बीच वाले eigenvalue-आधारित एस्टिमेटर ज़्यादा भरोसेमंद रीडिंग हैं, और यही वजह है कि रेंज, न कि कोई एक बिंदु, असली डिलिवरेबल है।

सबक: दोनों टूल इस्तेमाल करें, और DSR को सही N दें

Two complementary instruments aimed at the same search winner from different angles: one labeled with the question is the winner special within this search, needing an effective trial count dial, the other labeled does the best beat cash after data-snooping, driven by a bootstrap that reads the correlation straight off the data

केस B से दो बातें निकलती हैं, और दोनों अहम हैं:

  1. जब ट्रायल correlated हों, तो रॉ ग्रिड साइज़ DSR के लिए गलत N है — और कोई एक इफेक्टिव-N भी सही नहीं है। 640 को एक ऐसे फॉर्मूले में डालना जो स्वतंत्रता मानता है, ओवर-डिफ्लेट करता है: यह एक ऐसी नॉइज़ सीलिंग बनाता है जो सर्च ने असल में जितनी हासिल की थी उससे कहीं ऊंची है, और उसके नीचे असली एज दबा देता है। DSR को इफेक्टिव ट्रायल गिनती चाहिए — लेकिन फिक्स यह नहीं है कि किसी एक एस्टिमेटर पर भरोसा किया जाए (सबसे कम भोंडे वाले पर भी नहीं, जहां करेक्शन Neff=2N_{\text{eff}} = 2 के पास बंद हो जाता है)। फिक्स है मानक एस्टिमेटर की पूरी रेंज (यहां 1.6 से 370) में वर्डिक्ट पढ़ना और देखना कि क्या यह स्थिर है। इस एज के लिए यह स्थिर था: हर जगह बरकरार जहां डिफ्लेशन वाकई सक्रिय है (एक असली 1.85-2.00 वार्षिक बार Neff=16N_{\text{eff}} = 16-2121 पर), और सिर्फ उस एस्टिमेटर के तहत फेल जो ओवर-काउंट करता है। पूरी रेंज में स्थिर वर्डिक्ट किसी एक नंबर से कहीं ज़्यादा मज़बूत है।
  2. DSR को एक Reality Check के साथ जोड़ें। ध्यान दीजिए कि Reality Check और इसका SPA-type (studentized) चचेरा भाई केस B को बिना किसी ट्रायल-काउंट सर्जरी के सही निकालते हैं (p = 0.0024 और 0.0038) — ये डिपेंडेंसी को नैटिवली, stationary bootstrap के ज़रिए हैंडल करते हैं, क्योंकि ये असली correlated रिटर्न स्ट्रीम को रीसैंपल करते हैं, न कि काल्पनिक स्वतंत्र दांव गिनते हैं। यही पूरी इफेक्टिव-N गड़बड़ी का टाई-ब्रेकर है: RC को किसी NN की ज़रूरत नहीं। DSR और RC अलग-अलग सवालों के जवाब देते हैं: DSR पूछता है "क्या विजेता इस सर्च के भीतर खास है?" (और इसे यह जानना होता है कि सर्च ने कितनी इफेक्टिव नज़रें डालीं); RC/SPA-type पूछते हैं "क्या बेस्ट रूल डेटा-स्नूपिंग के बाद कैश को हराता है?" (और डेटा से खुद डिपेंडेंसी पढ़ते हैं)। आपको दोनों चाहिए। जब ये असहमत हों — जैसे यहां रॉ-काउंट DSR और RC थे — तो वह असहमति डायग्नोस्टिक है: इसका आमतौर पर मतलब है कि आपका NN गलत है।

यह वही स्ट्रक्चरल चेतावनी है जो हमारी speed-ladder और IPC-tax स्टडी इंजीनियरिंग साइड से बार-बार दे रही थीं — एक तेज़ सर्च जो एक विशाल correlated ग्रिड चलाती है, वह आपको बड़ी संख्या में स्वतंत्र दांव नहीं दिला रही, और ग्रिड साइज़ को ट्रायल काउंट मान लेना आपके ऑप्टिमाइज़र और सिग्निफिकेंस टेस्ट, दोनों को धोखा देता है। probability of backtest overfitting पर आने वाला साथी लेख उसी सिलेक्शन बायस पर रीसैंपलिंग साइड से (CSCV) हमला करता है, और यहां की हर बात के साथ स्वाभाविक रूप से जुड़ता है: DSR विजेता की कीमत लगाता है, PBO प्रोसीजर की कीमत लगाता है।

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

तीन चेतावनियां, सीधे शब्दों में, क्योंकि नियंत्रित स्टडी का पूरा मकसद इसे ज़्यादा न बेचना है।

  • रिटर्न सिंथेटिक हैं। कैलिब्रेशन और पावर एक्सपेरिमेंट के लिए iid नॉर्मल, असली-एज केस के लिए एक रेजीम-स्विचिंग प्रोसेस — जो नियंत्रित ग्राउंड ट्रुथ के लिए चुने गए, मार्केट रियलिज़्म के लिए नहीं। असली रिटर्न फैट-टेल्ड, ऑटोकरेलेटेड, और नॉन-स्टेशनरी होते हैं, और PSR के स्क्यू/कर्टोसिस टर्म ठीक इनमें से पहले को हैंडल करने के लिए मौजूद हैं। यहां डिलिवरेबल कैलिब्रेटेड मेथड है, कोई स्ट्रैटेजी नहीं: हम किसी टेस्ट के फॉल्स डिस्कवरी को नियंत्रित करने का प्रूफ सिर्फ उसे ऐसे डेटा पर चलाकर दे सकते हैं जहां हमें पता हो कि खोजने को कुछ नहीं है। इसके लिए ग्राउंड ट्रुथ गढ़नी पड़ती है।
  • कोई इफेक्टिव-N एस्टिमेटर कैननिकल नहीं है — इसीलिए हमने पांच रिपोर्ट किए। औसत-करेलेशन वाला वन-लाइनर Neff=N/(1+(N1)ρˉ)N_{\text{eff}} = N/(1 + (N-1)\bar\rho) रिव्यूअर के लिए समझने लायक और दिशा में सही है (ज़्यादा करेलेशन ⇒ कम इफेक्टिव ट्रायल), लेकिन यह एक मीन के लिए वेरिएंस-रिडक्शन फैक्टर है — DSR के मैक्सिमम बेंचमार्क से फंक्शनल मिसमैच — और Neff<2N_{\text{eff}} < 2 के पास यह डिफ्लेशन को पूरी तरह बंद कर देता है। Eigenvalue एस्टिमेटर (पार्टिसिपेशन रेशियो, PCA-95%, Kaiser) बेहतर मेल खाते हैं लेकिन फिर भी हेयुरिस्टिक हैं, और Cheverud-Nyholt equicorrelation के तहत ओवर-काउंट करता है। ज़्यादा पूरा, सिद्धांतवादी तरीका ट्रायल क्लस्टरिंग है (Bailey & López de Prado के DSR Appendix 3): ट्रायल को करेलेशन स्ट्रक्चर से ग्रुप करें और सब कुछ एक स्केलर में समेटने के बजाय क्लस्टर गिनें। हम पूरी रेंज इसलिए रिपोर्ट करते हैं क्योंकि यह चुनाव तय नहीं है — पांचों एस्टिमेटर में स्थिर वर्डिक्ट ही ईमानदार दावा है; एक ऐसा वर्डिक्ट जो किसी एक एस्टिमेटर चुनने पर निर्भर हो, वह नहीं होगा।
  • Bootstrap एक studentized Reality Check है, पूरा Hansen SPA नहीं, और रीसैंपल गिनतियां एक्सपेरिमेंट के हिसाब से अलग हैं। जहां भी यह लेख "SPA-type" कहता है, इसका मतलब White का Reality Check है जिसमें हर-रूल स्टूडेंटाइज़ेशन शामिल है; Hansen का पूरा कंसिस्टेंट, सैंपल-डिपेंडेंट रीसेंटरिंग लागू नहीं किया गया है। कैलिब्रेशन वाली फॉल्स-डिस्कवरी रेट 400 सर्च में हर सर्च के लिए 500 stationary-bootstrap रीसैंपल इस्तेमाल करती हैं; दोनों केस-स्टडी वाले RC/SPA-type p-value हर एक के लिए 5,000 रीसैंपल इस्तेमाल करते हैं। पूरे समय औसत ब्लॉक लेंथ 20 (Politis-Romano), α=0.05\alpha = 0.05, एनुअलाइज़ेशन के लिए 252 पीरियड्स/साल। इन्हें बदलिए और तीसरे-दशमलव वाले नंबर हिलेंगे; कहानी — नैव 1.000 बनाम सिद्धांतवादी 0.001-0.057, एक S-कर्व जो नॉइज़ सीलिंग से थोड़ा ऊपर 50% पावर तक पहुंचती है, और एक correlated-grid जाल जिसका वर्डिक्ट इफेक्टिव-N रेंज में पढ़ना पड़ता है — नहीं बदलेगी।

मुख्य बातें

  1. पैरामीटर सर्च एक मल्टीपल-टेस्टिंग मशीन है, और नैव सिग्निफिकेंस टेस्ट इसके प्रति अंधा है। 1,000 ज़ीरो-एज स्ट्रैटेजी पर बेस्ट एनुअलाइज्ड शार्प औसतन 1.63 आता है, सिंगल-टेस्ट p-value का मीडियन 0.000686 है — और "क्या यह सिग्निफिकेंट है?" वाला टेस्ट 100% बार डिस्कवरी घोषित करता है (फॉल्स-डिस्कवरी रेट 1.000)। कुछ भी नहीं से आया एक शानदार शार्प, एक ऐसे टेस्ट से सर्टिफाइड जो कभी सही सवाल पूछ ही नहीं रहा था।
  2. डिफ्लेटेड शार्प रेशियो गोलपोस्ट को शून्य से नॉइज़ सीलिंग पर ले जाता है। DSR विजेता की तुलना शून्य से नहीं बल्कि SR0SR_0 से करता है, यानी इस साइज़ की सर्च का एक्सपेक्टेड बेस्ट-बाय-लक — जो null केस के लिए एनुअलाइज्ड 1.63 पर उतरता है, ठीक वहीं जहां औसत नॉइज़ विजेता बैठता है (व्युत्पन्न: 0.1030×2520.1030 \times \sqrt{252})। इसकी null फॉल्स-डिस्कवरी रेट 0.001 है; Harvey-Liu हेयरकट (Bonferroni/Holm 0.057, BHY 0.007) और White का Reality Check (0.022) दूसरे रास्तों से वही नियंत्रण हासिल करते हैं।
  3. यह असली एज बचाकर रखता है। DSR की डिटेक्शन पावर एक S-कर्व बनाती है जो लगभग 1.73 के एनुअलाइज्ड शार्प पर 50% पावर तक पहुंचती है — 1.63 की नॉइज़ सीलिंग से ठीक ऊपर: 0.79 के असली एनुअलाइज्ड शार्प पर 0.005, 1.90 पर 0.651, 2.54 पर 0.998, 3.17 पर 1.000, पूरे समय फॉल्स पॉज़िटिव ~0। सीलिंग से नीचे के एज सही तरीके से किस्मत जैसे मान लिए जाते हैं; इससे ऊपर के एज लगभग एक की पावर के साथ बरकरार रहते हैं।
  4. Correlated ग्रिड रॉ DSR को तोड़ देते हैं — और कोई एक इफेक्टिव-N इसे नहीं बचाता; रेंज बचाती है। एक 640-सेल MA क्रॉसओवर पर (औसत पेयरवाइज़ करेलेशन ~0.61), रॉ-काउंट DSR ने एक असली (इन-सैंपल चुना हुआ, वार्षिक 3.92) एज को फॉल्सली रिजेक्ट किया (0.748 < 0.95) क्योंकि 640 correlated ट्रायल 640 स्वतंत्र दांव नहीं हैं। लेकिन फिक्स कोई एक जादुई NeffN_{\text{eff}} नहीं है — सबसे भोंडे अनुमान पर (Neff1.6N_{\text{eff}} \approx 1.6) डिफ्लेशन लगभग बंद हो जाता है (बार ~वार्षिक 0.25) और DSR सिर्फ रॉ सिग्निफिकेंस को दोहराता है। असली सबूत यह है कि एज मानक एस्टिमेटर की पूरी रेंज में बरकरार रहता है — Neff=N_{\text{eff}} = 1.6/2.4/16/21 पर DSR 1.000/1.000/1.000/0.999, जिसमें डिफेंसिबल PCA-95%/Kaiser मिड-रेंज पर एक असली 1.85-2.00 का वार्षिक बार शामिल है — 145 से नीचे किसी भी NeffN_{\text{eff}} के लिए बचा रहता है, और सिर्फ Cheverud-Nyholt की ओवर-काउंटिंग 370 के तहत फेल होता है। रैंडम वॉक हर एस्टिमेटर पर खारिज होता है। रेंज पढ़ें, कोई एक बिंदु नहीं।
  5. DSR को एक Reality Check के साथ जोड़ें, क्योंकि ये अलग-अलग सवालों के जवाब देते हैं। Reality Check और इसका SPA-type (studentized) चचेरा भाई असली एज की पुष्टि करते हैं (p = 0.0024 और 0.0038) बिना किसी ट्रायल-काउंट सर्जरी के — ये डिपेंडेंसी को stationary bootstrap के ज़रिए नैटिवली हैंडल करते हैं, जो ठीक वह टाई-ब्रेकर है जब इफेक्टिव-N पर विवाद हो। DSR पूछता है "क्या विजेता इस सर्च के भीतर खास है?"; RC/SPA-type पूछते हैं "क्या बेस्ट डेटा-स्नूपिंग के बाद कैश को हराता है?" इनके बीच असहमति एक संकेत है कि आपका NN गलत है। दोनों चलाएं।

किसी सर्च का विजेता तब तक दोषी है जब तक बेगुनाही साबित न हो जाए। नैव p-value बेगुनाही का सबूत नहीं है — यह सर्च की खुद की बढ़ा-चढ़ा गवाही है, और यह शुद्ध नॉइज़ की गवाही बारह ज़ीरो के कॉन्फिडेंस के साथ देगा। बेंचमार्क को उस तक डिफ्लेट करें जो किस्मत देती है, अपने इफेक्टिव ट्रायल ईमानदारी से गिनें, और दूसरी राय के लिए मैक्सिमम को bootstrap करें। जो तीनों बार पार कर ले, वह शायद वाकई असली हो। जो सिर्फ नैव वाले को पार करे, वह हज़ार सिक्का-उछालने वालों में सबसे लंबा है।

पूरा एक्सपेरिमेंट — null-कैलिब्रेशन हार्नेस, प्लांटेड-एज पावर स्वीप, correlated-grid सर्च, और इस लेख का हर नंबर, जो एक डिटरमिनिस्टिक स्क्रिप्ट से दोबारा जेनरेट किया जा सकता है — साथी पेपर में है deflated-sharpe.marketmaker.cc पर, कोड और डेटा के साथ github.com/suenot/deflated-sharpe-search पर।

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 ट्रेडिंग इनसाइट्स, मार्केट एनालिसिस और प्लेटफ़ॉर्म अपडेट के लिए हमारे न्यूज़लेटर को सब्सक्राइब करें।

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