【维克】相关不等于因果:交易中必须警惕的统计谬误

发布时间:2026/7/29 9:21:28
【维克】相关不等于因果:交易中必须警惕的统计谬误 年化20%量化笔记 · 第33篇WHY 为什么看起来有关系经常害你亏钱一个真实的教训2022年我在一个量化圈的技术交流群里看到一个哥们分享了他的重大发现回测了10年数据发现一个超强信号——当印度大豆期货的日涨幅超过2%时第二天A股螺纹钢下跌的概率高达71%p值小于0.01样本量2000统计显著群里一堆人觉得这是alpha准备拿去写策略。我当时问了三个问题1.印度大豆和螺纹钢之间有什么经济学传导链条2.71%的下跌概率实际上下跌了多少是跌0.01%也算跌3.如果你测了100个商品对的这种领先-滞后关系有多少个碰巧能达到这个统计水平三个问题一出来那个哥们的兴奋劲立马就凉了。答案很简单这两个品种之间没有任何因果机制71%的概率很可能只是数据中恰好存在的相关性放到样本外大概率归零。相关性和因果性——被混为一谈的两个东西这是统计学里最基础也最被低估的概念之一。相关性Correlation两个变量同时变化A涨的时候B也涨或B跌。数学上用相关系数衡量范围-1到1。因果性CausationA的变化直接导致了B的变化。A是因B是果有明确的传导机制。核心原则相关性≠因果性。两个变量相关不代表一个导致了另一个。它们可能都受第三个变量影响也可能纯粹是巧合。听起来简单但在量化交易的实际操作中这个坑无处不在——因为你不是在看两个变量你是在几百个因子、几千组数据点里找规律。找到的任何相关性都有极高的概率是假象。交易中最常见的相关≠因果陷阱我整理了这些年见过最典型的几类陷阱类型典型表现真相伪相关当某国央行增持黄金时美股下跌两者都受美元指数和避险情绪驱动互不为因果反向因果交易量大的股票收益更高不是大交易量导致高收益而是高收益预期吸引了大交易量共同原因冰淇淋销量和溺水人数正相关共同原因是夏天——不是冰淇淋导致溺水时间巧合每次超级碗在某个电视台转播股市就涨纯属巧合Super Bowl Indicator经典伪相关案例幸存者偏差导致的相关回测中动量因子在过去10年有效你只看到了过去10年的数据动量因子在2000-2009年连续亏损每一类陷阱的共同特征统计上看起来都对但缺乏因果机制放到样本外就失效。为什么这个问题特别危险因为人类大脑天生就是因果机器——看到一个模式就自动编一个故事来解释它。美联储加息导致新兴市场资金外流——这个有因果链条是合理的。当X指标金叉时Y品种上涨——这个呢你能说出因果机制吗如果你说不清楚为什么只有统计数字在撑着那这个信号大概率是噪声。量化交易最贵的学费不是交在错误的策略上而是交在统计上对但因果上错的策略上。因为前者你亏几次就发现了后者你可能跑了一年模拟盘才发现——那时候真金白银已经进去了。HOW 如何区分真因果和伪相关——一套可操作的判断框架方法一因果链条检验——能不能说出故事这是最朴素也最有效的第一步筛选对于你发现的每一个信号→结果关系用一句话写清楚因果传导链条。如果写不出来或者链条超过3个环节大概率是伪相关。举个例子有效因果链•信号美联储降息 → 结果新兴市场货币升值 → 传导利率差缩小→资金回流新兴市场→本币需求增加→汇率升值。3个环节每一环都有经济学支撑。✅伪相关•信号某商品期货的库存上升 → 结果另一国股指上涨。传导写不出来。❌实操建议在你的因子库或信号列表里对每个信号做一个因果链写作测试——强制自己用不超过100个字解释为什么这个信号能预测那个结果。写不出来的直接降优先级或淘汰。方法二反事实验证——如果A不发生B还会发生吗这是因果推断的核心思维实验假设信号没有发生结果还会按同样的规律出现吗如果答案是会那你的信号就不是因果因素只是一个伴随现象。案例你发现当北向资金单日净流入超过100亿时第二天沪深300上涨的概率是65%。反事实验证•如果某一天北向资金净流入恰好是0沪深300第二天上涨的概率是多少•如果北向资金净流出50亿沪深300第二天上涨的概率又是多少如果这些情况下上涨概率也是60-65%那北向资金流入根本不是原因——它只是和某个真正的原因比如全球risk-on情绪同时出现了而已。实操方式// pythonimport pandas as pdimport numpy as np# 假设你有信号和结果的数据# signal: 1信号触发, 0信号未触发# outcome: 1结果发生, 0结果未发生# 条件概率P(结果|信号)p_outcome_given_signal df[df[signal]1][outcome].mean()# 反事实概率P(结果|无信号)p_outcome_no_signal df[df[signal]0][outcome].mean()# 因果效应 条件概率 - 反事实概率causal_effect p_outcome_given_signal - p_outcome_no_signalprint(f信号触发时结果概率: {p_outcome_given_signal:.2%})print(f信号未触发时结果概率: {p_outcome_no_signal:.2%})print(f因果效应: {causal_effect:.2%})# 如果因果效应接近0信号大概率是伪相关核心判断标准如果因果效应条件概率差值小于5个百分点这个信号的预测力可能只是统计噪声。方法三格兰杰因果检验——统计层面的因果方向判断格兰杰因果检验Granger Causality Test是计量经济学中判断因果方向的经典方法如果X的过去值能显著提高对Y的预测精度在控制了Y自身过去值之后则称X格兰杰导致Y。注意格兰杰因果≠真正的因果。它只说明X的时间序列包含对Y有用的信息但不能排除第三方变量的干扰。不过它比简单的相关性分析强——至少能判断时间先后方向。// pythonfrom statsmodels.tsa.stattools import grangercausalitytests# 检验X是否格兰杰导致Y# data的两列第一列是Y第二列是Xdata df[[outcome, signal]].dropna()# 最多检验5阶滞后results grangercausalitytests(data, maxlag5, verboseTrue)# 查看各阶滞后的F检验p值for lag in range(1, 6):f_stat results[lag][0][ssr_ftest][0]p_value results[lag][0][ssr_ftest][1]print(f滞后{lag}期: F{f_stat:.4f}, p{p_value:.4f})if p_value 0.05:print(f → 滞后{lag}期时X格兰杰导致Y)注意事项•格兰杰因果只说明时间上有预测关系不保证真实因果•两个变量可能都受第三个变量驱动混淆变量格兰杰检验无法处理•必须配合方法一因果链条检验一起使用方法四工具变量法IV——用外部冲击分离因果当你怀疑信号X和结果Y之间有伪相关问题可能存在混淆变量但又不想放弃这个信号时可以试试工具变量法。核心思路1.找到一个工具变量Z满足两个条件◦Z影响X相关性条件◦Z只能通过X影响Y不能通过其他路径影响Y排他性条件2.用Z对X的外生冲击部分来估计X对Y的因果效应量化交易中的例子假设你发现分析师覆盖数量多的股票未来收益更高。但这个相关性可能是假的——大公司被覆盖多同时大公司基本面更好。工具变量可以是分析师所在券商的研报产能波动——这个变量影响某只股票是否被覆盖分析师忙不过来时少覆盖但不直接影响股票的后续收益排他性近似成立。// pythonimport statsmodels.api as smfrom statsmodels.sandbox.regression.gmm import IV2SLS# 第一阶段用工具变量Z预测内生变量X# 第二阶段用X的预测值预测Yfrom linearmodels.iv import IV2SLS# 模型Y β0 β1*X ε# 工具变量Zmod IV2SLS(df[Y], sm.add_constant(df[X]),instrumentssm.add_constant(df[Z]))res mod.fit()print(res.summary)实操门槛较高适合有一定计量经济学基础的交易者。初学者先用前三个方法即可。我的实操框架四步因果检验流程实际工作中我评估一个新信号时会按以下顺序检验第一步因果链写作测试30秒├── 能否用100字以内说清楚为什么这个信号能预测结果├── 因果链条是否超过3个环节└── 通过 → 进入第二步 | 不通过 → 降级为待验证第二步反事实概率对比5分钟├── 计算P(结果|信号触发)和P(结果|信号未触发)├── 因果效应差值是否 5个百分点└── 通过 → 进入第三步 | 不通过 → 标记为弱信号第三步时间方向检验10分钟├── 做格兰杰因果检验确认时间先后方向├── p值是否显著方向是否符合预期└── 通过 → 进入第四步 | 不通过 → 标记为方向存疑第四步样本外 跨市场验证├── 在样本外数据上信号的预测力是否依然存在├── 在另一个市场/品种/时间窗口上是否可复现└── 通过 → 可进入策略开发 | 不通过 → 大概率伪相关放弃核心原则如果一个信号过不了前三步就不值得花时间做第四步。大部分伪相关在前两步就会被淘汰。WHAT 你带走的三个认知和一份筛选工具1. 统计显著只是入场券因果可解释才是通行证p0.05不代表策略有效相关系数0.7不代表有因果关系。在几百个因子、几千组数据点里你一定能找到大量统计上显著的伪相关。真正值得下注的信号必须同时满足统计显著和因果可解释两个条件。2. 人类大脑是因果偏见的放大器你会不自觉地为任何相关性编一个因果故事。可能是因为……也许是因为……——这些不是因果推理这是合理化偏见。必须用结构化的检验流程来对抗这种本能。3. 伪相关的代价是真实的一个伪相关信号上线实盘不会立刻暴露——它可能在前几个月表现正常因为市场偶然配合然后在你加大仓位后突然失效。到那时候亏损已经造成了。在策略开发阶段多花1小时做因果检验比在实盘阶段亏10万学费要划算得多。☐立即从你当前的信号/因子库中随机抽取3个信号做因果链写作测试——用100字以内写清楚每个信号的因果传导机制。写不出来的标记为待验证☐本周对标记为待验证的信号计算条件概率P(结果|信号)和反事实概率P(结果|无信号)看因果效应是否5个百分点。低于5%的信号降优先级☐本月在因子筛选流程中嵌入四步因果检验——每个新信号必须通过因果链测试反事实验证格兰杰检验样本外验证才能进入策略开发环节☐长期习惯为每个上线的信号维护一份因果档案——记录因果链条、检验结果、可能的混淆变量定期复盘信号的因果逻辑是否依然成立一句话总结市场里最贵的三个字不是我亏了而是我以为。相关性告诉你两件事同时发生因果性告诉你为什么。没有为什么的信号只是你还没发现的巧合。年化20%量化笔记 · 第33篇 · 维克下一篇线性回归入门用一条线预测未来