The Other Way a Regression Lies: Endogeneity, 2SLS, and the Gamma Calibration Problem
रिग्रेशन आपके साथ संरचनात्मक रूप से दो अलग तरीकों से झूठ बोल सकता है, और इस ब्लॉग ने अब तक उनमें से केवल एक पर हमला किया है।
पहला तरीका सर्च में चयन-पक्षपात है: आपने दस हजार बैकटेस्ट चलाए, सबसे अच्छा परिणाम रखा, और जिस संख्या को देख रहे हैं वह प्रभाव के बजाय शोर-वितरण का अधिकतम है। यही डिफ्लेटेड शार्प अनुपात और उसके निष्कर्ष ईमानदार नकारात्मक परिणाम का विषय है। इसका समाधान सर्च की कीमत तय करना है।
दूसरा तरीका स्वयं गुणांक में पक्षपात है, ऐसे एकल रिग्रेशन में जिसे आपने बिल्कुल खोजा ही नहीं। यदि रिग्रेसर त्रुटि पद से सहसंबद्ध है, तो OLS पक्षपाती और असंगत होता है — और सैंपलिंग शोर के विपरीत, यह सैंपल आकार के साथ कम नहीं होता। अधिक डेटा गलत संख्या को और अधिक कसकर स्थापित करता है। बूटस्ट्रैपिंग, वॉक-फॉरवर्ड या डिफ्लेशन की कोई मात्रा इसे नहीं छूती, क्योंकि इनमें से कोई भी पहचान पर सवाल नहीं उठाता, केवल चयन पर उठाता है।
यह लेख दूसरी विफलता के बारे में है, और यह यहां कोई अमूर्त चिंता नहीं है। Almgren-Chriss कैलिब्रेशन लेख स्थायी प्रभाव का अनुमान नेट टेकर फ्लो पर 5-मिनट के मिड-प्राइस बदलावों का रिग्रेशन करके लगाता है, कुछ प्रतिशत का और दिनों के बीच 2-5x बदलने वाला गुणांक पाता है, और एंडोजेनेटी को पहला संरचनात्मक कारण बताता है: "फ्लो कीमत पर उतना ही प्रतिक्रिया करता है जितनी कीमत फ्लो पर। मोमेंटम ट्रेडर इसलिए खरीदते हैं क्योंकि कीमत बढ़ी; फ्लो पर रिटर्न का भोला OLS उनकी प्रतिक्रिया को पकड़कर उसे प्रभाव मान लेता है।" लेख साफ समाधान भी बताता है — आपके अपने फिल, जो निर्माण से ही एक्सोजेनस हैं।
यह एक नामित इंस्ट्रूमेंट वाली इंस्ट्रूमेंटल-वैरीएबल समस्या है, और डेटा पहले से हमारे पास है। नीचे एस्टीमेटर, डायग्नोस्टिक्स और प्रयोग दिए गए हैं।
एक पैराग्राफ में एंडोजेनेटी

OLS कारणात्मक का अनुमान में केवल के अंतर्गत लगाता है। तीन चीजें इसे तोड़ती हैं। छोड़े गए चर का पक्षपात: यदि और दोनों को चलाता है और देखा नहीं गया है, तो वह त्रुटि में रहता है, , और से अनिवार्य हो जाता है — माइक्रोस्ट्रक्चर में अनदेखी सूचना का आगमन वॉल्यूम और अस्थिरता दोनों को साथ चलाता है। मापन त्रुटि: शोर वाले प्रॉक्सी के साथ, , जो हमेशा शून्य की ओर कम हो जाता है — नेट किए गए aggTrades फ्लो खंडित बाजार में वास्तविक साइन किए गए ऑर्डर फ्लो का प्रॉक्सी है, और जो हिस्सा आपको कभी दिखता ही नहीं वह मापन त्रुटि है। समकालिकता: इसे Almgren-Chriss प्रभाव कैलिब्रेशन में पहले ही अधिक तीखे और ठोस रूप में बताया गया है; नीचे की हर चीज के लिए वही प्रेरक समस्या है।
IV समाधान

