摘要:本文贝叶斯思维遇上因果关系:粒子物理学启发下的 Python 实践作者结合粒子物理学背景,探讨了如何利用贝叶斯思维与因果推断解决金融分析中的“相关性陷阱”。文章通过一个 Python 案例,对比了单纯的贝叶斯回归与引入因果图(DAG)后的调整模型,展示了在存在混杂变量(如公司规模)时,因果推断如何帮助还原真实的 ESG 评分对股票回报的影响。这种方法不仅适用于金融分析,也为所有需要从观察数据中推断因果关系的领域提供了有力的工具。

在粒子物理学的职业生涯中,我花费了数年时间与不可见的事物打交道。

不是科幻小说,而是指我们从未直接看到的不可见事物。暗物质粒子、不可见的希格斯衰变——它们只在探测器中留下了微弱的痕迹。为了理解这些痕迹,我们使用了贝叶斯似然(Bayesian likelihoods)。

这个工作流程在精神上很简单,即便在执行上并非如此:

  1. 想象可能的世界。
  2. 询问在给定数据的情况下,每个世界的可能性有多大。
  3. 随着新证据的到来更新你的信念。

回首往事,我意识到这种贝叶斯思维是我通向因果推断的第一步。当时我们并没有问“什么导致了什么?”我们在问“哪些隐藏参数可能生成了这些数据?”但这已经是一个原初的因果问题。

在今天的金融领域,情况类似。分析师被数据淹没——ESG 评分、股票回报、信用利差——但真正的挑战是找出驱动因素,而不仅仅是模式。这正是贝叶斯推断与因果关系结合的地方。

在这篇文章中,我将展示贝叶斯推断如何为因果思维奠定基础。我们将从一个简单的 Python 示例开始——模拟金融数据的贝叶斯回归——然后为因果建模搭建舞台。

1、贝叶斯快速回顾

贝叶斯定理是一个在不确定性下进行推理的紧凑公式:

  • P(θ) 是 先验(prior):在看到数据之前你对参数的信念。
  • P(D∣θ) 是 似然(likelihood):如果该参数为真,看到你的数据的概率。
  • P(θ∣D) 是 后验(posterior):给定数据后你对参数的更新信念。

这是贝叶斯物理学的家常便饭。它在金融中也同样有用。

让我们模拟一个玩具数据集:假设股票回报受两个因素影响——收入增长和 ESG 评分。我们将生成一些数据,然后运行贝叶斯回归来推断系数。

import numpy as np
import pandas as pd
import pymc as pm
import arviz as az


np.random.seed(42)
n = 200
revenue_growth = np.random.normal(0.05, 0.02, n)   
esg_score = np.random.normal(50, 10, n) / 100      
noise = np.random.normal(0, 0.02, n)

returns = 0.5 * revenue_growth + 0.3 * esg_score + noise
data = pd.DataFrame({
    "returns": returns,
    "revenue_growth": revenue_growth,
    "esg_score": esg_score
})


with pm.Model() as model:
    alpha = pm.Normal("alpha", mu=0, sigma=1)
    beta_rev = pm.Normal("beta_rev", mu=0, sigma=1)
    beta_esg = pm.Normal("beta_esg", mu=0, sigma=1)
    sigma = pm.HalfNormal("sigma", sigma=0.1)
    mu = alpha + beta_rev * data["revenue_growth"] + beta_esg * data["esg_score"]
    returns_obs = pm.Normal("returns_obs", mu=mu, sigma=sigma, observed=data["returns"])
    trace = pm.sample(2000, tune=1000, target_accept=0.9)


az.summary(trace, var_names=["alpha", "beta_rev", "beta_esg"])

输出(摘要):

Parameter   | Mean      | SD       | hdi_3%   | hdi_97%

alpha       | 0.00      | 0.01     | -0.02    | 0.02
beta_rev    | 0.49      | 0.04     | 0.41     | 0.57
beta_esg    | 0.28      | 0.05     |0.18      | 0.37

我们的贝叶斯模型成功恢复了隐藏参数(真实值是 0.5 和 0.3)。它给我们的不是单一的“最佳猜测”,而是后验分布——不确定性的全貌。

