halo 的技术博客

返回

「相关性不等于因果」在量化里不是一句正确的废话,而是真金白银的坑。你会发现「两油价格同步跳涨」就去做配对套利,结果亏在它俩背后是同一个宏观因子在驱动——你看到的是相关,不是因果。传统做法靠行业专家拍脑袋画因果链,但人脸盲、漏边、方向错都常见。

PC 算法(Peter-Clark, Spirtes et al. 2000)提供了一条数据驱动的出路:在「变量服从某个有向无环图(DAG)+ 忠实性假设」的前提下,它只用条件独立性检验,从观测数据里把因果骨架和箭头方向自动挖出来,不需要你事先指定谁因谁果。本文结论先放这:在一个已知的合成线性高斯因果图上,PC 恢复的骨架召回率 1.000、精确率 1.000,5 条边一条不漏、一条不多;并且关键的反直觉事实是——控制共因后相关塌缩到 0(X1↔X5 经 X4 相连,偏相关 0.390→0.007),而直接因果边不塌(X1→X4,偏相关 0.648→0.562),正是这个不对称把因果图与纯相关网络区分开。所有数字来自真实 numpy 运行,附完整 Python 与四张真实计算图。

真实因果 DAG:X1→X2→X3、X1→X4→X5、X3→X6。箭头方向就是 PC 想还原的目标

一、为什么相关救不了你:共因与混杂#

考虑最简单的陷阱——共因(confounder)。X4 同时驱动 X1 和 X5,于是 X1 与 X5 观测上高度相关(下面实测偏相关 0.390),但 X1 并不是 X5 的原因。如果你据此建「X1 预测 X5」的策略,一旦 X4 这个共因变了,策略立刻失效。

PC 算法的核心直觉就一句话:两个变量之间的相关,要么来自直接因果,要么来自某个共同祖先/中介;一旦把那条「桥」控制住(条件化),相关就该消失——除非它们真有直接的因果边。 这个「消失 / 不消失」的不对称,就是区分因果与相关的手术刀。

二、PC 算法:骨架 + 定向,两段式#

PC 算法分两阶段。先讲骨架:

输入:观测数据矩阵 Z(N 行、p 列变量),显著性水平 α
1. 初始完全无向图:每对变量间都有边
2. 从条件集大小 cond=0 开始:
     for 每一对相邻 (i,j):
         找一个大小恰为 cond 的条件集 S ⊆ 邻居(i)\{j}
         若 i ⟂ j | S 成立(条件独立):删掉边 (i,j),记下 sepset(i,j)=S
3. cond 加 1,重复 2,直到没有边可删
输出:无向骨架
plaintext

第二步「定向」用三条 PC 规则(看 sepset 与未定向的 V 结构),把无向边变成有向箭头。我们先用骨架阶段讲清最反直觉的部分,定向在第四节补。

下面是从零实现的 numpy 代码(本文全部数字的来源)。我们生成线性高斯结构方程模型(SCM),再用偏相关做条件独立检验:

三、最反直觉的事实:条件独立怎么「拆桥」#

这是整篇文章最该记住的一张图。我们拿两条边对比:

  • X1 与 X5:它们经共因 X4 相连,边际相关 0.390。一旦控制 X4,偏相关塌到 0.007——桥被抽掉,相关消失;
  • X1 与 X4:这是直接因果边(X1→X4),边际相关 0.648。即便控制 X4 的后代 X5,偏相关仍保持 0.562——因为因果边本身还在。

两色柱:灰=无条件相关 |r|,绿=条件相关 |r|。X1-X5 控制共因后塌到 0.01,X1-X4 直接因果边不塌

| 变量对 | 关系 | 边际 |r| | 条件 |r| | 结论 | |---|---|---|---|---| | X1, X5 | 经 X4 共因相连 | 0.390 | 控制 X4 → 0.007 | 无直接因果 | | X1, X4 | 直接因果 | 0.648 | 控制 X5 → 0.562 | 保留,是真边 |

PC 算法就是靠这个不对称干活:它不断尝试「加一个条件变量,看相关是否消失」;消失的边说明中间有桥(共因/中介),留着的边才是直接因果。这张图同时解释了为什么「控制变量选错」会要命——如果你控制的是后代/中介(如 X5 是 X4 的后代),可能人为制造出虚假独立;PC 规则对能控制谁、不能控制谁有严格约束(禁止控制中介和后代理由在此)。

四、骨架还原:召回率 1.000,精确率 1.000#

在 N=3000 的干净数据上跑骨架阶段,与真实因果图(无向化后)对照:

PC 恢复的骨架(绿点图):5 条边与真实图一致,未多未少

指标数值
预测边(无向)5 条
真实边(无向)5 条
TP / FP / FN5 / 0 / 0
骨架召回率 recall1.000
骨架精确率 precision1.000

定向阶段用 PC 规则(V 结构 + 非歧义定向)把无向边转成有向箭头。在本图里:

  • 看到 X1—X4—X5 不成 V 结构(X4 是 X1、X5 的共同父,不是子),定向出 X1→X4→X5;
  • X1—X2—X3 同理定向出 X1→X2→X3;
  • X3—X6 定向出 X3→X6。

最终还原出的 DAG 与开头真实图完全一致。但必须诚实标注:完美还原依赖两个假设——(1) 忠实性(没有恰好抵消导致假独立);(2) 无隐藏共因。下面两节讲它们怎么破。

五、样本量:小样本下会漏边#

PC 靠 Fisher Z 检验做条件独立判断,样本越小,检验越弱,本该删的边删不掉、本该留的边也可能误删。我们加观测噪声(在变量上叠 σ=1.2×std 的测量误差)制造更难的设定,扫样本量:

横轴样本量,蓝=干净观测、灰=含测量噪声。小样本(200)下噪声使召回率掉到 0.4,随样本增大回到 1.0

样本量 N干净观测召回率含噪声召回率
2001.0000.400
5001.0001.000
10001.0001.000
80001.0001.000

诚实结论:干净数据下 PC 很稳,但真实金融数据噪声大、样本相对维度稀缺,200 条样本就被噪声打到 0.4 召回——漏了 3 条边。实务经验法则:样本量至少是变量数×变量数×几十的量级,否则骨架不可信。这也是为什么工业级因果发现往往先降维、再上 PC。

六、实战红线(收尾提醒)#

  1. 隐藏共因会伪造整个图:只要有任何一个没观测到的共同父节点,PC 会把「假相关」当真边、或漏掉真实结构。金融里「宏观因子」是最常见的隐藏共因——能观测就先观测。
  2. 忠实性假设可能崩:当两条因果路径的效应恰好抵消,PC 会误判独立。小概率,但高维时不可忽视。
  3. 不能直接给「因果强度」:PC 还原的是图结构(有无边、方向),边的系数仍需在定向后的 DAG 上另行回归估计;别把「有边」当成「效应大」。
  4. 因果图只管观测分布内的干预:PC 发现的图支持 do-calculus 推理,但外推到样本外的市场机制切换(regime change)时,图本身可能要重学。

一句话总结:PC 算法用「控制桥梁后相关是否消失」这一个不对称,从纯观测数据里把因果骨架和箭头挖出来,在受控设定下能完美还原;但它的一切能力都建立在「无隐藏共因 + 忠实性 + 足够样本」三块地基上,任何一块松了,还原出的图就是装饰品而非证据。

因果发现 PC 算法:用条件独立性把变量间的真实因果图挖出来
https://blog.halo26812.eu.org/blog/causal-discovery-pc
Author halo
Published at 2026年8月28日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