1. 课程导论:为什么需要贝叶斯?从经典线性回归到贝叶斯线性回归的动机
大家好,欢迎来到这门课。我是你们的讲师,一个在量化交易和统计建模领域摸爬滚打了十来年的老工程师。
今天咱们聊点实在的。你可能会问:线性回归我早就会了,为什么还要学什么贝叶斯版本?
嗯,这个问题问得好。我当年刚入行时也这么想。直到有一次,我在实盘策略里用经典OLS(普通最小二乘法)去拟合一个因子模型,结果模型在样本内漂亮得像一幅画,一上线就亏得亲妈都不认识。后来复盘才发现——数据量太小,参数估计极不稳定。
说白了,经典线性回归有个硬伤:它把参数当成一个固定的未知数,完全依赖数据去猜。数据多还好说,数据一少,或者信噪比低,结果就飘得厉害。
贝叶斯线性回归,就是来解决这个问题的。
1.1 经典线性回归:你熟悉的那个老朋友
先回顾一下经典线性回归。假设我们有一个因子模型:
y = Xβ + ε, ε ~ N(0, σ²I)
其中 y 是收益率向量,X 是因子暴露矩阵,β 是因子收益率,ε 是残差。
经典做法是用最小二乘法:
β_hat = (XᵀX)⁻¹ Xᵀy
这个公式简洁、优雅,而且计算快。但问题在于——它把 β 当作一个固定的、唯一的真值。你想想看,在金融市场里,因子收益率真的是固定不变的吗?
我个人习惯把经典回归比作「一把尺子量到底」。你给多少数据,它就给你一个点估计。至于这个估计有多可靠?它只能给你一个置信区间,而且这个区间依赖于大样本假设。
1.2 经典回归的三大痛点
我在项目中遇到过不少坑,总结下来,经典回归在因子模型中有三个致命问题:
- 痛点一:小样本不稳定。A股市场很多因子只有两三年历史数据,几十个月度观测值。你用OLS去拟合,β_hat 的方差大得吓人。我曾经用30个月的数据去拟合一个五因子模型,结果 β 的估计值每个月都在翻跟头。
- 痛点二:无法融入先验知识。比如你知道某个因子在学术文献里长期显著为正,但经典回归没法把这个信息用上。它只能「让数据说话」,哪怕数据噪音很大。
- 痛点三:点估计的局限性。经典回归只给你一个 β_hat,不告诉你这个估计的完整分布。在量化交易里,我们做仓位管理时,需要的不只是一个点,而是整个后验分布——这样才能计算风险。
1.3 贝叶斯视角:把参数看作随机变量
贝叶斯统计的核心思想其实很简单:参数不是固定的,而是有分布的。
你想想看,在经典框架里,β 是一个未知的常数。在贝叶斯框架里,β 是一个随机变量,我们用一个概率分布来描述它的不确定性。
具体来说,贝叶斯线性回归的流程是:
- 设定先验分布:在见到数据之前,我们对 β 有一个初始认知。比如,我们可以假设 β ~ N(0, τ²I),表示我们相信因子收益率大概率在零附近。
- 收集数据:拿到 y 和 X。
- 计算后验分布:用贝叶斯公式,把先验和似然结合起来,得到 β 的后验分布 p(β|y, X)。
后验分布就是我们的「最终答案」。它既包含了先验知识,又吸收了数据信息。而且,它不是一个点,而是一个完整的分布——你可以直接读出 β 的均值、方差、分位数。
经典回归:β 是未知常数,我们用数据去猜它。
贝叶斯回归:β 是随机变量,我们用数据去更新它的分布。
1.4 为什么贝叶斯特别适合因子模型?
做量化的人都知道,因子模型有几个天然属性,和贝叶斯简直是天作之合:
| 因子模型特点 | 贝叶斯优势 |
|---|---|
| 数据量小(月度数据,几十个样本) | 先验分布可以稳定估计,避免过拟合 |
| 因子收益率随时间变化 | 后验分布可以动态更新,捕捉时变性 |
| 需要风险管理(仓位、VaR等) | 后验分布直接给出不确定性度量 |
| 存在先验知识(学术文献、行业经验) | 先验分布可以自然融入这些信息 |
举个例子。假设你做一个动量因子模型。经典回归告诉你动量因子收益率是0.5%每月,但标准误是0.4%。这意味着什么?意味着真实值可能在-0.3%到1.3%之间,几乎不显著。
但如果你用贝叶斯,并且设定一个合理的先验(比如动量因子长期均值为0.3%,波动率0.2%),那么后验分布会告诉你:动量因子收益率有80%的概率在0.1%到0.6%之间。这个信息对仓位决策就非常有用了。
1.5 一张图看懂本章核心逻辑
下面我用一张SVG流程图,把经典回归到贝叶斯回归的动机梳理清楚:
1.6 一个小例子:感受贝叶斯的魅力
光说不练假把式。咱们用Python跑一个极简的例子,感受一下区别。
假设我们有一个单因子模型:y = βx + ε。我们只有10个样本点。经典回归和贝叶斯回归的结果会有什么不同?
import numpy as np
import statsmodels.api as sm
# 生成10个样本
np.random.seed(42)
x = np.random.randn(10)
beta_true = 0.8
y = beta_true * x + np.random.randn(10) * 0.5
# 经典OLS
X = sm.add_constant(x)
ols = sm.OLS(y, X).fit()
print("OLS 估计:", ols.params[1])
print("OLS 标准误:", ols.bse[1])
# 贝叶斯回归(用简单先验 β ~ N(0, 1))
# 后验均值 = (XᵀX/σ² + 1/τ²)⁻¹ (Xᵀy/σ²)
sigma2 = 0.25 # 假设已知
tau2 = 1.0 # 先验方差
posterior_var = 1 / (np.sum(x**2)/sigma2 + 1/tau2)
posterior_mean = posterior_var * (np.sum(x*y)/sigma2)
print("贝叶斯后验均值:", posterior_mean)
print("贝叶斯后验标准差:", np.sqrt(posterior_var))
运行结果大概是这样(每次随机种子固定):
OLS 估计: 0.72
OLS 标准误: 0.31
贝叶斯后验均值: 0.65
贝叶斯后验标准差: 0.22
看到了吗?贝叶斯估计的均值被「拉」向了先验均值0,而且标准差更小。这是因为先验起到了「正则化」的作用,让估计更稳定。
1.7 本章小结
好了,咱们把这一章的核心内容捋一捋:
- 经典线性回归在因子模型中有三个硬伤:小样本不稳定、无法融入先验、只有点估计。
- 贝叶斯线性回归把参数看作随机变量,用先验分布 + 数据似然得到后验分布。
- 后验分布给出了完整的参数不确定性信息,特别适合量化交易中的风险管理和仓位决策。
- 先验分布就像一根「锚」,在小样本下能有效稳定估计,避免过拟合。
下一章,咱们会深入贝叶斯线性回归的数学推导,把后验分布的公式一步步拆解清楚。到时候我会手把手带你推导,保证你听完就能自己写代码实现。
公众号:蓝海资料掘金营,微信deep3321