非线性 Granger 因果:用神经网络把『谁预测谁』的单向箭头放宽
线性 Granger 因果检验只问一个问题:x 的滞后项能否线性地改善对 y 的预测。但如果 x 通过 x² 驱动 y——波动传导、恐慌放大这类金融常见机制——线性 F 检验会完全漏检。合成实验实测:y 被 0.6·x²(t-1) 强驱动,线性 F 统计量只有 0.17(临界值 3.0),检验结论『无因果』;换成 16 隐单元的小 MLP,加入 x 滞后让样本外 MSE 从 2.72 降到 1.35(改善 50.5%),而线性回归加同样的 x 滞后只改善 1%。显著性用置换检验解决:打乱 x 滞后重训 30 次,最大伪改善仅 3.9%,真实改善 50.5% 的 p 值 < 0.033。方向准确率 74.2%,简单择时把日均收益从 0.10 抬到 0.51。诚实说明:NN Granger 的检验功效换来了解释性损失;置换检验计算量是线性检验的百倍;非线性因果在真实数据中远比合成数据微弱,且极易与波动聚集混淆。拆穿『相关为零=无关系』『NN 改善=真因果』『因果=可交易』等误区(中高阶)。
先说结论:Granger 因果的定义本身没有”线性”两个字——它只问”用了 x 的历史之后,对 y 的预测是否变好”。但教科书的 F 检验把”预测”偷偷限定成了”线性回归预测”。这一限定在金融里是致命的:波动传导(x 的大幅波动引发 y 的波动,与方向无关)、恐慌放大(只有暴跌才传染)、阈值效应(小扰动无传导、大冲击才传导)全都是非线性通道,线性检验一律漏检。 合成实验实测:y 被 强驱动(信号方差与噪声相当),线性 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 检验在检验什么#
标准流程:比较两个回归的残差平方和。
受限模型(只用 y 自己的历史):
无约束模型(加入 x 的历史):
F 统计量 检验 。拒绝原假设 → “x Granger 导致 y”。
注意这里检验的实质是:x 的滞后与 y 之间的线性投影系数是否为零。如果真实传导函数是偶函数——比如 依赖 ——那么 (对称分布下三阶矩为零),线性投影系数在总体意义上就是零。不是样本量不够、不是噪声太大,是这个检验在数学上注定看不见偶函数通道。
二、构造一个线性检验必然漏检的系统#
x 是普通 AR(1);y 被 x 前一天的平方驱动(减去 保持零均值)。传导强度不小: 项的方差与噪声 的方差同量级。这个结构对应金融里最常见的机制——x 的波动大小(而非方向)驱动 y:想想 VIX 飙升对小盘股流动性的冲击,或者汇率剧烈波动(无论贬值还是升值)对出口企业股价的压制。
散点图上 对 呈清晰的 U 形,但线性相关系数约为 0。T=1500,滞后阶 p=2:
线性 F 检验:F = 0.17,5% 临界值约 3.0,不能拒绝”无因果”。 多种子重复实验(信号无线性分量时)拒绝率约 20%——比 5% 的名义水平高一点(有限样本里 与 x 有微弱样本相关),但检验功效低到接近瞎猜。一个被强因果驱动的系统,线性检验八成情况下宣布”无关”。
三、神经网络 Granger:换掉预测器,保留框架#
Granger 因果的比较框架不动,把线性回归换成能拟合任意光滑函数的预测器:
受限模型:MLP 只吃 ;无约束模型:MLP 吃 。两个模型同架构(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.694 | 1.0% |
| MLP 无约束 | y + x 滞后 | 1.346 | 50.5% |
线性模型拿到同样的 x 滞后,几乎什么都吃不到(1%的改善纯属噪声);MLP 把 MSE 砍掉一半。差距就是非线性通道的贡献——MLP 学会了 U 形传导函数,线性模型在数学上学不会。

四、显著性怎么办:置换检验#
NN 版 Granger 没有现成的 F 分布可查——MSE 改善多大算显著?靠置换检验构造零分布:
- 把 x 滞后列整体随机打乱(破坏 x 与 y 的时间对齐,但保留 x 的边际分布);
- 用打乱后的特征重训无约束 MLP,记录”伪改善”;
- 重复 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 倍差距。

当然这是合成数据的演示,真实意义在于方法论:如果 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 的可预测信息”,不能告诉你传导函数长什么样、会不会漂移。想看形状,用部分依赖图或对 做一维扫描(本例扫出来就是 U 形);想确认稳定性,分年度重跑——非线性关系比线性关系更容易在 regime 切换时死掉。
因果显著 ≠ 可交易。 74.2% 的方向准确率在零成本合成世界里点石成金;真实市场里预测的是日频收益,扣掉成本后 52% 的准确率都未必赚钱。从”检验显著”到”策略上线”中间还隔着:传导延迟是否稳定、信号衰减速度、容量与成本。检验是研究的起点,不是策略的终点。
什么时候用它:怀疑波动传导(VIX→个股、汇率→出口板块、商品→下游)、怀疑阈值效应(只有大冲击才传染)、线性检验说”无关”但散点图有形状。什么时候别用:样本少于 500(NN 过拟合会淹没一切)、没做平稳性处理(非平稳序列的伪因果比伪回归更隐蔽)、以及最重要的——没有先验假设纯粹海选变量对(置换检验挡不住多重比较的假发现,300 对变量总有几对”显著”)。
与上一篇 Johansen 协整检验合起来看:协整处理的是水平序列的长期线性均衡,非线性 Granger 处理的是差分序列的短期非线性传导——前者告诉你价差会回归,后者告诉你冲击怎么传播。两个工具覆盖的是时间序列关系谱系的两端,中间地带(非线性协整、门限误差修正)留给后续文章。