这已经比点估计回归更强大了。但这也是通向因果关系的垫脚石。因为更深层的问题不仅仅是“什么参数最拟合数据”——而是“如果我们进行干预会发生什么?”

2、从贝叶斯推断到因果推断

贝叶斯推断很强大。它告诉我们,给定观察到的数据,不同参数值的可能性有多大。但请注意:它并不回答“如果我们进行干预会发生什么”。

这种区别是贝叶斯统计跨越到因果关系的核心。

  • 贝叶斯推断: 给定数据,不同参数值的可能性有多大?
  • 因果推断: 如果我改变这个变量——碳税、ESG 评分、治理实践——结果会发生什么?

换句话说:相关性与干预。

2.1 作为结构化贝叶斯主义的因果关系

因果推断可以被视为贝叶斯推理的结构化扩展。在贝叶斯物理学中,我们的“先验”是对宇宙底层参数的信念。在因果推断中,先验采取了变量间关系假设的形式——通常可视化为有向无环图(DAG)。

例如,想象我们要研究 ESG 评分对股票回报的影响。我们可能会画这样一个 DAG:

因果有向无环图 (DAG)

在这里,ESG 评分可能直接影响回报,但也与公司规模和收入增长相关。如果我们只运行贝叶斯回归而不承认这些关系,我们就有可能将实际上由公司规模解释的影响归因于 ESG。

2.2 进入干预:反事实问题

在因果推断中,我们问反事实问题:“如果在其他一切保持不变的情况下,一家公司的 ESG 评分不同,它的回报会是多少?”

这用 Judea Pearl 框架中的“do 算子”形式化:

那个小小的“do”造成了所有的不同。它将我们从被动观察转变为主动干预。

2.3 在 Python 中从贝叶斯到因果关系

幸运的是,Python 有帮助操作这种转变的包。

  • PyMC(我们在上面用过的)非常适合贝叶斯推断。
  • DoWhy 和 EconML 专为因果推断设计:它们让你指定假设(通常通过 DAG),然后估计因果效应。

让我们勾勒一下如何使用 DoWhy 将我们的贝叶斯回归扩展为因果分析。

import dowhy
from dowhy import CausalModel


model = CausalModel(
    data=data,
    treatment="esg_score",
    outcome="returns",
    common_causes=["revenue_growth"],  
)

identified_estimand = model.identify_effect()

estimate = model.estimate_effect(
    identified_estimand,
    method_name="backdoor.linear_regression",
)
print(estimate)

这个例子很简单——我们只针对作为混杂因素的收入增长进行了调整——但工作流程说明了关键点:贝叶斯给我们后验;因果关系增加了干预。

2.4 桥接回物理学

当我回顾我的粒子物理工作时,我清楚地看到了联系。我们的贝叶斯似然是一种衡量探测器痕迹可能原因的方法。我们没叫它因果关系,但它就是:试图推断数据背后的隐藏驱动因素。

今天的金融面临同样的挑战。从贝叶斯推断到因果推断的飞跃,是从描述世界到改变它、测试它、干预它的飞跃。

3、案例研究——当相关性误导时

为了使其具体化,让我们模拟一个小型的金融世界。想象股票回报取决于两个真正的驱动因素:收入增长和 ESG 评分。在我们的玩具模型中,真实关系看起来像这样:

转折点在于,收入增长和 ESG 评分本身都受一个隐藏因素的影响:公司规模。大公司倾向于报告更强的收入增长和更好的 ESG 评分。

这造成了一个混杂问题:公司规模开启了 ESG 评分和回报之间的后门路径。除非我们对其进行调整,否则朴素回归将夸大 ESG 的影响。

3.1 第一步:可视化因果结构

这是数据生成过程的简单 DAG:

  • 公司规模 → 收入增长 → 回报
  • 公司规模 → ESG 评分 → 回报

这是一个经典的例子:ESG 评分看起来与回报相关,但那个“信号”的一部分实际上属于公司规模。

3.2 第二步:相关性暗示了什么

如果我们停留在相关性上,我们会看到全面的强关联:

相关性矩阵

回报与收入增长和 ESG 评分都呈正相关。乍一看,这似乎证实了“更高 ESG 意味着更高回报”的故事。但相关性并不揭示隐藏结构。

3.3 第三步:朴素回归 vs 调整后回归

