Backtesting Without Fooling Yourself
A step-by-step path from what your backtest really optimizes to proving an edge survives overfitting, multiple testing, and live execution. Read top to bottom - each part builds on the last.
ऑब्जेक्टिव-फंक्शन डिज़ाइन: जिस मेट्रिक को आप ऑप्टिमाइज़ करते हैं वही गुप्त रूप से आपकी रणनीति चुन लेती है
'सर्वश्रेष्ठ' रणनीति खोजने के लिए पहले 'सर्वश्रेष्ठ' को परिभाषित करना ज़रूरी है - और वह स्केलर चुपचाप विजेता चुन लेता है। ज्ञात एज वाले सिंथेटिक डेटा पर (600 सीड्स, T=2000, 80 थ्रेशोल्ड), एक भोला-भाला per-trade Sharpe एक लॉटरी को ताज पहनाता है: यह 56% सीड्स में 5% से कम एक्सपोज़र वाला विजेता चुनता है और 57% में डिजेनरेट हो जाता है - सबसे स्पष्ट सीड पर, 8 ट्रेड्स एक ऐसा in-sample Sharpe 21.09 दिखाते हैं जो out of sample गिरकर 0.13 रह जाता है। ईमानदार समाधान लगभग नीरस है: पूरी टाइमलाइन पर मापें, जो कभी डिजेनरेट नहीं होती (out-of-sample 1.71)। एक trade-count (conf_k) श्रिंकेज और एक एक्सपोज़र फ्लोर per-trade मेट्रिक को सुधार सकते हैं, लेकिन पूरी तरह सुधारे जाने पर भी वे केवल full-timeline Sharpe (1.70 बनाम 1.71) के बराबर पहुँचते हैं - कभी उससे आगे नहीं। गुडहार्ट का नियम, एक बैकटेस्ट में, नियंत्रित ग्राउंड ट्रुथ के साथ।
मल्टी-Timeframe Backtests में No Look-Ahead साबित करना: भविष्य को Perturb करें, साबित करें कि अतीत उसे देख नहीं सकता
मल्टी-timeframe backtests एक बनते हुए higher-timeframe bar के जरिए भविष्य लीक करते हैं, जिसका final close अभी अस्तित्व में ही नहीं है। सिर्फ code review करके भरोसा नहीं जीता जा सकता - इसे टेस्ट करना ही पड़ता है। हम live bot के closed-bar rule को बिल्कुल वैसा ही reproduce करते हैं, फिर shifted-future probe से साबित करते हैं कि कोई leakage नहीं है: भविष्य के हर bar को perturb करें और assert करें कि अतीत का हर signal और trade bitwise अपरिवर्तित रहता है। 25/25 parity checks, और probe में असली पकड़ (teeth) है।
Look-Ahead Bias: कैसे एक-बार की गलती शुद्ध शोर से 15 का Sharpe गढ़ देती है
बैकटेस्ट को चुपचाप फुला देने वाले सूक्ष्म look-ahead leaks का एक नियंत्रित अध्ययन। बिना किसी वास्तविक edge के, एक same-bar फिल शुद्ध शोर से +14.8 का वार्षिक Sharpe गढ़ देता है; एक-बार आगे झांकता इंडिकेटर, +4.8। वर्गीकरण, मापी गई मात्राएं, और आपकी जेब से पैसा जाने से पहले हर leak को कैसे पकड़ें।
प्लेटो विश्लेषण: एक मजबूत ऑप्टिमम को ओवरफिटिंग से कैसे अलग करें
सबसे अच्छे स्ट्रैटेजी पैरामीटर खोजना काम का केवल आधा हिस्सा क्यों है। एक स्थिर प्लेटो को नाजुक पीक से दृश्य और मात्रात्मक रूप से कैसे अलग करें, और ऑप्टिमाइज़्ड स्ट्रैटेजी को प्रोडक्शन में लॉन्च करने से पहले Optuna कॉन्टूर प्लॉट्स एक अनिवार्य कदम क्यों हैं।
मल्टी-सिंबल वैलिडेशन: अपनी स्ट्रैटेजी को सभी पेयर्स पर टेस्ट करें
ETHUSDT पर ऑप्टिमाइज़ की गई स्ट्रैटेजी ऑल्टकॉइन्स पर क्यों फेल हो सकती है। पेयर ग्रुप्स (ब्लू चिप्स, लार्ज कैप्स, शिटकॉइन्स) पर सही तरीके से टेस्ट कैसे करें और किस क्रॉस-सिंबल रोबस्टनेस स्कोर को पर्याप्त माना जाए।
मॉन्टे कार्लो बूटस्ट्रैप: सिर्फ 10 लाइनों के कोड में बैकटेस्ट के लिए कॉन्फिडेंस इंटरवल कैसे पाएं
बैकटेस्ट से मिला एक-अंक अनुमान (single-point estimate) एक खतरनाक भ्रम क्यों है। कैसे मॉन्टे कार्लो बूटस्ट्रैप महज 2 सेकंड की गणना में PnL और MaxDD के लिए 95% कॉन्फिडेंस इंटरवल देता है, और यह किसी स्ट्रैटेजी को प्रोडक्शन में लॉन्च करने से पहले एक अनिवार्य कदम क्यों है।
The Probability of Backtest Overfitting: Did Your Search Beat a Coin Flip?
The Deflated Sharpe Ratio prices the winning strategy; PBO prices the search that picked it. Combinatorially Symmetric Cross-Validation runs C(16,8) = 12,870 train/test splits over a 1000x200 performance matrix and asks: does the in-sample winner land in the bottom half out of sample? The catch almost everyone misses - PBO's null is 0.5, not 1. On 200 zero-edge strategies the best in-sample annualized Sharpe of 1.98 collapses to 0.06 out of sample and PBO = 0.476: a coin flip, fully overfit. Plant a real edge (annualized Sharpe 2.38) and PBO drops to 0.001, the in-sample 3.73 surviving to an out-of-sample 2.34. A moving-average grid on a pure random walk has no out-of-sample skill either - PBO 0.463 averaged over 60 matrices, statistically indistinguishable from the null - and on one representative matrix the mirage is vivid: a best in-sample Sharpe of 2.33 collapses to a median out-of-sample -0.22, PBO 0.573, a 63% chance of a loss.
डिफ्लेटेड शार्प रेशियो: मल्टीपल टेस्टिंग के बाद आपके बैकटेस्ट के कितने 'विजेता' असली बचते हैं?
पैरामीटर सर्च किस्मत बनाने की एक मशीन है। शुद्ध नॉइज़ पर - 1,000 स्ट्रैटेजी जिनका असली एज शून्य है - सबसे अच्छा वार्षिक शार्प औसतन 1.63 आता है और नैव सिग्निफिकेंस टेस्ट 100% बार इसे डिस्कवरी घोषित करता है। हम नियंत्रित ग्राउंड ट्रुथ बनाते हैं और दिखाते हैं कि डिफ्लेटेड शार्प रेशियो, Harvey-Liu हेयरकट, और White का Reality Check ईमानदारी बहाल करते हैं: फॉल्स डिस्कवरी 1.000 से घटकर 0.001-0.057 रह जाती है, नॉइज़ सीलिंग से ऊपर के असली एज पावर ~1 के साथ बचे रहते हैं - और एक असली जाल (correlated grids) जहां रॉ DSR ओवर-डिफ्लेट कर देता है और वर्डिक्ट को एक अकेले नंबर से नहीं बल्कि इफेक्टिव-ट्रायल एस्टिमेट्स की पूरी रेंज में पढ़ना पड़ता है।
बैकटेस्ट-लाइव समानता: आपका बॉट बैकटेस्ट से अलग तरीके से ट्रेड क्यों करता है
बैकटेस्टिंग और लाइव ट्रेडिंग के बीच के अंतरों का पूर्ण वर्गीकरण: स्लिपेज और आंशिक फिल से लेकर कोडबेस डीसिंक्रोनाइज़ेशन तक। समानता प्राप्त करने के लिए आर्किटेक्चरल पैटर्न, एक साझा कोर मॉड्यूल के Python उदाहरण, और प्रोडक्शन मॉनिटरिंग के लिए एक चेकलिस्ट।
ईमानदार नकारात्मक परिणाम: हजारों बैकटेस्ट, पांच मेजर, कोई मजबूत एज नहीं
सर्च-एंड-ओवरफिट कथानक का चरम बिंदु, और यह एक नकारात्मक परिणाम पर खत्म होता है - जो सही है। ETHUSDT पर एक सिंगल-सिंबल ड्यूल-टाइमफ्रेम सर्च ने एक ऐसा कॉन्फ़िग खोजा जो out-of-sample पर +16.35% और एक अछूते holdout पर +2.62% देता था; Deflated Sharpe Ratio ने, ~37,000 ट्रायल को ध्यान में रखते हुए, इसे घटाकर 0.00 कर दिया। पांच मेजर (ETH/BTC/SOL/BNB/XRP, प्रत्येक ~1.18M 1m बार) पर एक क्रॉस-इंस्ट्रूमेंट पास, median out-of-sample के आधार पर चयन करते हुए, इसे हमेशा के लिए खत्म कर देता है: dual DSR 0.24 / PBO 0.264, triple DSR 0.14 / PBO 0.327 - दोनों गेट फेल हो जाते हैं। चैंपियन 5 में से 1 सिंबल पर लाभदायक है और बाकी पर नकारात्मक। एंटी-ओवरफिट तंत्र इसी के लिए है: आपको शोर के सबसे अच्छे हिस्से को अल्फा के रूप में शिप करने से रोकने के लिए।
कैस्केड रणनीतियाँ: फॉलबैक फिलिंग के साथ प्राथमिकता निष्पादन
'बैकटेस्ट्स विदाउट इल्यूजन्स' सीरीज़ का समापन। N रणनीतियों x M पेयर्स से एक ऑर्केस्ट्रेटर कैसे बनाएं, प्राथमिकता और फॉलबैक निष्पादन के साथ कैस्केड मोड कैसे लागू करें, dual_size कैसे चुनें, और स्ट्रैटेजी पोर्टफोलियो को केवल PnL जोड़कर बैकटेस्ट क्यों नहीं किया जा सकता।