← 返回文章列表
August 10, 2026
5 分鐘閱讀

The Other Way a Regression Lies: Endogeneity, 2SLS, and the Gamma Calibration Problem

The Other Way a Regression Lies: Endogeneity, 2SLS, and the Gamma Calibration Problem
#causal-inference
#instrumental-variables
#2SLS
#econometrics
#endogeneity

回歸有兩種結構上不同的欺騙方式,而這個部落格至今只處理了其中一種。

第一種是搜尋中的選擇偏差:你執行了一萬次回測,保留表現最好的一次,而眼前的數字其實是雜訊分布的最大值,不是某種效應。這是折減 Sharpe 比率及其總結篇誠實的負結果所討論的主題。修正方法是為搜尋付出代價。

第二種是係數本身的偏差,出現在一個你根本沒有搜尋過的單一回歸中。如果回歸變數與誤差項相關,OLS 會產生偏差且不一致——這與抽樣噪聲不同,不會隨樣本量增加而縮小。更多資料只會讓這個錯誤數字變得更精確。再多的 bootstrap、滾動前向驗證或折減都碰不到它,因為這些方法質疑的都是選擇,而不是識別。

本文討論第二種失效,而且在這裡它不是抽象的顧慮。Almgren-Chriss 校準文章以 5 分鐘中間價變化對淨 taker 流量做回歸,擬合永久性衝擊 γ\gamma,得到幾個百分點的 R2R^2,以及日與日之間變動 2--5 倍的係數;文章把內生性列為首要的結構性原因:“流量對價格的反應,和價格對流量的反應一樣多。動量交易者是因為價格上漲才買入;對流量做收益的樸素 OLS 會捕捉他們的反應,並將其歸因於衝擊。”文章也指出了乾淨的修正方法——你自己的成交,因其構造而具有外生性。

這是一個具名工具變數、且資料已在內部的工具變數問題。下面介紹估計量、診斷方法與實驗。

一段話理解內生性

交織的力量造成內生性

只有在 E[εiXi]=0\mathbb{E}[\varepsilon_i \mid X_i] = 0 的條件下,OLS 才能估計 Yi=β0+β1Xi+εiY_i = \beta_0 + \beta_1 X_i + \varepsilon_i 中的因果 β1\beta_1。有三件事會破壞這個條件。遺漏變數偏差:如果 WW 同時驅動 XXYY,且不可觀測,它就會進入誤差項,εi=γWi+ui\varepsilon_i = \gamma W_i + u_i;而 Cov(Xi,Wi)0\text{Cov}(X_i, W_i) \neq 0 會迫使 Cov(Xi,εi)0\text{Cov}(X_i, \varepsilon_i) \neq 0——在微觀結構中,未觀測到的資訊抵達會同時驅動成交量與波動率。測量誤差:若使用帶噪聲的代理變數 Xi=Xi+νiX_i = X_i^* + \nu_i,則 plim β^1OLS=β1σX2/(σX2+σν2)\text{plim } \hat{\beta}_1^{\text{OLS}} = \beta_1 \cdot \sigma_{X^*}^2 / (\sigma_{X^*}^2 + \sigma_\nu^2),估計值必然向零衰減——淨化後的 aggTrades 流量只是碎片化市場中真實帶方向訂單流的代理,而你永遠看不到的那部分就是測量誤差。同時性:在Almgren-Chriss 衝擊校準中已以更具體、更尖銳的形式說明,這正是下文一切內容的動機問題。

IV 解法

隔離因果市場效應的工具變數

工具變數 ZZ 必須滿足兩個條件:

  1. 相關性Cov(Zi,Xi)0\text{Cov}(Z_i, X_i) \neq 0。可檢驗,而且你必須檢驗。
  2. 排除限制Cov(Zi,εi)=0\text{Cov}(Z_i, \varepsilon_i) = 0——ZZ 只能透過 XX 影響 YY。永遠不可檢驗。這是經濟學上的論證,不是統計量。

對一個工具變數和一個內生回歸變數而言,估計量是兩個簡約式效應的比值(Wald 估計量):

β^1IV=Cov(Zi,Yi)Cov(Zi,Xi)=π^reduced formπ^first stage\hat{\beta}_1^{\text{IV}} = \frac{\text{Cov}(Z_i, Y_i)}{\text{Cov}(Z_i, X_i)} = \frac{\hat{\pi}_{\text{reduced form}}}{\hat{\pi}_{\text{first stage}}}

