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.

回归有两种结构上不同的方式会欺骗你,而本博客迄今只处理了其中一种。

第一种是搜索中的选择偏差:你运行了一万次回测,保留表现最好的那次,而眼前的数字其实是噪声分布的最大值,并非某种效应。这正是去膨胀夏普比率及其收束之作诚实的负面结果所讨论的问题。解决办法是为搜索付出相应代价。

第二种是系数本身的偏差,发生在一个你从未进行搜索的单次回归中。如果回归变量与误差项相关,OLS 就会有偏且不一致——不同于抽样噪声,这种偏差不会随样本量增加而缩小。更多数据只会让错误的数字变得更精确。无论是自助法、滚动前向验证还是去膨胀,都无法触及这个问题,因为这些方法质疑的是选择,而不是识别。

本文讨论第二种失效,而且这并非抽象担忧。Almgren-Chriss 校准文章通过回归净主动成交流上的 5 分钟中间价变化来拟合永久冲击 γ\gamma,得到几个百分点的 R2R^2,以及一个在不同日期之间变化 2–5 倍的系数;文章把内生性列为首要的结构性原因:“流量对价格的响应,与价格对流量的响应一样强。动量交易者是因为价格上涨才买入;对收益关于流量进行朴素 OLS 会捕捉到他们的反应,并把它归因于冲击。”文章也指出了干净的解决办法——使用你自己的成交记录,因为它在构造上是外生的。

这是一个拥有明确工具变量、且数据已经在内部的工具变量问题。下面介绍估计器、诊断方法和实验设计。

用一段话理解内生性

交织的力量造成内生性

OLS 估计因果 β1\beta_1,它位于 Yi=β0+β1Xi+εiY_i = \beta_0 + \beta_1 X_i + \varepsilon_i 中;只有在 E[εi∣Xi]=0\mathbb{E}[\varepsilon_i \mid X_i] = 0 时才成立。有三件事会破坏这一条件。遗漏变量偏差:如果 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 影响 YY 只能通过 XX。不可检验,永远不可检验。这是经济学论证,而不是统计量。

对于一个工具变量和一个内生回归变量,估计器是两个简约式效应之比(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}} 是内生的。工具变量是窗口内的你自己的成交记录:你的做市成交由自己的报价计划和库存策略触发,而不是由市场价格路径触发,因此它们提供了一种订单流变动来源,有理由认为与误差中的动量反应成分不相关。排除性限制——你的成交只通过其对净流量的贡献来推动中间价——是需要论证的假设;而当你的报价本身由信号驱动时,这一假设恰恰最脆弱。如果报价以短期价格预测为条件,工具变量就会被污染,这个设计也会失效。来自纯库存管理或捕捉价差策略的成交,是最干净的情况。

成交数据来自执行滑点与 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 只能检测以不同方式无效的工具变量。如果所有工具变量都与同一个遗漏变量相关,检验会顺利通过,却什么也没有告诉你。

加密市场微观结构中存在的工具变量

加密市场网络中的独立冲击

找到有效工具变量是全部难点,而股票与公司金融中常用的工具(分析师覆盖、税盾、意外现金流)在这里都不起作用。真正适用的有两类:

内生变量工具变量理由
净主动成交流你自己的成交记录由你的报价和库存策略驱动,而不是由市场价格路径驱动——如果你的报价不以信号为条件,它在构造上就是外生的
总流量/成交量交易所机制产生的流量:指数再平衡、资金费结算窗口、预定的强平级联时点由交易所规则设定,而不是由信息到达决定

陷阱

隐藏路径削弱工具变量

**弱工具变量不会大声失败。**第一阶段较弱时,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、刀切工具变量(JIVE)或正则化的第一阶段。

**排除性限制无法检验。**Sargan 不行,任何方法都不行。它只能通过领域知识来辩护,而这种辩护最诚实的形式是敏感性分析:需要多大的违背,才能推翻结论?

要点

穿过噪声数据的可信因果路径

  • 去膨胀修复的是搜索带来的偏差,对系数中的偏差不起作用。这是两种不同的失效,需要不同的工具。
  • 内生性偏差不会随样本量增加而消失。一个紧致、经过良好自助法处理并通过滚动前向验证的系数,仍然可能系统性错误。
  • Almgren-Chriss 校准中的 Gamma 回归是一个正在发生的内部案例:工具变量明确(自己的成交记录),数据也已经由 TCA 管道记录。
  • 在报告 2SLS 系数之前,先报告第一阶段 FF。低于 10 时,系数不是证据;明确这样说,就是可以发表的结果。