halo 的技术博客

返回

先说结论:Granger 因果的定义本身没有”线性”两个字——它只问”用了 x 的历史之后,对 y 的预测是否变好”。但教科书的 F 检验把”预测”偷偷限定成了”线性回归预测”。这一限定在金融里是致命的:波动传导(x 的大幅波动引发 y 的波动,与方向无关)、恐慌放大(只有暴跌才传染)、阈值效应(小扰动无传导、大冲击才传导)全都是非线性通道,线性检验一律漏检。 合成实验实测:y 被 0.6x2(t1)0.6 \cdot x^2(t-1) 强驱动(信号方差与噪声相当),线性 F 统计量 0.17,远低于 3.0 的临界值——结论”x 不 Granger 导致 y”,完全错误。换成 16 隐单元的小 MLP:加入 x 滞后让样本外 MSE 从 2.72 降到 1.35,改善 50.5%;置换检验 30 次打乱 x 滞后重训,最大伪改善只有 3.9%,真实改善的 p 值 < 0.033。但先泼冷水:真实市场里的非线性因果远比这个合成例子微弱,而且极容易与 GARCH 波动聚集混淆——检验前不做波动过滤,你抓到的多半是波动率的自相关,不是跨变量因果。

非线性 Granger 因果:x 明明驱动 y,线性检验却说『无因果』

一、线性 Granger 检验在检验什么#

标准流程:比较两个回归的残差平方和。

受限模型(只用 y 自己的历史):yt=c+aiyti+εty_t = c + \sum a_i y_{t-i} + \varepsilon_t

无约束模型(加入 x 的历史):yt=c+aiyti+bixti+εty_t = c + \sum a_i y_{t-i} + \sum b_i x_{t-i} + \varepsilon_t

F 统计量 F=(RSSrRSSu)/pRSSu/(nk)F = \frac{(RSS_r - RSS_u)/p}{RSS_u/(n-k)} 检验 b1==bp=0b_1 = \cdots = b_p = 0。拒绝原假设 → “x Granger 导致 y”。

注意这里检验的实质是:x 的滞后与 y 之间的线性投影系数是否为零。如果真实传导函数是偶函数——比如 yty_t 依赖 xt12x_{t-1}^2——那么 Cov(xt1,yt)=E[x3]0.60\text{Cov}(x_{t-1}, y_t) = E[x^3] \cdot 0.6 \approx 0(对称分布下三阶矩为零),线性投影系数在总体意义上就是零。不是样本量不够、不是噪声太大,是这个检验在数学上注定看不见偶函数通道。

二、构造一个线性检验必然漏检的系统#

xt=0.5xt1+εt,yt=0.3yt1+0.6(xt121.33)+ηtx_t = 0.5 x_{t-1} + \varepsilon_t, \qquad y_t = 0.3 y_{t-1} + 0.6\,(x_{t-1}^2 - 1.33) + \eta_t

x 是普通 AR(1);y 被 x 前一天的平方驱动(减去 E[x2]=1.33E[x^2]=1.33 保持零均值)。传导强度不小:0.6x20.6 \cdot x^2 项的方差与噪声 η\eta 的方差同量级。这个结构对应金融里最常见的机制——x 的波动大小(而非方向)驱动 y:想想 VIX 飙升对小盘股流动性的冲击,或者汇率剧烈波动(无论贬值还是升值)对出口企业股价的压制。

散点图上 xt1x_{t-1}yty_t 呈清晰的 U 形,但线性相关系数约为 0。T=1500,滞后阶 p=2:

线性 F 检验:F = 0.17,5% 临界值约 3.0,不能拒绝”无因果”。 多种子重复实验(信号无线性分量时)拒绝率约 20%——比 5% 的名义水平高一点(有限样本里 x2x^2 与 x 有微弱样本相关),但检验功效低到接近瞎猜。一个被强因果驱动的系统,线性检验八成情况下宣布”无关”。

三、神经网络 Granger:换掉预测器,保留框架#

Granger 因果的比较框架不动,把线性回归换成能拟合任意光滑函数的预测器:

受限模型:MLP 只吃 [yt1,yt2][y_{t-1}, y_{t-2}]无约束模型:MLP 吃 [yt1,yt2,xt1,xt2][y_{t-1}, y_{t-2}, x_{t-1}, x_{t-2}]。两个模型同架构(16 隐单元、tanh 激活)、同训练配置(Adam,300 轮)、同随机种子,在前 1000 天训练、后 500 天比较样本外 MSE。

def train_mlp(X, y, hidden=16, epochs=300, lr=0.01, seed=0):
    """纯 numpy 单隐层 MLP + Adam"""
    r = np.random.default_rng(seed)
    n, d = X.shape
    W1 = r.normal(0, np.sqrt(2/d), (d, hidden)); b1 = np.zeros(hidden)
    W2 = r.normal(0, np.sqrt(2/hidden), (hidden, 1)); b2 = np.zeros(1)
    # ... Adam 更新略(完整代码见文末脚本)
    for ep in range(epochs):
        H = np.tanh(X @ W1 + b1)
        err = (H @ W2 + b2) - y.reshape(-1, 1)
        # 反向传播 + Adam step
    return lambda Xq: (np.tanh(Xq @ W1 + b1) @ W2 + b2).ravel()

mse_r = mse(y_test, f_restricted(X_r_test))   # 2.721
mse_u = mse(y_test, f_unrestricted(X_u_test)) # 1.346 → 改善 50.5%
python

结果对比(样本外 500 天):

模型特征样本外 MSE相对受限模型改善
MLP 受限仅 y 滞后2.721
线性无约束y + x 滞后2.6941.0%
MLP 无约束y + x 滞后1.34650.5%