有控制變數和多個工具變數時,使用 2SLS。第一階段:以工具變數和控制變數回歸內生變數,Xi=π0+πZZi+πCCi+viX_i = \pi_0 + \boldsymbol{\pi}_Z' \mathbf{Z}_i + \boldsymbol{\pi}_C' \mathbf{C}_i + v_i,並保留擬合值 X^i\hat{X}_i——按照構造,它們只包含由工具變數驅動的外生變異。第二階段:執行 Yi=β0+β1X^i+βCCi+εiY_i = \beta_0 + \beta_1 \hat{X}_i + \boldsymbol{\beta}_C' \mathbf{C}_i + \varepsilon_i。用矩陣表示,令 PZ=Z(ZZ)1Z\mathbf{P}_Z = \mathbf{Z}(\mathbf{Z}'\mathbf{Z})^{-1}\mathbf{Z}'

β^2SLS=(XPZX)1XPZy,Var(β^2SLS)=σ^2(XPZX)1.\hat{\boldsymbol{\beta}}_{2\text{SLS}} = \left(\mathbf{X}' \mathbf{P}_Z \mathbf{X}\right)^{-1} \mathbf{X}' \mathbf{P}_Z \mathbf{y}, \qquad \text{Var}(\hat{\boldsymbol{\beta}}_{2\text{SLS}}) = \hat{\sigma}^2 \left(\mathbf{X}' \mathbf{P}_Z \mathbf{X}\right)^{-1}.

所有手動實作這一步的人都會踩到的陷阱:如果你真的呼叫兩次 lstsq,第二階段的標準誤就會錯。X^i\hat{X}_i 是一個生成的回歸變數,殘差變異必須根據原始 XX 計算,而不是根據擬合值計算。樸素的兩步標準誤會太小,因此 tt 統計量會太大,導致過度拒絕。請使用真正的 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 文章中的永久性衝擊擬合:

ΔS5m=γQnet+noise,Qnet=taker buystaker sells.\Delta S_{5m} = \gamma\, Q_{\text{net}} + \text{noise}, \qquad Q_{\text{net}} = \text{taker buys} - \text{taker sells}.

根據上面的同時性論證,QnetQ_{\text{net}} 是內生的。工具變數是該時間窗口內的你自己的成交:你的 maker 成交由自己的報價排程和庫存政策觸發,而不是由市場價格路徑觸發,因此它是訂單流變異的來源,合理地與誤差中的動量反應部分不相關。排除限制——你的成交只透過其對淨流量的貢獻來推動中間價——是需要論證的假設;而當你的報價本身由訊號驅動時,這個假設恰好最弱。如果報價以短期價格預測為條件,工具變數就受到污染,這個設計會失效。純粹的庫存管理或捕捉價差策略所產生的成交,才是乾淨的案例。

成交資料來自執行不足與 DIY TCA所描述的 TCA 紀錄——也是為使用自有成交估計滑點曲線提供擬合樣本的同一份日誌。控制變數:滯後的 ΔS\Delta S 和窗口內的實現波動率。

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 γ\gamma、2SLS γ\gamma、第一階段 FF,以及兩個係數之間的差距——它表示 OLS 估計中有多少其實是動量反應,而不是衝擊。

如果第一階段 FF 低於 10,這就是結果:在 5 分鐘解析度上,自有成交在淨流量中所占比例太小,無法識別 γ\gamma;誠實的寫法應是誠實的負結果風格的負面結論。弱工具變數導致的負結果是真實發現——它告訴你,在這個樣本量和時間跨度下,Gamma 擬合中的內生性無法修正,而建立在 OLS γ\gamma 上的交易前成本估計帶有無法移除的向上偏差。

診斷

圍繞因果路徑的驗證環

第一階段 F(弱工具變數)。 Staiger-Stock 經驗法則:F>10F > 10。對一個內生回歸變數而言,Stock-Yogo 臨界值更嚴格——在最大 IV 大小為 10% 時,一個工具變數要求 F>16.38F > 16.38,兩個工具變數要求 19.93,三個要求 22.30;在 15% 時為 8.96 / 11.59 / 12.83;在 20% 時為 6.66 / 8.75 / 9.54。

F=(Runrestricted2Rrestricted2)/q(1Runrestricted2)/(nk)F = \frac{(R_{\text{unrestricted}}^2 - R_{\text{restricted}}^2) / q}{(1 - R_{\text{unrestricted}}^2) / (n - k)}

Durbin-Wu-Hausman(是否真的需要 IV)。 如果 OLS 一致,它也會更有效率,因此切換前要先檢驗。實務上使用殘差增補形式:執行第一階段,保留 v^i=XiX^i\hat{v}_i = X_i - \hat{X}_i,然後在結構 OLS 回歸中加入 v^i\hat{v}_i 作為回歸變數。v^i\hat{v}_i 的係數顯著,便是內生性的證據。

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(過度識別)。 當工具變數數量 q>pq > p 時,可以檢驗聯合有效性:J=nRε^Z2χ2(qp)J = n \cdot R^2_{\hat{\varepsilon} \sim \mathbf{Z}} \sim \chi^2(q - p)。其中的 R2R^2 來自以所有工具變數和外生控制變數回歸 2SLS 殘差。注意事項比統計量更重要:Sargan 只能檢測以不同方式失效的工具變數。如果所有工具變數都與同一個遺漏變數相關,檢驗會乾淨地通過,卻什麼也沒告訴你。

加密貨幣微觀結構中存在的工具變數

加密市場網路中的獨立衝擊

找到有效工具變數才是全部難點;股權與公司金融中常用的工具(分析師覆蓋、稅盾、意外現金流)在這裡都不起作用。實際適用的有兩類:

內生變數 工具變數 理由
淨 taker 流量 你自己的成交 由你的報價與庫存政策驅動,而不是由市場價格路徑驅動——前提是你的報價沒有以訊號為條件,因此在構造上具有外生性
聚合流量 / 成交量 交易所機械性流量:指數再平衡、資金費率結算窗口、排程清算瀑布 時間由交易所規則決定,而不是由資訊抵達決定

陷阱

隱藏路徑削弱工具變數

弱工具變數不會大聲失效。 第一階段較弱時,2SLS 在有限樣本中會偏向 OLS,大致為

Bias2SLSBiasOLS1F1.\frac{\text{Bias}_{2\text{SLS}}}{\text{Bias}_{\text{OLS}}} \approx \frac{1}{F - 1}.

F=5F = 5 時,你在報告一個“因果”估計的同時,仍保留 OLS 偏差的 25%。補救方法是 LIML,它在有限樣本中的表現更好;或者使用 Anderson-Rubin 檢驗,它不論工具變數強度如何都有效。

工具變數過多會造成偏差。 Bias2SLS(q/n)BiasOLS\text{Bias}_{2\text{SLS}} \approx (q/n) \cdot \text{Bias}_{\text{OLS}}。把所有變數的滯後項都塞進 Z\mathbf{Z} 來提高第一階段 FF,會讓估計值直接走回 OLS。如果 q/nq/n 不可忽略,請使用 LIML、jackknife IV(JIVE)或正則化的第一階段。

排除限制無法被檢驗。 不是 Sargan,也不是任何其他方法。它只能用領域推理來辯護,而這種辯護最誠實的形式是敏感度分析:需要多大的違反程度,才足以推翻結論?

要點

穿過噪聲資料的可信因果路徑

  • 折減修正的是搜尋造成的偏差,對係數中的偏差毫無作用。這是兩種不同的失效,需要不同的工具。
  • 內生性偏差不會隨樣本量增加而消失。一個緊密、經過良好 bootstrap 和滾動前向驗證的係數,仍可能系統性地錯誤。
  • Almgren-Chriss 校準中的 Gamma 回歸是一個真實的內部案例:它有具名工具變數(自有成交),而資料已由 TCA 流程記錄。
  • 在報告 2SLS 係數之前,先報告第一階段 FF。低於 10 時,係數不是證據,而明確說出這一點就是可發表的結果。
免責宣告:本文提供的資訊僅用於教育和參考目的,不構成財務、投資或交易建議。加密貨幣交易涉及重大損失風險。

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 交易見解、市場分析和平台更新。

我們尊重您的隱私。您可以隨時退訂。