एक इंस्ट्रूमेंट को दो शर्तें पूरी करनी होंगी:
- प्रासंगिकता: । यह जांचने योग्य है, और आपको इसकी जांच करनी चाहिए।
- बहिष्करण: — केवल के माध्यम से को प्रभावित करता है। यह जांचने योग्य नहीं है। कभी नहीं। यह सांख्यिकी नहीं, आर्थिक तर्क है।
एक इंस्ट्रूमेंट और एक एंडोजेनस रिग्रेसर के लिए एस्टीमेटर दो reduced-form प्रभावों का अनुपात है (वाल्ड एस्टीमेटर):
कंट्रोल और कई इंस्ट्रूमेंट होने पर 2SLS का उपयोग करें। स्टेज 1: एंडोजेनस चर का इंस्ट्रूमेंट और कंट्रोल पर रिग्रेशन चलाएं, , और फिट किए गए मान रखें — निर्माण के अनुसार उनमें केवल इंस्ट्रूमेंट-प्रेरित, एक्सोजेनस बदलाव होता है। स्टेज 2: चलाएं। मैट्रिक्स रूप में, के साथ:
वह जाल जिसमें हाथ से इसे लिखने वाला हर व्यक्ति फंसता है: अगर आप सचमुच दो lstsq कॉल चलाते हैं, तो स्टेज-2 की standard errors गलत होंगी। एक generated रिग्रेसर है, और residual variance की गणना फिट किए गए से नहीं, मूल से करनी चाहिए। भोली दो-चरणीय standard errors बहुत छोटी होती हैं, इसलिए आपके -stats बहुत बड़े होंगे और आप जरूरत से ज्यादा बार शून्य परिकल्पना को खारिज करेंगे। असली IV implementation का उपयोग करें:
from linearmodels.iv import IV2SLS
import pandas as pd
def iv_regression(df, dep_var, endog_var, instruments, controls=None):
"""2SLS with correct generated-regressor standard errors."""
y = df[dep_var]
endog = df[[endog_var]]
instr = df[instruments]
const = pd.Series(1, index=df.index, name="const")
exog = pd.concat([const, df[controls]], axis=1) if controls else const
res = IV2SLS(dependent=y, exog=exog, endog=endog,
instruments=instr).fit(cov_type="robust")
print(res.summary)
return res
प्रयोग: OLS गामा बनाम 2SLS गामा

जांच के तहत रिग्रेशन Almgren-Chriss लेख का स्थायी-प्रभाव फिट है:
ऊपर दिए गए समकालिकता तर्क के कारण एंडोजेनस है। इंस्ट्रूमेंट विंडो में आपके अपने फिल हैं: आपके maker फिल आपके अपने quoting schedule और inventory policy से ट्रिगर होते हैं, बाजार के price path से नहीं, इसलिए वे ऑर्डर-फ्लो में बदलाव का ऐसा स्रोत हैं जो संभवतः त्रुटि के momentum-reaction घटक से असहसंबद्ध है। बहिष्करण प्रतिबंध — आपके फिल मिड को केवल नेट फ्लो में अपने योगदान के माध्यम से ही बदलते हैं — वह धारणा है जिस पर बहस करनी है, और यह ठीक तब सबसे कमजोर होती है जब आपकी quoting स्वयं signal-driven हो। अगर आपके quotes अल्प-अवधि price prediction पर निर्भर हैं, तो इंस्ट्रूमेंट दूषित है और यह डिजाइन विफल होता है। शुद्ध inventory-management या spread-capture policy से आए फिल साफ मामला हैं।
फिल डेटा implementation shortfall और DIY TCA में बताए गए TCA रिकॉर्ड से आता है — वही लॉग आपके अपने फिल से slippage curves के fitting sample की आपूर्ति करता है। कंट्रोल: विंडो में lagged और realized volatility।
ols = IV2SLS(dependent=df.dS, exog=df[["const", "dS_lag", "rv"]],
endog=None, instruments=None).fit(cov_type="robust")
tsls = iv_regression(df, "dS", "q_net", ["q_own"], ["dS_lag", "rv"])
चार संख्याएं तय करती हैं कि यह करना सार्थक था या नहीं: OLS , 2SLS , first-stage , और दोनों गुणांकों के बीच का अंतर — यही OLS अनुमान का वह हिस्सा है जो प्रभाव के बजाय momentum reaction था।
अगर first-stage 10 से कम आता है, तो वही परिणाम है: 5-मिनट resolution पर own fills net flow का बहुत छोटा अंश हैं और की पहचान नहीं कर सकते, और ईमानदार लेखन ईमानदार नकारात्मक परिणाम की शैली में नकारात्मक होगा। कमजोर इंस्ट्रूमेंट का नकारात्मक परिणाम वास्तविक खोज है — यह बताता है कि इस sample size और horizon पर गामा फिट की एंडोजेनेटी ठीक नहीं की जा सकती, और OLS पर बने pre-trade cost estimates में ऊपर की ओर ऐसा पक्षपात है जिसे हटाया नहीं जा सकता।
डायग्नोस्टिक्स

