halo 的技术博客

返回

你手上有 5 个因子模型,各自预测下个月的横截面预期收益。回测一年:

  • M1 年化 IR 0.9,但最近三个月拉胯;
  • M3 年化 IR 0.7,却异常稳定;
  • 其余三个各有高低。

于是你陷入经典纠结:到底信哪个?

传统做法——挑「历史最优」那个,把全部仓位押上去。这本质上是用一次抽签,赌上整个样本外的命运:万一只因为噪声 M1 暂时领先,你未来就一直被它带着走。

贝叶斯模型平均(Bayesian Model Averaging, BMA) 换了一种思路:不挑,而是问——「在已有数据下,每个模型可能对的概率是多少?」然后把预测做成加权平均,权重就是这些后验概率。于是「哪个模型对」从一道单选题,变成了一份分散的、可更新的投资组合。

本文用横截面预期收益预测的合成实验,从零实现 BMA,把它和「单模型最优」正面对比,所有图表与数字由文末代码真实生成。

一、BMA 的核心公式#

设你有 MM 个候选模型 M1,,MM\mathcal{M}_1,\dots,\mathcal{M}_M,要对目标 yy 做预测。BMA 的预测分布是:

p(ynewD)=k=1Mp(ynewD,Mk)  p(MkD)后验模型权重 wkp(y_{\text{new}} \mid D) = \sum_{k=1}^{M} p(y_{\text{new}} \mid D, \mathcal{M}_k)\; \underbrace{p(\mathcal{M}_k \mid D)}_{\text{后验模型权重 } w_k}

其中点预测(取期望)就是加权平均:

y^BMA=k=1Mwkfk(xnew)\hat y_{\text{BMA}} = \sum_{k=1}^{M} w_k\, f_k(x_{\text{new}})

后验权重由贝叶斯定理给出:

wk=p(MkD)=p(DMk)p(Mk)jp(DMj)p(Mj)w_k = p(\mathcal{M}_k \mid D) = \frac{p(D \mid \mathcal{M}_k)\,p(\mathcal{M}_k)}{\sum_{j} p(D \mid \mathcal{M}_j)\,p(\mathcal{M}_j)}

  • p(Mk)p(\mathcal{M}_k):模型先验(通常设均匀 1/M1/M);
  • p(DMk)p(D \mid \mathcal{M}_k)边际似然(marginal likelihood),也叫证据(evidence),对「模型复杂度」自动惩罚——这正是 BMA 抗过拟合的来源。

二、用 BIC 近似边际似然(实战够用)#

精确算边际似然要在参数上积分,很贵。实战里用 BIC 近似

logp(DMk)12BICk,BICk=nlog(σ^k2)+pklogn\log p(D \mid \mathcal{M}_k) \approx -\tfrac{1}{2}\,\text{BIC}_k, \qquad \text{BIC}_k = n\log(\hat\sigma_k^2) + p_k \log n

其中 nn 是样本量,σ^k2\hat\sigma_k^2 是模型 kk 的残差方差,pkp_k 是参数个数。BIC 越越好(对数似然惩罚复杂度)。

把它指数化、归一化就得到权重:

wk=exp(12BICk)jexp(12BICj)w_k = \frac{\exp(-\tfrac{1}{2}\text{BIC}_k)}{\sum_j \exp(-\tfrac{1}{2}\text{BIC}_j)}

关键直觉:好模型 = 拟合好(残差小)+ 不复杂(参数少)。BIC 把这两件事压进一个可比较的数。

三、合成实验:5 个模型,各自「懂多少」不同#

我们造一个横截面场景:真实预期收益 μiN(0,1)\mu_i\sim N(0,1),共 12 个资产。5 个候选模型各自对 μ\mu 做不同程度的信息提取:

  • 每个模型得到一个「带噪声的 μ\mu 估计」gk=(1ak)μ+1(1ak)2εg_k = (1-a_k)\mu + \sqrt{1-(1-a_k)^2}\,\varepsilon
  • aka_k 是收缩强度,aka_k 越小表示模型越贴近真值(信息越强)。本文取 a=[0.05,0.20,0.40,0.60,0.85]a = [0.05, 0.20, 0.40, 0.60, 0.85],即 M1 最强、M5 最弱。

