4. 贝叶斯视角下的线性回归:模型假设、先验分布、似然函数与后验分布
各位同学,欢迎来到第四章。前面几章我们聊了频率学派下的因子模型,用最小二乘法估计参数。说实话,那种方法在样本量足够大时挺好用的。但做量化这些年,我越来越觉得——市场数据哪有那么听话?
你想想看,A股市场才多少年历史?你拿到的收益率数据,满打满算也就几千个交易日。更别提那些小市值因子,有效样本量可能更少。这时候,贝叶斯方法就派上用场了。
这一章,我们彻底切换到贝叶斯视角。我会带着你,把线性回归的每个环节重新拆解一遍。从模型假设开始,到先验分布、似然函数,最后到后验分布。嗯,这是整个贝叶斯因子模型的地基。
核心思想一句话:贝叶斯线性回归不是抛弃了传统回归,而是在其基础上加入了「先验知识」这个维度。说白了,就是用你已有的经验,去约束那些不靠谱的估计。
4.1 模型假设:还是那个线性模型,但视角变了
先看模型本身。其实数学形式没变:
y = Xβ + ε, ε ~ N(0, σ²I)
y 是 N×1 的收益率向量,X 是 N×K 的因子暴露矩阵,β 是 K×1 的因子收益率向量,ε 是误差项。
但频率学派和贝叶斯学派对「参数」的理解完全不同。
- 频率学派:β 是一个固定的未知常数。你只能通过数据去估计它。
- 贝叶斯学派:β 是一个随机变量。它有自己的概率分布。
我刚开始学贝叶斯时,这个转变让我别扭了好一阵子。参数怎么可能是随机的?后来做多了实盘回测才明白——在量化里,因子收益率本身就是个随机过程。你今天估计出来的 β,明天可能就变了。承认它的不确定性,反而更贴近现实。
所以,贝叶斯视角下的模型假设,除了常规的线性关系、误差正态性、同方差性之外,还多了一条:参数 β 服从某个先验分布。
我的经验:在因子模型中,我通常假设误差项方差 σ² 也服从逆伽马分布。这样整个模型就变成了一个共轭先验结构,后验分布有解析解,计算起来非常快。
4.2 先验分布:你凭什么「先入为主」?
先验分布,说白了就是你在看到数据之前,对参数已有的判断。
你可能会问:我凭什么对因子收益率有先验判断?
举个例子。你在做市值因子(SMB)的回归。根据过去十年的研究,小盘股相对于大盘股的超额收益大概在年化 3%-5% 之间。那你就可以把这个信息编码进先验分布里。
常见的先验设定方式有两种:
- 无信息先验:如果你对某个因子完全没把握,就用一个方差很大的正态分布。比如 β ~ N(0, 1000²)。这相当于告诉模型:「我啥也不知道,全靠数据说话。」
- 信息先验:如果你有历史经验或理论依据,就用一个均值不为零、方差较小的分布。比如 β ~ N(0.04, 0.01²)。这表示:「我比较确定这个因子年化收益在 4% 左右,波动不大。」
我个人习惯在因子模型里用信息先验。尤其是对那些已经被大量文献验证过的因子(如动量、价值),我会给一个相对紧的先验。而对于那些新挖掘的「奇葩因子」,我会用无信息先验,让数据自己说话。
避坑指南:我曾经在一个多因子模型里,对某个因子用了过于自信的先验(均值设得太高、方差设得太小)。结果后验估计完全被先验绑架了,数据再怎么拉都拉不回来。记住:先验是你的「建议」,不是「命令」。
数学上,我们通常假设:
β ~ N(μ₀, Σ₀)
σ² ~ Inv-Gamma(a₀, b₀)
其中 μ₀ 是 K×1 的先验均值向量,Σ₀ 是 K×K 的先验协方差矩阵。a₀ 和 b₀ 是逆伽马分布的形状参数和尺度参数。
4.3 似然函数:数据怎么说?
似然函数,就是给定参数 β 和 σ² 下,观测到数据 y 的概率。
根据模型假设 y = Xβ + ε,且 ε ~ N(0, σ²I),那么 y 的条件分布就是:
y | β, σ² ~ N(Xβ, σ²I)
所以似然函数为:
p(y | β, σ²) = (2πσ²)^(-N/2) * exp[ - (y - Xβ)ᵀ(y - Xβ) / (2σ²) ]
这个公式你看着眼熟吧?和频率学派里的似然函数一模一样。区别在于——频率学派把 β 当常数,最大化这个函数去求 β 的估计值。而贝叶斯学派把它当成「更新先验」的工具。
你想想看,似然函数越大,说明当前这组参数 β 和 σ² 越能解释观测到的数据。贝叶斯公式就是把这个信息,和先验信息结合起来。
4.4 后验分布:先验与数据的「联姻」
终于到了最核心的部分。后验分布,就是贝叶斯定理的产物:
p(β, σ² | y) ∝ p(y | β, σ²) × p(β, σ²)
翻译成人话:后验 ∝ 似然 × 先验。
这个公式的美妙之处在于——它把「先验知识」和「数据证据」做了加权平均。如果数据量很大,似然函数会非常尖锐,后验就主要由数据决定。如果数据量很小,先验就会起到「正则化」的作用,防止参数估计跑偏。
在共轭先验的设定下(β 正态、σ² 逆伽马),后验分布有解析解:
β | σ², y ~ N(μ_n, Σ_n)
σ² | y ~ Inv-Gamma(a_n, b_n)
其中:
Σ_n = (Σ₀⁻¹ + XᵀX / σ²)⁻¹
μ_n = Σ_n (Σ₀⁻¹ μ₀ + Xᵀy / σ²)
a_n = a₀ + N/2
b_n = b₀ + (yᵀy + μ₀ᵀΣ₀⁻¹μ₀ - μ_nᵀΣ_n⁻¹μ_n) / 2
看到没?后验均值 μ_n 是先验均值 μ₀ 和 OLS 估计量 (XᵀX)⁻¹Xᵀy 的加权平均。权重由先验精度 Σ₀⁻¹ 和数据精度 XᵀX/σ² 决定。
直观理解:先验越确定(Σ₀ 越小),后验就越靠近先验。数据越多(XᵀX 越大),后验就越靠近 OLS 估计。这就是贝叶斯方法的精髓——自动平衡先验与数据。
4.5 一张图看懂整个流程
下面我用一张 SVG 流程图,把贝叶斯线性回归的完整逻辑串起来。你盯着看两分钟,应该就能记住整个框架。
4.6 一个简单的 Python 示例
光说不练假把式。下面我用 Python 演示一下,如何用贝叶斯线性回归估计一个单因子模型。
import numpy as np
import matplotlib.pyplot as plt
# 生成模拟数据
np.random.seed(42)
N = 100 # 样本量
beta_true = 0.8
sigma_true = 0.5
X = np.random.randn(N, 1)
y = X @ np.array([beta_true]) + np.random.randn(N) * sigma_true
# 设定先验
mu_0 = np.array([0.0]) # 先验均值
Sigma_0 = np.array([[1.0]]) # 先验方差(精度 = 1)
a_0, b_0 = 2.0, 1.0 # 逆伽马先验参数
# 计算后验参数
X_design = X
XTX = X_design.T @ X_design
XTy = X_design.T @ y
# 后验均值与方差(给定 σ²)
Sigma_n = np.linalg.inv(np.linalg.inv(Sigma_0) + XTX)
mu_n = Sigma_n @ (np.linalg.inv(Sigma_0) @ mu_0 + XTy)
# 后验边缘分布(σ² 的边缘后验)
a_n = a_0 + N / 2
b_n = b_0 + 0.5 * (y.T @ y + mu_0.T @ np.linalg.inv(Sigma_0) @ mu_0
- mu_n.T @ np.linalg.inv(Sigma_n) @ mu_n)
print(f"后验均值 μ_n = {mu_n[0,0]:.4f}")
print(f"后验方差 Σ_n = {Sigma_n[0,0]:.4f}")
print(f"真实 β = {beta_true}")
运行结果会告诉你,后验均值非常接近真实值 0.8。而且后验方差很小,说明我们对这个估计比较有信心。
一个小技巧:在实际项目中,我通常不会手动推导这些公式。我会用 PyMC 或 Stan 这样的概率编程语言。它们会自动处理 MCMC 采样,你只需要定义模型结构就行。但理解背后的数学原理,能帮你更好地调试模型。
4.7 本章小结
好了,这一章的内容就到这里。我们来捋一捋核心要点:
- 模型假设:和频率学派一样,但参数被视为随机变量。
- 先验分布:你已有的知识,用概率分布编码。无信息先验 vs 信息先验,看情况选择。
- 似然函数:数据对参数的支持程度,形式与 OLS 相同。
- 后验分布:先验与似然的乘积(归一化后)。在共轭先验下,有漂亮的解析解。
说实话,贝叶斯方法在量化里的优势,在样本量小、信噪比低的时候体现得最明显。因子模型恰恰就是这种场景——因子收益率本来就弱,数据又有限。用贝叶斯方法,相当于给估计值加了一层「保险」。
下一章,我们会深入后验预测分布,看看如何用贝叶斯方法做因子收益率的预测和风险度量。嗯,到时候你会看到,贝叶斯不只是估计参数,还能给出完整的预测分布——这对风险管理来说,太重要了。
公众号:蓝海资料掘金营,微信deep3321