First-stage F (कमजोर इंस्ट्रूमेंट)। Staiger-Stock का सामान्य नियम: । एक एंडोजेनस रिग्रेसर के लिए Stock-Yogo critical values और कड़े हैं — 10% अधिकतम IV size के लिए, एक इंस्ट्रूमेंट के साथ , दो के साथ 19.93, तीन के साथ 22.30; 15% size के लिए, 8.96 / 11.59 / 12.83; 20% के लिए, 6.66 / 8.75 / 9.54।
Durbin-Wu-Hausman (क्या IV की जरूरत भी है)। अगर OLS consistent है तो वह अधिक efficient भी है, इसलिए बदलने से पहले जांच करें। Residual-augmentation रूप व्यावहारिक है: स्टेज 1 चलाएं, रखें, फिर को रिग्रेसर के रूप में जोड़कर OLS structural regression चलाएं। का महत्वपूर्ण गुणांक एंडोजेनेटी का प्रमाण है।
def durbin_wu_hausman(df, dep, endog, instruments, controls):
"""Augmented-regression form of the DWH endogeneity test."""
import statsmodels.api as sm
X1 = sm.add_constant(df[instruments + controls])
v_hat = df[endog] - sm.OLS(df[endog], X1).fit().fittedvalues
X2 = sm.add_constant(df[[endog] + controls].assign(v_hat=v_hat))
res = sm.OLS(df[dep], X2).fit(cov_type="HC1")
return res.tvalues["v_hat"], res.pvalues["v_hat"]
Sargan-Hansen (overidentification)। इंस्ट्रूमेंट के साथ आप संयुक्त वैधता जांच सकते हैं: , जहां सभी इंस्ट्रूमेंट और exogenous controls पर 2SLS residuals का रिग्रेशन करने से आता है। सावधानी statistic से अधिक महत्वपूर्ण है: Sargan केवल उन इंस्ट्रूमेंट को पकड़ता है जो अलग-अलग तरीकों से अवैध हैं। यदि हर इंस्ट्रूमेंट उसी छोड़े गए चर से सहसंबद्ध है, तो टेस्ट साफ पास हो जाता है और आपको कुछ नहीं बताता।
क्रिप्टो माइक्रोस्ट्रक्चर में मौजूद इंस्ट्रूमेंट

वैध इंस्ट्रूमेंट ढूंढना पूरी कठिनाई है, और इक्विटी-कॉरपोरेट-फाइनेंस के सामान्य साधन (analyst coverage, tax shields, windfall cash flow) यहां निष्क्रिय हैं। वास्तव में दो वर्ग लागू होते हैं:
| एंडोजेनस चर | इंस्ट्रूमेंट | तर्क |
|---|---|---|
| नेट टेकर फ्लो | आपके अपने फिल | आपकी quoting और inventory policy से संचालित, बाजार के price path से नहीं — निर्माण से exogenous यदि आपके quotes signal-conditioned नहीं हैं |
| aggregate flow / volume | एक्सचेंज-मैकेनिकल फ्लो: index rebalancing, funding-settlement windows, scheduled liquidation cascades | समय एक्सचेंज के नियमों से तय होता है, सूचना के आगमन से नहीं |
जोखिम

कमजोर इंस्ट्रूमेंट जोर से विफल नहीं होते। कमजोर first stage के साथ, सीमित सैंपल में 2SLS OLS की ओर पक्षपाती होता है, लगभग
पर आप OLS पक्षपात का 25% बनाए रखते हुए "कारणात्मक" अनुमान रिपोर्ट करते हैं। उपाय LIML है, जिसका finite-sample व्यवहार बेहतर है, या Anderson-Rubin टेस्ट, जो इंस्ट्रूमेंट की strength की परवाह किए बिना वैध है।
बहुत सारे इंस्ट्रूमेंट पक्षपात पैदा करते हैं। । first-stage बढ़ाने के लिए हर चीज के lag को में डालना अनुमान को सीधे OLS की ओर वापस ले जाता है। अगर नगण्य नहीं है, तो LIML, jackknife IV (JIVE) या regularized first stage का उपयोग करें।
बहिष्करण प्रतिबंध की जांच नहीं की जा सकती। Sargan से नहीं, किसी भी चीज से नहीं। इसका बचाव domain reasoning से किया जाता है, और उस बचाव का ईमानदार रूप sensitivity analysis है: निष्कर्ष को पलटने के लिए कितने बड़े उल्लंघन की जरूरत होगी?
मुख्य बातें

- Deflation search से आने वाले पक्षपात को ठीक करता है। यह coefficient में पक्षपात के लिए कुछ नहीं करता। ये अलग विफलताएं हैं और अलग औजार मांगती हैं।
- Endogeneity bias sample size के साथ गायब नहीं होता। कसकर अनुमानित, अच्छे से bootstrapped, walk-forward-validated coefficient भी व्यवस्थित रूप से गलत हो सकता है।
- Almgren-Chriss calibration में gamma regression एक वास्तविक, in-house उदाहरण है, जिसमें नामित इंस्ट्रूमेंट (own fills) और TCA pipeline द्वारा पहले से लॉग किया गया डेटा मौजूद है।
- 2SLS coefficient से पहले first-stage रिपोर्ट करें। 10 से नीचे coefficient प्रमाण नहीं है, और यह कहना ही publishable result है।
Authors
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.