为了测试差异,让我们比较两个回归:

  1. 朴素: Returns ~ ESG score only
  2. 调整后: Returns ~ ESG score + revenue growth + firm size

在 Python 中(为清晰起见使用闭式 OLS):


Xn = np.column_stack([np.ones(n), data[”esg_score”].values])
beta_naive = np.linalg.inv(Xn.T @ Xn) @ (Xn.T @ data[”returns”].values)


Xa = np.column_stack([
    np.ones(n),
    data["esg_score"].values,
    data["revenue_growth"].values,
    data["firm_size"].values
])
beta_adj = np.linalg.inv(Xa.T @ Xa) @ (Xa.T @ data["returns"].values)

结果:

  • ESG 的朴素系数:~0.61
  • ESG 的调整后系数:~0.32

作为参考,我们模拟中的真实 ESG 效应是 0.30。

这是一个并排视图:

朴素 vs 调整后的 ESG 系数

朴素模型将表面上的 ESG 效应夸大了一倍以上。只有当我们针对混杂因素进行调整时,估计值才回到其真实值。

3.4 案例研究的启示

这正是因果关系重要的原因。纯粹的贝叶斯回归给你不确定性估计,但如果没有因果结构,它会很高兴地报告对错误问题的“精确”答案。基于相关性的金融面临追逐幻影的风险。

通过显式建模混杂因素——这里通过后门调整——我们恢复了真正的驱动因素。回报是更好的推断、更好的风险管理,最终是更好的决策。

4、给金融的教训

玩具案例研究看起来很简单,但教训直接适用于实践。在真实市场中,数据生成过程比我们的三变量世界复杂得多——但逻辑是一样的。

4.1 相关性是不够的

金融数据集充满了虚假联系。ESG 评分与公司规模、地理位置或行业部门相关。信用利差与宏观周期和流动性相关。没有因果推理,这些纠缠的关系会被误认为是真正的驱动因素。

4.2 贝叶斯思维有价值,但不完整

贝叶斯回归给出了比经典 OLS 更丰富的图景:我们得到的不是单一系数,而是完整的后验分布。我们可以量化不确定性并以此为生。但正如我们的案例研究所示,如果我们不模拟因果结构,单靠贝叶斯推断仍然可能错误归因效应。

4.3 因果关系意味着干预

关键的转变是从描述到干预。我们不问“ESG 和回报之间的相关性是什么?”,而是问“如果我们改变 ESG——保持其他一切不变——回报会发生什么?”那是物理实验的金融等价物:转动旋钮来测试什么真正重要。

4.4 分析师的优势是因果清晰度

采纳这种思维模式的分析师避免了昂贵的假阳性。他们不会为实际上只是公司规模代理的 ESG 因素支付过高价格。他们不会错误定价实际上由更广泛市场周期驱动的风险。相反,他们识别价值创造的真正杠杆。

因果推理不会让世界变得简单——它让世界变得可处理。就像在物理学中,贝叶斯似然帮助衡量不可见的力量,在金融中,因果关系帮助我们从噪音中分离信号,看到塑造回报的隐藏驱动因素。

5、底线:因果关系穿透噪音

当我回顾我在粒子物理学的岁月时,我把贝叶斯推断看作一种训练场。我们没叫它“因果关系”,但它就是:试图将微弱的探测器痕迹与产生它们的隐藏力量联系起来。我们生活在概率中,不断更新我们的信念,总是询问哪些解释真正站得住脚。

今天的金融需要同样的思维模式。ESG 数据、信用利差、可持续性指标——它们和任何对撞机输出一样充满噪音和混杂。如果我们停在相关性上,我们就有追逐海市蜃楼的风险。但如果我们结合贝叶斯推理与因果推断,我们可以超越描述走向干预。我们可以问真正重要的反事实问题:如果这项政策改变会怎样?如果这种风险成为现实会怎样?如果这个因素不同会怎样?

这就是分析师在拥抱因果关系时获得的优势:关于什么实际驱动结果的清晰度。

对我来说,旅程已经画上句号。我用来衡量不可见粒子的相同贝叶斯工具现在帮助我发现金融中的隐藏驱动因素。而因果关系提供了测试它们的框架。它们一起构成了一座桥梁——从物理到金融,从不确定性到行动。

更多推荐