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

Selection bias in the search is not the only way a regression fools you. When the regressor is correlated with the error, more data makes the estimate more confidently wrong. Instrumental variables applied to the one endogeneity problem this blog has already left open: permanent impact from net taker flow.

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

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

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

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

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

一段話理解內生性

交織的力量造成內生性

只有在 E[εi∣Xi]=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 同時驅動 XX 和 YY,且不可觀測,它就會進入誤差項,ε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⋅σX∗2/(σX∗2+σν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+πZ′Zi+πC′Ci+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+βC′Ci+εiY_i = \beta_0 + \beta_1 \hat{X}_i + \boldsymbol{\beta}_C' \mathbf{C}_i + \varepsilon_i。用矩陣表示,令 PZ=Z(Z′Z)−1Z′\mathbf{P}_Z = \mathbf{Z}(\mathbf{Z}'\mathbf{Z})^{-1}\mathbf{Z}':

β^2SLS=(X′PZX)−1X′PZy,Var(β^2SLS)=σ^2(X′PZX)−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 buys−taker 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 和窗口內的實現波動率。

# per 5-min bin over the sample:
#   dS        mid-price change             (outcome)
#   q_net     signed net taker flow        (endogenous)
#   q_own     signed own-fill quantity     (instrument)
#   dS_lag, rv  controls
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=(Runrestricted2−Rrestricted2)/q(1−Runrestricted2)/(n−k)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=Xi−X^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=n⋅Rε^∼Z2∼χ2(q−p)J = n \cdot R^2_{\hat{\varepsilon} \sim \mathbf{Z}} \sim \chi^2(q - p)。其中的 R2R^2 來自以所有工具變數和外生控制變數回歸 2SLS 殘差。注意事項比統計量更重要:Sargan 只能檢測以不同方式失效的工具變數。如果所有工具變數都與同一個遺漏變數相關,檢驗會乾淨地通過,卻什麼也沒告訴你。

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

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

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

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

陷阱

隱藏路徑削弱工具變數

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

Bias2SLSBiasOLS≈1F−1.\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 時,係數不是證據,而明確說出這一點就是可發表的結果。