逐资产后验模型权重 (BMA):不同资产「信哪个模型」并不一致

热力图是关键洞察:权重是逐资产分配的。某个资产上 M1 拿到 0.8,另一个资产上 M3 反超——因为不同资产的信息结构不同,没有一个模型在所有资产上「通吃」。这正是「赌一个模型」会漏掉的东西。

四、预测对比:BMA 离真值更近#

我们在测试期比较三种预测:真实 μ\mu、「历史最优单模型」、BMA 加权平均。

预测对比:BMA 不会盲信某一模型,离真值更近

单模型最优(红)在个别资产上押错方向,BMA(蓝)因为混合了多个模型,预测更「居中、稳健」,整体上离灰色真值更近。在本例测试期:

  • 最优单模型 MSPE = 1.651
  • BMA MSPE = 1.559(相对提升约 5.6%

5.6% 看着不大,但注意这是平均意义——BMA 的价值不在单次碾压,而在「不赌错」。

五、蒙特卡洛胜率:BMA 不是偶尔好#

一次实验有运气成分。跑 200 次独立重复,每次重新生成 μ\mu 与噪声,比较 BMA 与「该次最优单模型」的 MSPE:

200 次蒙特卡洛:BMA 在 93% 情形下不劣于单模型最优

比值 = MSPE(最优单模型) / MSPE(BMA),大于 1 表示 BMA 更优或打平。结果:在 93% 的重复里,BMA 不劣于当次最优单模型。也就是说,你不用事先知道「这次该信谁」,BMA 自动把赌注摊到了大概率正确的模型上。

六、完整 Python 实现#

下面代码自包含(不依赖 statsmodels),可直接复现本文全部图表与数字。

跑出来:全局权重约 [0.55, 0.13, 0.15, 0.10, 0.08](最强模型拿大头但非全部),BMA MSPE 相对提升 ~5.6%,200 次蒙特卡洛胜率 93%。

七、三个必须知道的坑#

  1. BIC 近似只在「大样本 + 参数少」时靠谱。它假设后验高斯、忽略先验——小样本 nn 小的时候,BIC 的边际似然近似会偏,权重可能过度集中。真要严格,应算精确边际似然(含先验积分)或用 WAIC/LOO-CV 替代理据。
  2. 权重会「赢者通吃」。如果某个模型明显碾压其他,BMA 权重会塌成一个尖峰,退化成「单模型」——这本身不是 bug,而是数据告诉你「确实就它最对」;但要警惕这是否来自过拟合:一个过拟合模型在训练集上残差极小、BIC 极低,会把权重吸走,却在样本外崩。配合 Purged K-Fold 交叉验证的 BIC 更稳。
  3. 对先验敏感。先验 p(Mk)p(\mathcal{M}_k) 不取均匀、或模型集合本身偏斜(比如 9 个弱模型 + 1 个强模型),权重分布会整体偏移。BMA 的结论质量上限取决于你的模型集合是否包含了「真模型附近」的候选——垃圾模型集合进 BMA,出来的还是垃圾的平均。

八、小结#

BMA 的精髓就一句:把「哪个模型对」从一道赌题,变成一个加权平均的组合题。它不要求你事先知道谁赢,而是用数据给每个模型分配概率,预测时自然倾斜到「大概率对」的那一边,同时保留对不确定性的对冲。在本文实验里,它用 93% 的胜率证明:与其一次押注历史最优,不如把赌注摊开——这跟分散投资是同一个智慧,只不过发生在「模型」这一层。

所有图表均由本文代码在合成数据上真实生成,数字可复现;换成你的真实多因子预测,只需替换 build_models 里的候选模型与训练/测试数据即可。

贝叶斯模型平均:把「哪个模型对」变成权重而非赌注
https://blog.halo26812.eu.org/blog/bayesian-model-averaging-asset
Author halo
Published at 2026年7月19日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