线性模型拿到同样的 x 滞后,几乎什么都吃不到(1%的改善纯属噪声);MLP 把 MSE 砍掉一半。差距就是非线性通道的贡献——MLP 学会了 U 形传导函数,线性模型在数学上学不会。

线性 F 检验漏检 vs 神经网络+置换检验抓出真实因果

四、显著性怎么办:置换检验#

NN 版 Granger 没有现成的 F 分布可查——MSE 改善多大算显著?靠置换检验构造零分布:

  1. 把 x 滞后列整体随机打乱(破坏 x 与 y 的时间对齐,但保留 x 的边际分布);
  2. 用打乱后的特征重训无约束 MLP,记录”伪改善”;
  3. 重复 30 次,得到”x 与 y 无关时,MLP 靠过拟合和运气能挤出多少改善”的分布。

结果:30 次置换的伪改善最大值 3.9%,均值接近 0;真实 x 的改善 50.5% 远超整个置换分布,p < 1/30 ≈ 0.033。这个设计同时回答了一个常见质疑——“MLP 参数多,加特征当然更好”:置换样本里 MLP 拿到同样多的参数和特征维度,却只能挤出 4% 以内的伪改善。50.5% 不是模型容量的礼物,是时间对齐信息的贡献。

两个工程细节决定置换检验的有效性:(a) 受限/无约束/置换模型必须用同一随机种子初始化,否则初始化运气会污染比较;(b) 必须比样本外 MSE 而非训练 MSE——训练集上无约束模型永远更好,比较毫无意义。

五、因果通道能不能变成钱#

无约束 MLP 的样本外预测方向准确率 74.2%(受限模型约 55%)。把 y 序列当作某资产的日收益近似,做最粗糙的择时——预测为正做多、预测为负空仓:日均收益从买入持有的 0.096 提升到 0.510,5 倍差距。

样本外预测对比:非线性通道只有 NN 能吃到

当然这是合成数据的演示,真实意义在于方法论:如果 x → y 的传导是非线性的,那么”发现因果”和”利用因果”必须用同一类非线性模型。用 NN 检验发现因果、再回头用线性模型做信号,等于把刚找到的通道又扔掉了。

六、已知偏差与诚实说明#

偏差 1:合成传导强度远超真实市场。 本例信号噪声比约 1:1,真实跨资产非线性传导的信号占比通常不到 5%。功效会随之暴跌:同样的流程,改善幅度可能只有 2~3%,需要更多置换次数(500+)和多窗口稳健性检查才能下结论。

偏差 2:波动聚集是头号混淆因子。 真实收益序列自带 GARCH 效应。如果 y 自己的波动聚集没被受限模型建模(我们的 MLP 只吃了 2 阶滞后的水平值),x 的滞后可能只是代理了”市场整体波动状态”,检验会把共同波动误判为因果。实务上必须先对两条序列做 GARCH 过滤,用标准化残差跑检验,或者把 y 的滞后平方项加进受限模型。

偏差 3:置换检验的计算成本。 线性 F 检验毫秒级;30 次置换重训 MLP 花了百倍时间,扫描 50 个候选变量对就是 1500 次训练。变量海选场景下要先用快速筛(如基于距离相关系数)缩小范围,再对入围者跑置换。

偏差 4:滞后截断。 我们固定 p=2 且真实传导恰好在 lag 1。真实场景传导延迟未知,p 选小漏检、选大稀释功效,NN 框架下没有 AIC 这类现成准则,只能靠样本外验证选 p——这又消耗一层数据。

七、结果解读与使用边界#

“相关为零”永远不等于”没有关系”。 这是本文最想钉死的一点:线性相关、线性 Granger、线性回归系数,检验的都是关系的线性投影。投影为零时,关系本身可以强到把 MSE 砍一半。看到”x 与 y 不相关”的研究结论,第一反应应该是问”检查过非线性了吗”,而不是接受”无关”。

NN 改善显著 ≠ 找到了机制。 置换检验只能确认”x 的历史里有 y 的可预测信息”,不能告诉你传导函数长什么样、会不会漂移。想看形状,用部分依赖图或对 xt1x_{t-1} 做一维扫描(本例扫出来就是 U 形);想确认稳定性,分年度重跑——非线性关系比线性关系更容易在 regime 切换时死掉。

因果显著 ≠ 可交易。 74.2% 的方向准确率在零成本合成世界里点石成金;真实市场里预测的是日频收益,扣掉成本后 52% 的准确率都未必赚钱。从”检验显著”到”策略上线”中间还隔着:传导延迟是否稳定、信号衰减速度、容量与成本。检验是研究的起点,不是策略的终点。

什么时候用它:怀疑波动传导(VIX→个股、汇率→出口板块、商品→下游)、怀疑阈值效应(只有大冲击才传染)、线性检验说”无关”但散点图有形状。什么时候别用:样本少于 500(NN 过拟合会淹没一切)、没做平稳性处理(非平稳序列的伪因果比伪回归更隐蔽)、以及最重要的——没有先验假设纯粹海选变量对(置换检验挡不住多重比较的假发现,300 对变量总有几对”显著”)。

与上一篇 Johansen 协整检验合起来看:协整处理的是水平序列的长期线性均衡,非线性 Granger 处理的是差分序列的短期非线性传导——前者告诉你价差会回归,后者告诉你冲击怎么传播。两个工具覆盖的是时间序列关系谱系的两端,中间地带(非线性协整、门限误差修正)留给后续文章。

非线性 Granger 因果:用神经网络把『谁预测谁』的单向箭头放宽
https://blog.halo26812.eu.org/blog/nonlinear-granger-causality
Author halo
Published at 2026年7月24日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