9、贝叶斯优化调优:贝叶斯优化原理、高斯过程、采集函数(EI、PI、UCB)、贝叶斯优化流程、贝叶斯优化的优缺点
做基差交易策略调优,最头疼的是什么?
我猜你会说——参数太多,跑一次回测又慢。网格搜索?太笨。随机搜索?碰运气。有没有一种方法,能像老交易员一样,根据历史经验,聪明地选择下一个最值得尝试的参数?
有,就是贝叶斯优化。说白了,它就是用概率模型来指导搜索,让你少走弯路。我在做股指期货跨期套利时,用这个方法把参数调优时间从三天压缩到了半天。今天咱们就把它拆开揉碎了讲清楚。
9.1 贝叶斯优化原理:用概率说话
贝叶斯优化的核心思想,其实就一句话:用已知的观测结果,去推断未知位置的表现,并决定下一步该往哪走。
你想想看,我们调参时,每次回测得到一个夏普比率或年化收益,这就是一个“观测点”。贝叶斯优化会把这些点当成“证据”,然后构建一个概率模型,告诉我们:参数空间里每个点,大概能跑出什么结果,以及这个结果有多不确定。
我个人习惯把它比作“钓鱼”。你钓了几条鱼(观测点),就知道哪个区域鱼多(均值高),哪个区域还没试过(不确定性大)。下一步,你是继续在鱼多的地方钓,还是去未知区域碰碰运气?贝叶斯优化就是帮你做这个决策的。
核心公式(理解即可):
后验概率 ∝ 似然 × 先验概率
在调参场景下:P(参数|观测数据) ∝ P(观测数据|参数) × P(参数)
我们不断用新观测数据更新后验,后验又成为下一步的先验。这就是“贝叶斯更新”。
9.2 高斯过程:贝叶斯优化的“大脑”
高斯过程(GP)是贝叶斯优化的核心模型。它不直接告诉你某个参数点会出什么结果,而是给出一个概率分布——包括均值(预测值)和方差(不确定性)。
举个例子。假设我们只测试了参数组合A和B,分别得到夏普比率1.2和1.5。高斯过程会推断出:
- 在A和B附近,预测值比较可靠(方差小)
- 在远离A和B的地方,预测值不确定(方差大)
- 整个参数空间,每个点都有一个“预测值±不确定性”的区间
我在项目中遇到过一个问题:参数空间有10个维度,高斯过程训练一次要很久。后来我改用Matern核函数代替RBF核,计算速度快了不少,效果也没差太多。嗯,这里要注意,核函数的选择会影响GP的平滑假设,别盲目用默认的。
我的经验:如果参数维度超过20,纯高斯过程会变得很慢。可以先用随机搜索跑几十个点,再用这些点初始化GP,能省不少时间。
9.3 采集函数:EI、PI、UCB
高斯过程给出了“地图”,但下一步往哪走,需要采集函数来决定。常用的有三种,我分别说说。
9.3.1 EI(Expected Improvement,期望提升)
EI计算的是:在某个参数点,预期能比当前最优值提升多少。它既考虑预测值的高低,也考虑不确定性的大小。
公式长这样(不用背):
EI(x) = (μ(x) - f*) * Φ(z) + σ(x) * φ(z)
其中 z = (μ(x) - f*) / σ(x)
f* 是当前最优值,Φ是正态CDF,φ是正态PDF
说白了,EI会倾向于选择“可能比当前好,而且不确定性大”的点。我个人习惯用EI,因为它平衡了探索和利用,在大多数基差交易策略调参中表现稳定。
9.3.2 PI(Probability of Improvement,提升概率)
PI只关心“比当前最优值好的概率”,不关心好多少。公式很简单:
PI(x) = Φ((μ(x) - f*) / σ(x))
PI的缺点是容易陷入局部最优。为什么?因为它只看概率,不看幅度。一个点有60%概率提升0.01,另一个点有40%概率提升0.5,PI会选前者。我曾经在螺纹钢跨期套利上吃过这个亏,后来就很少用PI了。
9.3.3 UCB(Upper Confidence Bound,上置信界)
UCB的思路更直接:
UCB(x) = μ(x) + κ * σ(x)
κ是一个超参数,控制探索程度。κ越大,越倾向于探索不确定性大的区域;κ越小,越倾向于利用已知的好区域。
我建议刚开始调参时,把κ设大一点(比如2.0),多探索;后期再调小(比如0.5),精细搜索。这个技巧我在做铁矿石基差策略时验证过,效果不错。
| 采集函数 | 特点 | 适用场景 | 我的推荐 |
|---|---|---|---|
| EI | 平衡探索与利用 | 大多数情况 | ⭐⭐⭐⭐⭐ |
| PI | 容易陷入局部最优 | 已知最优区域很明确 | ⭐⭐ |
| UCB | 可调节探索程度 | 需要控制探索力度 | ⭐⭐⭐⭐ |
9.4 贝叶斯优化流程:一步步来
整个流程其实不复杂,我把它总结成5步:
- 初始化:随机采样几个参数点,跑回测,得到初始观测数据。我一般取5-10个点。
- 构建GP模型:用观测数据训练高斯过程,得到整个参数空间的预测均值和方差。
- 最大化采集函数:在参数空间里找到采集函数值最大的点,作为下一个候选参数。
- 评估候选点:用这个参数跑回测,得到新的观测值。
- 更新模型:把新观测值加入数据集,重新训练GP。回到第2步,直到达到预设的迭代次数或时间。
下面这张图展示了整个流程,我建议你保存下来,调参时对照着看:
9.5 贝叶斯优化的优缺点
任何方法都有两面性,贝叶斯优化也不例外。我根据自己的实战经验,给你列个清单:
优点
- 样本效率高:相比网格搜索,通常少跑80%的回测就能找到接近最优的参数。我在做豆粕基差策略时,只跑了50次就找到了不错的参数组合。
- 能处理非凸问题:目标函数有多个局部最优时,贝叶斯优化依然能有效搜索。这一点比梯度下降强多了。
- 自带不确定性估计:GP给出的方差,可以告诉你哪些区域还没探索够,哪些区域已经比较确定。
- 对噪声鲁棒:回测结果本身有随机性(比如滑点、成交率),GP模型能很好地处理这种噪声。
缺点
- 计算开销随维度增长:参数维度超过20时,GP的训练和预测会变得很慢。我曾经在30维参数空间上跑贝叶斯优化,一次迭代要等5分钟,后来不得不降维。
- 对核函数敏感:选错了核函数,模型可能完全偏离真实情况。我建议多试几种核函数,比如RBF、Matern、周期核。
- 不适合离散参数:如果参数是离散的(比如选择哪种止损方式),贝叶斯优化的效果会打折扣。
- 需要一定的调参经验:采集函数的选择、κ值的设定、GP的初始化,这些都需要经验。新手可能会觉得有点玄学。
避坑指南:我曾经在参数空间边界附近吃过亏。贝叶斯优化倾向于在已知好点的附近搜索,容易忽略边界区域。我的做法是:在初始化时,刻意把边界点也采样几个,让GP知道边界的情况。
好了,贝叶斯优化这块就讲到这里。记住,它不是一个“一键调优”的魔法工具,而是一个需要你理解原理、结合经验的辅助方法。用好了,它能帮你省下大量时间;用不好,它也可能带你绕弯路。多试几次,找到适合你策略的那套配置。
一句话总结:贝叶斯优化 = 高斯过程(画地图) + 采集函数(指方向) + 迭代更新(一步步走)。
公众号:蓝海资料掘金营,微信deep3321