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.
Articles
फिडेलिटी गेट: कोर्स-टू-फाइन बैकटेस्टिंग आपको और तेज़ी से बेवकूफ बनाती है, जब तक कि सस्ता प्रॉक्सी वैसे ही रैंक न करे जैसे महंगा वाला करता है
ड्रिल-डाउन / मल्टी-फिडेलिटी सर्च (ASHA, successive halving, Hyperband) हज़ारों कॉन्फ़िग्स को सस्ते में स्क्रीन करती है और केवल बचे हुए (survivors) को महंगे फुल इवैल्यूएशन के लिए आगे बढ़ाती है। यह एक असली स्पीडअप है — लेकिन अगर लो-फिडेलिटी रैंकिंग हाई-फिडेलिटी रैंकिंग से असहमत हो, तो यह चुपचाप ध्वस्त हो जाती है। हमने फोल्ड-रैंक कोरिलेशन को मापा: एक फोल्ड पर Spearman ρ 0.03 तक हो सकता है (लगभग रैंडम रैंकिंग), और जैसे-जैसे फोल्ड्स बढ़ते हैं यह 0.43, 0.67, 0.78, 0.91 तक चढ़ता जाता है। इसका समाधान एक अनिवार्य गेट है — पहले ρ(cheap, full) मापें, और न्यूनतम फिडेलिटी को ऑटोमैटिक रूप से उस पहले रंग (rung) तक बढ़ा दें जहाँ ρ ≥ 0.5 हो।
रैंडम बनाम स्मार्ट सर्च: क्रॉसओवर इवैल कॉस्ट से तय होता है, एल्गोरिदम से नहीं
जब एक बैकटेस्ट सस्ता होता है, तो डम्ब स्क्रैम्बल्ड Sobol रॉ थ्रूपुट पर जीत जाता है — स्मार्ट सैंपलर (TPE, CMA-ES, ASHA) एक Python ask/tell टैक्स चुकाते हैं जो उन्हें 20x धीमा कर देता है, इसलिए बराबर वॉल-क्लॉक में वे बहुत कम पॉइंट्स इवैल्यूएट करते हैं और हार जाते हैं। हर eval को महंगा बनाइए (multi-TF + walk-forward folds) और क्रॉसओवर पलट जाता है। हमने दोनों रीजीम मापे, और क्यों fold-rank fidelity (ρ@1 का 0.03→0.43 तक बढ़ना) pruning के फायदेमंद होने की पूर्वशर्त है।
दो-अक्षीय पैरामीटर स्पेस: आपके स्वीप का ज्यादातर हिस्सा लगभग मुफ्त क्यों होना चाहिए
सभी पैरामीटर खोजने में एक जैसे महंगे नहीं होते। स्ट्रैटेजी के पैरामीटर दो अक्षों में बंट जाते हैं: महंगा अक्ष (इंडिकेटर — पूरी सीरीज पर दोबारा गणना) और सस्ता अक्ष (डिसीजन थ्रेशोल्ड — पहले से गणना किए गए सिग्नलों पर एक O(n) पास)। चूंकि इंडिकेटर थ्रेशोल्ड से अपरिवर्तित रहते हैं, आप उन्हें एक बार गणना करके हजारों थ्रेशोल्ड कॉन्फिग ~5,600 cfg/s की रफ्तार से स्वीप कर सकते हैं — हर कॉन्फिग पर दोबारा गणना करने से करीब 1,600 गुना सस्ता। यह डाइमेंशनैलिटी के अभिशाप की कीमत का पुनर्मूल्यांकन है।
फ्रेमवर्क टैक्स: जब आपकी बैकटेस्ट लाइब्रेरी एक भोले pandas लूप से भी धीमी होती है
हमने आठ बैकटेस्ट इंजनों को एक ही समान पैरामीटर स्वीप पर बेंचमार्क किया — 150k बार, 80 HMA-क्रॉस संयोजन, ट्रेड-गिनती की पैरिटी 2707 पर लॉक। दो सबसे लोकप्रिय इवेंट-ड्रिवन फ्रेमवर्क हाथ से लिखे pandas लूप से भी धीमे निकले, जबकि एक वेक्टराइज़्ड/कंपाइल्ड इंजन ने वही काम लगभग 13,000× तेज़ी से चलाया। उस प्रति-बार ओवरहेड का अध्ययन जिसे लोकप्रिय लाइब्रेरियाँ कभी अमॉर्टाइज़ करने के लिए बनी ही नहीं थीं।
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.
IPC टैक्स: बैकटेस्ट इंजन को सॉकेट के पीछे रखें और 13% गंवाएं — जिसमें से लगभग कुछ भी सॉकेट की वजह से नहीं
हमने एक numba बैकटेस्ट कर्नेल को लाइन-दर-लाइन Rust में पोर्ट किया और उसे एक प्रोसेस बाउंड्री के पार चार तरीकों से कॉल किया, एक इक्विवैलेंस गेट के साथ जो अंतिम ट्रेड तक समान PnL की पुष्टि करता है। पूरी 1.2 MB प्राइस सीरीज़ को Unix सॉकेट के जरिए भेजने में ~2 ms लगते हैं — जॉब का लगभग 0.1%। उसी पेलोड को JSON-एनकोड करने में रॉ बाइट्स से 1348 गुना ज्यादा लागत आती है, प्रति-कॉम्बो chatty कॉल्स डेटा को 80 बार दोबारा भेजते हैं, और प्रति-बार कॉल पैटर्न 2.0 सेकंड के जॉब पर 2.1 सेकंड शुद्ध IPC खर्च करेगा। बाउंड्री सस्ती है; टैक्स इस बात में है कि आप उसे कैसे पार करते हैं।
डिफ्लेटेड शार्प रेशियो: मल्टीपल टेस्टिंग के बाद आपके बैकटेस्ट के कितने 'विजेता' असली बचते हैं?
पैरामीटर सर्च किस्मत बनाने की एक मशीन है। शुद्ध नॉइज़ पर — 1,000 स्ट्रैटेजी जिनका असली एज शून्य है — सबसे अच्छा वार्षिक शार्प औसतन 1.63 आता है और नैव सिग्निफिकेंस टेस्ट 100% बार इसे डिस्कवरी घोषित करता है। हम नियंत्रित ग्राउंड ट्रुथ बनाते हैं और दिखाते हैं कि डिफ्लेटेड शार्प रेशियो, Harvey-Liu हेयरकट, और White का Reality Check ईमानदारी बहाल करते हैं: फॉल्स डिस्कवरी 1.000 से घटकर 0.001-0.057 रह जाती है, नॉइज़ सीलिंग से ऊपर के असली एज पावर ~1 के साथ बचे रहते हैं — और एक असली जाल (correlated grids) जहां रॉ DSR ओवर-डिफ्लेट कर देता है और वर्डिक्ट को एक अकेले नंबर से नहीं बल्कि इफेक्टिव-ट्रायल एस्टिमेट्स की पूरी रेंज में पढ़ना पड़ता है।
ऑब्जेक्टिव-फंक्शन डिज़ाइन: जिस मेट्रिक को आप ऑप्टिमाइज़ करते हैं वही गुप्त रूप से आपकी रणनीति चुन लेती है
'सर्वश्रेष्ठ' रणनीति खोजने के लिए पहले 'सर्वश्रेष्ठ' को परिभाषित करना ज़रूरी है — और वह स्केलर चुपचाप विजेता चुन लेता है। ज्ञात एज वाले सिंथेटिक डेटा पर (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) के बराबर पहुँचते हैं — कभी उससे आगे नहीं। गुडहार्ट का नियम, एक बैकटेस्ट में, नियंत्रित ग्राउंड ट्रुथ के साथ।
Look-Ahead Bias: कैसे एक-बार की गलती शुद्ध शोर से 15 का Sharpe गढ़ देती है
बैकटेस्ट को चुपचाप फुला देने वाले सूक्ष्म look-ahead leaks का एक नियंत्रित अध्ययन। बिना किसी वास्तविक edge के, एक same-bar फिल शुद्ध शोर से +14.8 का वार्षिक Sharpe गढ़ देता है; एक-बार आगे झांकता इंडिकेटर, +4.8। वर्गीकरण, मापी गई मात्राएं, और आपकी जेब से पैसा जाने से पहले हर leak को कैसे पकड़ें।
बैकटेस्ट स्पीड लैडर: लैपटॉप CPU पर 298x, आखिरी ट्रेड तक समान PnL
एक ही 80-कॉम्बो पैरामीटर स्वीप के पांच इम्प्लीमेंटेशन, सभी identical PnL देने के लिए वेरिफाई किए गए: pandas rolling.apply में 69.9 सेकंड लगते हैं, numpy में 3.1, numba में 2.0, parallel numba में 0.23 — Apple M2 Max पर बिना किसी हार्डवेयर बदलाव के मापा गया 298x स्पीडअप, और एक सक्षम vectorized बेसलाइन के मुकाबले भी अब भी ~13x। हर पायदान क्या देता है, GPU गायब कड़ी क्यों नहीं है, और मास पैरामीटर सर्च में असली बॉटलनेक कहां है।
researcher: A Searchable Quant-Research Archive for Humans and AI Agents
How we built researcher.marketmaker.cc — a unified, full-text-searchable archive of quant research (arXiv papers, GitHub repos, quant blogs, TradingView Pine scripts) that humans browse and AI agents query over MCP.
algo-investor-skills: Claude Code स्किल्स जो एक स्कैम-प्रूफ निवेशक प्रस्ताव बनाती हैं
algo-investor-skills पर एक गहरी नज़र — Claude Code स्किल्स का एक सेट जो किसी एल्गोट्रेडिंग रणनीति को कच्चे मापे गए तथ्यों से एक ऑडिटेड, ईमानदारी-केंद्रित निवेशक प्रस्ताव तक ले जाता है। छह संयोजनीय स्किल्स, एक फाइनेंशियल-मॉडल्स इंजन, एक स्वतंत्र-सत्यापन प्रूफ पैक, और एक अनिवार्य संशयी-निवेशक ऑडिट गेट जो कभी कोई आंकड़ा गढ़ता नहीं।