The Other Way a Regression Lies: Endogeneity, 2SLS, and the Gamma Calibration Problem
回歸有兩種結構上不同的欺騙方式,而這個部落格至今只處理了其中一種。
第一種是搜尋中的選擇偏差:你執行了一萬次回測,保留表現最好的一次,而眼前的數字其實是雜訊分布的最大值,不是某種效應。這是折減 Sharpe 比率及其總結篇誠實的負結果所討論的主題。修正方法是為搜尋付出代價。
第二種是係數本身的偏差,出現在一個你根本沒有搜尋過的單一回歸中。如果回歸變數與誤差項相關,OLS 會產生偏差且不一致——這與抽樣噪聲不同,不會隨樣本量增加而縮小。更多資料只會讓這個錯誤數字變得更精確。再多的 bootstrap、滾動前向驗證或折減都碰不到它,因為這些方法質疑的都是選擇,而不是識別。
本文討論第二種失效,而且在這裡它不是抽象的顧慮。Almgren-Chriss 校準文章以 5 分鐘中間價變化對淨 taker 流量做回歸,擬合永久性衝擊 ,得到幾個百分點的 ,以及日與日之間變動 2--5 倍的係數;文章把內生性列為首要的結構性原因:“流量對價格的反應,和價格對流量的反應一樣多。動量交易者是因為價格上漲才買入;對流量做收益的樸素 OLS 會捕捉他們的反應,並將其歸因於衝擊。”文章也指出了乾淨的修正方法——你自己的成交,因其構造而具有外生性。
這是一個具名工具變數、且資料已在內部的工具變數問題。下面介紹估計量、診斷方法與實驗。
一段話理解內生性

只有在 的條件下,OLS 才能估計 中的因果 。有三件事會破壞這個條件。遺漏變數偏差:如果 同時驅動 和 ,且不可觀測,它就會進入誤差項,;而 會迫使 ——在微觀結構中,未觀測到的資訊抵達會同時驅動成交量與波動率。測量誤差:若使用帶噪聲的代理變數 ,則 ,估計值必然向零衰減——淨化後的 aggTrades 流量只是碎片化市場中真實帶方向訂單流的代理,而你永遠看不到的那部分就是測量誤差。同時性:在Almgren-Chriss 衝擊校準中已以更具體、更尖銳的形式說明,這正是下文一切內容的動機問題。
IV 解法

工具變數 必須滿足兩個條件:
- 相關性:。可檢驗,而且你必須檢驗。
- 排除限制:—— 只能透過 影響 。永遠不可檢驗。這是經濟學上的論證,不是統計量。
對一個工具變數和一個內生回歸變數而言,估計量是兩個簡約式效應的比值(Wald 估計量):
有控制變數和多個工具變數時,使用 2SLS。第一階段:以工具變數和控制變數回歸內生變數,,並保留擬合值 ——按照構造,它們只包含由工具變數驅動的外生變異。第二階段:執行 。用矩陣表示,令 :
所有手動實作這一步的人都會踩到的陷阱:如果你真的呼叫兩次 lstsq,第二階段的標準誤就會錯。 是一個生成的回歸變數,殘差變異必須根據原始 計算,而不是根據擬合值計算。樸素的兩步標準誤會太小,因此 統計量會太大,導致過度拒絕。請使用真正的 IV 實作:
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 Gamma 與 2SLS Gamma

