← 返回文章列表
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

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

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

第二种是系数本身的偏差,发生在一个你从未进行搜索的单次回归中。如果回归变量与误差项相关,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[εiXi]=0\mathbb{E}[\varepsilon_i \mid X_i] = 0 时才成立。有三件事会破坏这一条件。遗漏变量偏差:如果 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 影响 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+π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}} 是内生的。工具变量是窗口内的你自己的成交记录:你的做市成交由自己的报价计划和库存策略触发,而不是由市场价格路径触发,因此它们提供了一种订单流变动来源,有理由认为与误差中的动量反应成分不相关。排除性限制——你的成交只通过其对净流量的贡献来推动中间价——是需要论证的假设;而当你的报价本身由信号驱动时,这一假设恰恰最脆弱。如果报价以短期价格预测为条件,工具变量就会被污染,这个设计也会失效。来自纯库存管理或捕捉价差策略的成交,是最干净的情况。

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

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

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

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

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

陷阱

隐藏路径削弱工具变量

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

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

要点

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

  • 去膨胀修复的是搜索带来的偏差,对系数中的偏差不起作用。这是两种不同的失效,需要不同的工具。
  • 内生性偏差不会随样本量增加而消失。一个紧致、经过良好自助法处理并通过滚动前向验证的系数,仍然可能系统性错误。
  • 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 交易见解、市场分析和平台更新。

我们尊重您的隐私。您可以随时退订。