资讯动态

遗传算法在投资组合优化中的对比实践:与均值方差、贝叶斯的稳健性较量

发布时间:2026/10/18 10:05:23 来源:尧图企业网站定制
简介这是一份面向金融量化研究者和机器学习初学者的完整实验资料包聚焦如何用遗传算法求解投资组合选择问题并与马科维茨均值方差模型、贝叶斯模型进行系统对比。资源包含Python源码、Jupyter Notebook演示、指数与行业数据Excel表格以及大量结果可视化PNG图表覆盖初始化方法、变异率、候选解数量与迭代次数等不同参数设置对优化效果的影响并提供模型比较图、动态权重变化图等便于直观理解各类算法在资产配置中的表现差异。压缩包共45个文件约12.23MB目录结构清晰既有可直接运行的代码也有数据表格和过程图表适合教学演示、论文复现或自主研究。目前已有178人学习下载尤其适合需要实践智能优化算法并对比经典金融模型的读者。1. 三种组合构建方法我为什么把遗传算法放在最后用先说结论把遗传算法、经典均值-方差模型和贝叶斯方法放在同一批数据上做横向对比收益最高的往往不是遗传算法而是样本内的均值-方差模型但把时间窗口换一换、给参数加一点扰动最先翻车的同样是它。遗传算法的优势不在单期收益而在换数据、换约束之后的结果稳定性以及处理非凸目标函数的灵活性。这篇记录我用遗传算法做投资组合选择并和均值-方差MV、贝叶斯两类经典模型对比的完整过程包括对比维度的设计、指数与行业两组数据上的实测差异以及回测里踩过的几个坑。适合正在做组合优化选型的人也适合想给已有研究补一层模型对比、但不知道从哪下手的读者。2. 怎么比才公平五个维度定义清楚结论才有意义模型对比最怕的是口径不一致。同样一个夏普比率年化方式不同、无风险利率取法不同结果能差出一大截。所以在跑任何对比之前我先固定了一套评判框架后面所有模型都在同一口径下说话。2.1 收益口径年化收益、夏普比率和最大回撤组合优化问题的原始定义是在给定风险水平下找最高预期回报所以收益是第一个要看的量。但收益本身要定清楚。我用三个指标年化收益、夏普比率、最大回撤。年化收益按复利口径计算回测期长短不同的话不能直接比绝对值一定要年化后再看。夏普比率统一用超额收益除以波动率无风险利率我固定取一个常数避免不同模型用了不同利率导致排序失真。最大回撤是收益率曲线从峰值到谷值的最大跌幅这个指标比方差更贴近真实持有体验——组合涨了又跌回去回撤大就意味着实际拿不住。项目里自带的描述性统计.png和数据折线图.png其实就是在做这一层工作。拿到一组新数据我先看均值、标准差、偏度、峰度再画协整相关矩阵比如data_corr.png那张图。数据本身还没理清就上模型后面所有对比都是在给错误数据做修饰。我的习惯是相关性过高的资产组放进组合里分散化效果会打折扣这个信息先记下来后面解释模型输出差异时用得上。2.2 稳健性滚动窗口下结论还站得住吗单次回测的收益排名说明不了太多因为样本内最优很可能只是过拟合了某一段行情。我更关心的是把时间窗口往前推或者往后拉结论还在不在。做法是滚动回测用固定长度的训练窗口反复切数据比如12个月训练、1个月验证这样能看出一组策略在不同市场状态下的表现分布。判定标准我说得具体一点不看收益排名第一的是谁而看三组模型在多次滚动窗口里收益落位的稳定性。如果某个模型有时第一、有时垫底那它的高收益就没有参考价值。项目里有一张average vs random的对比图思路是拿策略输出跟随机权重生成器做对照检验一个结果到底是模型能力还是运气。这是容易被忽略的一步——很多组合优化结果比随机强不了多少但视觉上有效前沿画得很漂亮会给人一种一定能赚的错觉。稳健性检验才是把幻觉打掉的那一步。2.3 计算成本维度高起来模型差距就拉开了三个模型在小数据集上跑得都快差距在资产数量变多之后才开始显现。均值-方差模型的核心操作是协方差矩阵求逆这是一个 n×n 的稠密矩阵运算。当资产数量和样本期长度接近时协方差矩阵接近奇异求逆结果会出现剧烈震荡。遗传算法的成本结构完全不同它每一代要评估所有候选解计算量是候选解数量 × 迭代次数这个数字通常从几千到几万不等但每次评估只是算一次组合收益而且候选解互相独立可以并行。贝叶斯方法的成本来自后验分布的采样如果用蒙特卡洛或 MCMC收敛诊断本身就要跑很久。实际工程里怎么选很明确。几十只资产、约束条件复杂GA的适应度评估成本可控优势明显数据维度高但追求实时性MV的解析解更快愿意接受小时级计算换更细的概率分布贝叶斯才值得上。项目文件里 num_candidates 和 num_iter 这两个参数就是GA计算预算的直接体现调它们本质上是在拿计算量换搜索结果的质量。2.4 参数敏感性哪个模型的玄学参数最少这个维度平时很少有人讲但恰恰是选型的决定性因素。均值-方差模型表面上没有超参数可它的均值向量和协方差矩阵都是估计出来的输入稍微偏一点最优权重就会大幅跳变这是它最大的黑匣子。遗传算法的超参数很多初始化方式、变异方式、变异率、候选解数量、迭代次数每个都带着玄学气息。贝叶斯模型的先验参数同样影响后验结果先验设得强数据再多也拽不回来。测参数敏感性的标准做法是控制变量法固定其他参数只扫某一个参数的取值重复多次实验看输出权重的标准差。项目里 init_method_std、muate_rate_std、num_candidates_std 这一批带 std 后缀的图就是干这件事的。标准差大说明结果对这个参数敏感后面固定参数时要格外小心标准差小说明这个参数给个合理值就行不值得花时间精调。先跑敏感性分析再谈调参顺序不能反反了就变成靠运气调参。3. 三组数据实测均值-方差、遗传算法、贝叶斯各自的真实表现对比框架定好之后我把项目里的指数数据和行业分类数据分别跑了一遍又在两个数据集上交叉验证。下面按模型逐个说表现以及这些表现背后的原因。3.1 均值-方差模型有效前沿好看但估计误差是软肋均值-方差模型的逻辑很直接给定收益目标最小化组合方差所有可行组合在收益-风险平面上形成一条有效前沿。项目里的公式.png画的就是这个优化问题。实操中先随机生成大量权重并计算对应收益风险再取包络线拟合前沿。这个过程的视觉效果很好前沿上的每一个点都是一个最优组合。但问题出在输入的准确性上。模型要求知道资产的期望收益和协方差矩阵而现实里这两个量都是历史数据估计出来的。历史均值对期望收益的估计误差非常大优化过程又偏偏会把误差放大——那些收益估计偏高、方差估计偏低的资产会被赋上超高的权重形成误差最大化组合而不是收益最大化组合。实测里我看到的典型现象是样本内有效前沿漂亮夏普比率高样本外滚动验证时权重剧烈变化换仓成本吃掉一大块收益。解决办法通常是给权重加约束比如单只资产权重上限、禁止做空、协方差矩阵用收缩估计。这些修正手段一加上均值-方差模型无参数优势的说法就不成立了它也需要调参只是调的是约束条件而不是算法参数。3.2 遗传算法初始化、变异率和候选解数量怎么调遗传算法在投资组合选择里的思路是把一组候选权重向量当成一个种群通过选择、交叉、变异迭代进化适应度函数就是夏普比率或自定义的目标函数。相比均值-方差模型的解析求解GA不需要协方差矩阵求逆也不要求目标函数可导所以带约束的、非凸的目标函数都能处理。我看项目里的实验设计作者把初始化方式、变异方式、变异率、候选解数量、迭代次数都做了控制变量对比。初始化方式影响的是初始种群的覆盖度常见的做法有纯随机生成、均匀分布生成、低差异序列生成。变异方式和变异率直接影响搜索的广度与收敛速度。候选解数量和迭代次数共同决定计算预算上限。# GA 参数敏感性固定候选解数量与迭代次数只扫变异率 import numpy as np def scan_mutate_rate(returns, rates, candidates150, n_iter150, repeat10): std_by_rate {} for r in rates: weight_matrix [] for seed in range(repeat): np.random.seed(seed) # ga_optimize 是 GA_portfolio.py 里封装的遗传算法主函数 best_w ga_optimize( returnsreturns, num_candidatescandidates, num_itern_iter, mutate_rater, init_methoduniform, ) weight_matrix.append(best_w) # 同一变异率下重复多次权重标准差越大说明这个参数越敏感 std_by_rate[r] np.std(weight_matrix, axis0).mean() return std_by_rate # 使用示例rates 取 0.05 到 0.4 的等差序列 # result scan_mutate_rate(returns_df.values, rates[0.05, 0.1, 0.15, 0.2, 0.3, 0.4])这段代码的核心逻辑是同一超参数下重复多次实验用权重的标准差衡量敏感性。标准差大说明结果受随机种子影响大该参数需要认真固定标准差小说明给个常规值就行。项目里 muate_rate_std、num_candidates_std 那组图就是这么扫出来的。我当时跑完发现变异率从 0.1 调到 0.2权重分布的标准差变化明显说明这个参数是GA里最需要关注的旋钮之一。3.3 贝叶斯方法Dirichlet先验与动态权重的思路贝叶斯建模的出发点跟前面两个完全不同。均值-方差模型给的是一组最优权重贝叶斯给的是权重的概率分布。具体到组合选择问题权重向量满足归一化和非负约束正好落在单纯形上因此很自然会选 Dirichlet 分布作为先验。项目里的 dirichlet.png 就是这张图直观展示了不同先验浓度参数下权重的分布形态。用历史收益数据做似然更新之后得到的是权重的后验分布。后验分布的均值可以作为点估计使用后验分布的方差则给出了不确定性度量——这是贝叶斯方法独一份的输出。均值-方差模型告诉你应该配 60% 在某一资产上贝叶斯方法告诉你60% 是最可能值但 40% 到 80% 的区间都有解释力。对于资产配置这种输入本身就不精确的问题这个不确定性信息比一个精确但不可靠的数字更有价值。代价是两层。第一层是先验的主观性先验参数设置不同后验结果就差很多这需要敏感性分析来兜底。第二层是计算成本后验采样在数据维度升高时收敛很慢跑一轮需要反复检查采样链是否收敛不能拿没收敛的后验分布当结论。项目里的 Tperiod.png 应该就是在对比不同训练期长度和调仓频率对后验权重的影响。实用的做法是用一个较短的滚动窗口做动态更新让模型慢慢适应市场变化而不是一次性用全量历史拟合。3.4 混合策略把GA当搜索器、把贝叶斯当调节器三个模型对比完收益不高但结果很清晰它们之间不是替代关系而是互补关系。均值-方差模型是理论上限适合做基准线告诉你在不考虑估计误差的情况下最优能做到什么程度。遗传算法是搜索器目标函数随便定义、约束随便加适合做带限制条件的权重求解。贝叶斯方法是调节器它不追求精确解而是给权重配上概率区间方便做动态调整。我在实际测试里试了一种混合流程先用均值-方差跑出有效前沿作为参考基准再用遗传算法在权重上限、行业分配上限这类约束下搜索最优权重最后用贝叶斯后验分布给权重加上下界区间落在区间外的权重就动态修正。这个流程跑出来的组合收益不是最高的但滚动窗口下权重变化最平稳换仓频率最低。真正操作过就会发现投资组合选择的问题难点从来不在哪个模型更精确而在哪个流程能在不确定环境下少犯大错。4. 避坑记录组合优化回测里最值得记的五个坑这一章的每一条都是我自己跑数据时踩过的。写出来的时候我按照现象 → 原因 → 解决的格式方便你对照排查。坑一数据长度不一致相关性矩阵直接失真。现象把不同资产的历史收益拼在一起算协方差矩阵结果里出现大量异常高的相关系数组合权重分配明显偏离直觉。原因资产上市时间不同有的只有两年数据有的是十年数据。直接拼接后协方差矩阵里的元素来自完全不同的样本期等于是拿不齐整的样本硬算。解决先统一样本期只保留所有资产都有交易记录的区间。如果强行保留长区间会损失资产数量就分开两组数据跑宁可牺牲历史长度也要保证矩阵内部口径一致。坑二遗传算法用静态变异率前期搜索慢、后期不收敛。现象固定变异率跑GA迭代前期种群多样性下降太快还没找到足够好的区域就已经收敛后期又因为变异率恒定没法在最优解附近精细搜索。原因静态变异率无法适应搜索阶段的变化。前期需要高变异率探索更广的空间后期需要低变异率做局部精调一个固定值两头都顾不到。解决改用动态变异率迭代初期设置较高的变异率随着代数增加逐步降低。项目里的 single_vs_dynamic 对比图就是做这个验证的动态策略下结果的标准差显著更低。坑三初始化方式没验证结果方差大到没法解释。现象同一组参数换了随机种子或者换了初始化方式最终权重和收益指标差异巨大多次运行结果之间看不出稳定的规律。原因随机初始化生成的种群如果覆盖度不够进化过程就相当于在局部区域里搜索每次运行落在不同区域结果自然散得厉害。解决在调任何超参数之前先跑一遍初始化方式对比。如果项目里 init_method_std 显示某种初始化方式下多次运行的标准差特别大优先换成低差异序列或均匀初始化把随机性压到可接受范围内再去做其他参数调优。坑四均值-方差模型样本内优秀、样本外崩盘。现象样本内回测的夏普比率很高有效前沿画得漂亮一到滚动窗口的样本外验证收益大幅下滑甚至跑输等权基准。原因优化过程放大了历史均值和协方差的估计误差给收益偏高的资产分配了过大的权重。样本内的最优实质上是给历史噪声做了过度配置。解决给权重加现实约束单资产权重设置上限限制做空必要时用协方差收缩估计。这些约束看起来降低了样本内的理论收益但换来了样本外的稳定性。之后的所有结论都一定要基于样本外结果样本内数字只当参考。坑五贝叶斯先验设得太强后验学不动。现象市场环境发生变化后贝叶斯模型的权重调整速度明显滞后后验分布看起来和先验分布差别不大组合结构长期锁死在旧状态。原因先验浓度参数设得太大相当于在数据尚未进入模型之前就强烈相信过往规律会继续成立。数据量不占优时似然部分很难抵过强先验模型就学不动。解决把先验浓度设小一档让数据有更大发言权。同时做敏感性检查跑一组弱先验和一组强先验对比后验权重的差异。如果差异大到影响组合结构说明先验太强了当前的数据还撑不起这种信心。5. 结论不同场景下怎么选以及我现在的默认做法三个模型跑完对比项目给我的最大启示是模型选型不该问哪个最好而该问当前问题的约束条件最适合哪个。均值-方差模型适合约束少、维度低、需要解释性的场景它的结论透明适合做基准和教学。遗传算法适合目标函数非凸、约束多、资产数量中等的场景计算预算可控且不依赖协方差矩阵求逆的稳定性。贝叶斯方法适合数据不确定性大、需要概率区间辅助决策的场景代价是计算成本和先验调优。我的默认组合是这样用的均值-方差模型永远跑一份做基准遗传算法负责在业务约束条件下搜索可行解贝叶斯模型提供权重的波动区间做动态调整。这个组合不一定让单期收益最大化但滚动回测里的稳定性最好换手率最低实盘操作时最拿得住。具体到项目代码最有价值的不是某个模型的一次回测结果而是那一整套敏感性分析流程。init_method_std、muate_rate_std、muate_method_std 这些输出直接把GA的玄学参数变成了可量化的判断依据。从那以后我每次拿到一组新资产数据都会强制执行一套固定流程先做描述性统计和相关性分析再跑一遍各模型的参数敏感性测试最后才看收益排名。顺序一旦乱了结论就容易自我欺骗。这个习惯是从这次对比里真正长出来的希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