待檢驗的回歸,是 Almgren-Chriss 文章中的永久性衝擊擬合:
根據上面的同時性論證, 是內生的。工具變數是該時間窗口內的你自己的成交:你的 maker 成交由自己的報價排程和庫存政策觸發,而不是由市場價格路徑觸發,因此它是訂單流變異的來源,合理地與誤差中的動量反應部分不相關。排除限制——你的成交只透過其對淨流量的貢獻來推動中間價——是需要論證的假設;而當你的報價本身由訊號驅動時,這個假設恰好最弱。如果報價以短期價格預測為條件,工具變數就受到污染,這個設計會失效。純粹的庫存管理或捕捉價差策略所產生的成交,才是乾淨的案例。
成交資料來自執行不足與 DIY TCA所描述的 TCA 紀錄——也是為使用自有成交估計滑點曲線提供擬合樣本的同一份日誌。控制變數:滯後的 和窗口內的實現波動率。
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 、第一階段 ,以及兩個係數之間的差距——它表示 OLS 估計中有多少其實是動量反應,而不是衝擊。
如果第一階段 低於 10,這就是結果:在 5 分鐘解析度上,自有成交在淨流量中所占比例太小,無法識別 ;誠實的寫法應是誠實的負結果風格的負面結論。弱工具變數導致的負結果是真實發現——它告訴你,在這個樣本量和時間跨度下,Gamma 擬合中的內生性無法修正,而建立在 OLS 上的交易前成本估計帶有無法移除的向上偏差。
診斷

第一階段 F(弱工具變數)。 Staiger-Stock 經驗法則:。對一個內生回歸變數而言,Stock-Yogo 臨界值更嚴格——在最大 IV 大小為 10% 時,一個工具變數要求 ,兩個工具變數要求 19.93,三個要求 22.30;在 15% 時為 8.96 / 11.59 / 12.83;在 20% 時為 6.66 / 8.75 / 9.54。
Durbin-Wu-Hausman(是否真的需要 IV)。 如果 OLS 一致,它也會更有效率,因此切換前要先檢驗。實務上使用殘差增補形式:執行第一階段,保留 ,然後在結構 OLS 回歸中加入 作為回歸變數。 的係數顯著,便是內生性的證據。
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(過度識別)。 當工具變數數量 時,可以檢驗聯合有效性:。其中的 來自以所有工具變數和外生控制變數回歸 2SLS 殘差。注意事項比統計量更重要:Sargan 只能檢測以不同方式失效的工具變數。如果所有工具變數都與同一個遺漏變數相關,檢驗會乾淨地通過,卻什麼也沒告訴你。
加密貨幣微觀結構中存在的工具變數

找到有效工具變數才是全部難點;股權與公司金融中常用的工具(分析師覆蓋、稅盾、意外現金流)在這裡都不起作用。實際適用的有兩類:
| 內生變數 | 工具變數 | 理由 |
|---|---|---|
| 淨 taker 流量 | 你自己的成交 | 由你的報價與庫存政策驅動,而不是由市場價格路徑驅動——前提是你的報價沒有以訊號為條件,因此在構造上具有外生性 |
| 聚合流量 / 成交量 | 交易所機械性流量:指數再平衡、資金費率結算窗口、排程清算瀑布 | 時間由交易所規則決定,而不是由資訊抵達決定 |
陷阱

弱工具變數不會大聲失效。 第一階段較弱時,2SLS 在有限樣本中會偏向 OLS,大致為
在 時,你在報告一個“因果”估計的同時,仍保留 OLS 偏差的 25%。補救方法是 LIML,它在有限樣本中的表現更好;或者使用 Anderson-Rubin 檢驗,它不論工具變數強度如何都有效。
工具變數過多會造成偏差。 。把所有變數的滯後項都塞進 來提高第一階段 ,會讓估計值直接走回 OLS。如果 不可忽略,請使用 LIML、jackknife IV(JIVE)或正則化的第一階段。
排除限制無法被檢驗。 不是 Sargan,也不是任何其他方法。它只能用領域推理來辯護,而這種辯護最誠實的形式是敏感度分析:需要多大的違反程度,才足以推翻結論?
要點

- 折減修正的是搜尋造成的偏差,對係數中的偏差毫無作用。這是兩種不同的失效,需要不同的工具。
- 內生性偏差不會隨樣本量增加而消失。一個緊密、經過良好 bootstrap 和滾動前向驗證的係數,仍可能系統性地錯誤。
- Almgren-Chriss 校準中的 Gamma 回歸是一個真實的內部案例:它有具名工具變數(自有成交),而資料已由 TCA 流程記錄。
- 在報告 2SLS 係數之前,先報告第一階段 。低於 10 時,係數不是證據,而明確說出這一點就是可發表的結果。
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.