The Other Way a Regression Lies: Endogeneity, 2SLS, and the Gamma Calibration Problem
回归有两种结构上不同的方式会欺骗你,而本博客迄今只处理了其中一种。
第一种是搜索中的选择偏差:你运行了一万次回测,保留表现最好的那次,而眼前的数字其实是噪声分布的最大值,并非某种效应。这正是去膨胀夏普比率及其收束之作诚实的负面结果所讨论的问题。解决办法是为搜索付出相应代价。
第二种是系数本身的偏差,发生在一个你从未进行搜索的单次回归中。如果回归变量与误差项相关,OLS 就会有偏且不一致——不同于抽样噪声,这种偏差不会随样本量增加而缩小。更多数据只会让错误的数字变得更精确。无论是自助法、滚动前向验证还是去膨胀,都无法触及这个问题,因为这些方法质疑的是选择,而不是识别。
本文讨论第二种失效,而且这并非抽象担忧。Almgren-Chriss 校准文章通过回归净主动成交流上的 5 分钟中间价变化来拟合永久冲击 ,得到几个百分点的 ,以及一个在不同日期之间变化 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 文章中的永久冲击拟合:
根据上面的同时性论证, 是内生的。工具变量是窗口内的你自己的成交记录:你的做市成交由自己的报价计划和库存策略触发,而不是由市场价格路径触发,因此它们提供了一种订单流变动来源,有理由认为与误差中的动量反应成分不相关。排除性限制——你的成交只通过其对净流量的贡献来推动中间价——是需要论证的假设;而当你的报价本身由信号驱动时,这一假设恰恰最脆弱。如果报价以短期价格预测为条件,工具变量就会被污染,这个设计也会失效。来自纯库存管理或捕捉价差策略的成交,是最干净的情况。
成交数据来自执行滑点与 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 只能检测以不同方式无效的工具变量。如果所有工具变量都与同一个遗漏变量相关,检验会顺利通过,却什么也没有告诉你。
加密市场微观结构中存在的工具变量

找到有效工具变量是全部难点,而股票与公司金融中常用的工具(分析师覆盖、税盾、意外现金流)在这里都不起作用。真正适用的有两类:
| 内生变量 | 工具变量 | 理由 |
|---|---|---|
| 净主动成交流 | 你自己的成交记录 | 由你的报价和库存策略驱动,而不是由市场价格路径驱动——如果你的报价不以信号为条件,它在构造上就是外生的 |
| 总流量/成交量 | 交易所机制产生的流量:指数再平衡、资金费结算窗口、预定的强平级联 | 时点由交易所规则设定,而不是由信息到达决定 |
陷阱

**弱工具变量不会大声失败。**第一阶段较弱时,2SLS 在有限样本中会向 OLS 偏移,大致满足
当 时,你在报告“因果”估计的同时,仍保留了 OLS 偏差的 25%。补救方法包括 LIML(有限样本表现更好),以及无论工具变量强弱都有效的 Anderson-Rubin 检验。
工具变量过多会产生偏差。。把所有变量的滞后项都塞进 来提高第一阶段 ,会让估计值直接走回 OLS。如果 不可忽略,应使用 LIML、刀切工具变量(JIVE)或正则化的第一阶段。
**排除性限制无法检验。**Sargan 不行,任何方法都不行。它只能通过领域知识来辩护,而这种辩护最诚实的形式是敏感性分析:需要多大的违背,才能推翻结论?
要点

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