MATLAB实现基于BMA-XGB 贝叶斯模型平均BMA结合极端梯度提升XGB进行股票价格预测的详细项目实例请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人或者访问对应标题的完整博客或者文档下载页面含完整的程序GUI设计和代码详解金融市场是一个高度复杂、非线性、强噪声且随时间动态变化的系统股票价格在不同时间尺度上呈现出显著的波动性和不确定性。传统的线性时间序列模型如AR、ARMA、ARIMA、GARCH等对平稳性、线性关系以及误差分布都有较强约束在市场出现结构性变化、政策扰动或者极端行情时经常出现预测失真或失效的问题。随着高频交易、量化投资和智能投顾的发展市场参与者对预测精度、稳定性和泛化能力提出了更高要求单一模型的局限性越来越明显。在这样的技术环境中集成学习思想逐渐成为金融预测领域的核心范式之一。极端梯度提升XGBoost简称XGB由于在处理非线性关系、变量交互、缺失值、异方差等方面具有显著优势已被广泛用于回归和分类任务尤其适用于高维特征、复杂关系和存在噪声的金融数据。树模型能够自动学习特征之间的高阶交互关系无需进行过多的人工特征组合并且在应对离群点和非高斯分布方面具有较好的鲁棒性这些特性与股票价格变化的特点高度契合。XGB通过梯度提升框架迭代优化目标函数采用二阶梯度信息进行加速同时引入正则化抑制过拟合使得模型在复杂数据环境中仍能保持较好的整体性能。然而尽管XGB表现突出仍然存在一些不容忽视的风险与不足。首先XGB作为单一模型会受到特定超参数配置、训练样本划分和特征选取等因素的影响存在不确定性和模型偏差。其次在金融预测场景中模型解释性和不确定性量化越来越受到重视仅仅给出点预测往往难以满足风险控制和资本约束的需求。风险管理部门更关心在不同置信水平下的预测区间、不同模型的相对贡献以及在极端情形下的潜在损失这些内容需要更系统的贝叶斯统计工具进行支持。贝叶斯模型平均Bayesian Model AveragingBMA通过对多个候选模型进行加权组合引入模型后验概率来刻画模型不确定性从而在理论上获得更接近“真实模型”的综合预测。与简单的加权平均或投票方法不同BMA将模型视为随机变量通过先验分布与数据似然构建模型后验再以后验概率对各模型的预测结果进行加权这种方法能够在统计意义上综合多个模型的优势降低单一模型由于误设、过拟合或欠拟合带来的风险。特别是在金融预测场景中可以利用BMA将多种结构不同、训练方法不同的XGB子模型进行整合使预测结果更加稳健并且形成一套系统的不确定性分析框架。基于BMA-XGB的股票价格预测项目核心思想是构建多个基于不同特征集合、不同时间窗、不同超参数配置乃至不同损失函数的XGB子模型从而形成一个“模型族”。然后使用贝叶斯方法通过在验证集上的表现估计每个子模型的后验权重最终以这些权重为系数对各子模型给出的预测值进行加权求和得到综合预测结果。同时将权重的分布理解为模型不确定性的体现可以构造预测区间、评估极端风险并对模型的相对贡献进行分析。从工程实现角度MATLAB在数据处理、可视化、矩阵运算和函数封装方面具有成熟生态对于构建金融时间序列分析与机器学习模型具有良好的支撑能力。R2025b版本在回归、深度学习和交互界面方面进行了大量更新既提供了稳健的数值计算工具又保留了对外部库的调用能力。虽然XGBoost原生实现多在C与Python生态中但可以通过MATLAB的系统调用机制或基于可执行文件的接口在MATLAB环境中高效地调用XGB训练与预测过程。同时利用MATLAB强大的矩阵表达能力可以轻松地实现BMA权重计算、后验概率更新以及预测区间构造等关键步骤。项目背景的核心动因可概括为三个层面。第一在金融时间序列预测中引入集成学习与贝叶斯模型平均的思想提升对复杂非线性数据的拟合能力以及对不确定性的刻画能力。第二在工程实践层面将XGB这种表现卓越的集成树模型与BMA的统计框架整合到MATLAB环境中为后续的量化策略研究、风险管理和智能投顾系统搭建一个可复用、可扩展的基础模块。第三在模型研究层面通过对比不同XGB子模型的表现、贝叶斯权重演化过程以及综合预测的改进效果形成一套可解释、可分析的模型框架为金融机构和研究者提供更有说服力的量化证据。通过这一项目可以让预测不再局限于单一模型输出的点估值而是上升到概率与模型集合的视角在多个模型之间进行有理有据的权重分配在时间序列的复杂噪声环境中寻找更稳健、更具鲁棒性的预测路径。基于BMA-XGB的股票价格预测架构不仅能够提升短期价格预测精度还能够在不确定性量化、风险评估和模型解释性方面发挥重要作用为未来将更多贝叶斯统计方法与机器学习算法融合提供有价值的实验和工程样板。项目目标与意义精细刻画股票价格的非线性动态特征项目首先希望建立一套可以较为全面刻画股票价格非线性动态特征的预测框架。传统线性模型往往只能捕捉线性自回归结构对成交量、技术指标、宏观变量等多源信息之间的复杂交互关系反应不足而金融市场中普遍存在非线性滞后效应、阈值效应以及在不同市场状态下的行为切换。通过引入XGB这种基于梯度提升的树模型利用其自动挖掘特征交互和高阶非线性关系的能力将原始价格、收益率、移动均线、波动率估计、成交额、换手率等多种特征共同纳入建模框架同时可以引入市场情绪指标、板块因子或者行业哑变量使模型能够在更高维度上理解价格变动的驱动机制。结合BMA框架可以构造多个针对不同特征子集、不同时间窗口的XGB子模型让各个子模型在擅长的局部结构上发挥优势而综合模型则通过后验加权汇总这些局部优势从而达到对股票价格动态特征更加精细和全面的刻画。这种方式相比单一模型有更高的表达能力和适应性能更充分反映市场在不同阶段的运行规律。提升预测精度与稳健性降低单一模型失效风险实际投资与风险控制场景中预测精度与稳健性往往同等重要。单一模型即使在历史回测中表现良好也可能因为市场结构突变、宏观环境变化或数据特征改变而失效。项目的核心目标之一是通过BMA-XGB组合在保持高预测精度的同时显著提升预测结果的稳健性和抗风险能力。具体而言将构建一组差异化的XGB子模型差异可能体现在超参数配置、特征集划分、训练样本区间、目标变量形式价格/收益率等方面。然后利用贝叶斯模型平均从模型族中自动筛出在给定数据条件下更符合观测事实的模型并给予更高的后验权重。而表现较差或不再适应当前市场结构的模型其权重会被自动压缩。通过这种方式整体预测不会过度依赖某一个子模型能够在不同市场阶段动态调整模型组合使预测结果在面对外生冲击或环境漂移时依然保持相对稳定。这种稳健性对于实际决策者尤为重要可以有效降低由模型失误导致的重大损失风险。构建可量化的不确定性与风险刻画机制在传统的回归模型中预测结果通常以单一数值呈现最多给出一个基于误差假定的置信区间但对模型本身的不确定性以及多模型之间的权衡考量缺乏系统描述。项目通过引入BMA框架将模型视为随机变量利用模型后验概率对预测结果进行加权从而自然引入预测不确定性的量化描述。在实践中不仅可以得到综合预测的期望值还能够计算不同模型贡献下的预测方差以及由模型不确定性带来的额外不确定度从而构建更全面的预测区间与风险评估指标。对于风险管理或资产配置而言这种不确定性信息可以用于设定止损阈值、调整仓位权重、评估极端行情下的潜在亏损。例如在预测误差的后验分布显著变宽时可以通过提高风险预警级别、缩减持仓来防范潜在的极端风险。项目目标之一是让预测不仅是“更准确”的点估计更是“可度量风险”的概率输出。搭建可扩展、可复用的MATLAB金融建模框架项目在工程侧还肩负着搭建一套可扩展、可复用的金融建模代码框架的目标使得后续在股票指数、期货、外汇、加密资产等多个市场和品种上可以快速迁移与复用。基于MATLAB R2025b的环境使用统一的数据预处理模块、特征工程模块、XGB调用接口和BMA权重计算模块通过合理的函数封装与结构化脚本设计使得整个项目框架在保持清晰逻辑的同时具备良好的可扩展性。日后若引入新的机器学习模型如随机森林、梯度提升树其他实现或神经网络仅需在现有BMA结构中增添新的子模型通道即可无需推翻原有架构。对于研究人员这一框架能够减少在代码搭建和调试上花费的大量时间将更多精力集中在模型思想与策略优化上对于金融机构这一框架可以作为内部量化研究平台的一部分为后续的策略迭代、模型对比和团队协作提供统一技术基础。项目挑战及解决方案XGB外部调用与MATLAB环境集成的工程挑战与设计思路MATLAB R2025b自身未内置完整的XGBoost训练函数因此需要通过外部接口实现XGB模型的训练与预测。这带来若干工程挑战一是需要保证与操作系统层面的可执行文件或动态库顺畅交互二是要在MATLAB中实现训练数据的高效导出与预测结果的及时导入三是要避免在大量模型训练过程中产生不必要的读写开销和资源浪费。解决这些问题的总体思路是使用基于命令行方式的系统调用将训练数据导出为CSV或文本格式再通过系统命令调用预先配置好的XGBoost命令行版本完成训练与预测并将输出结果重新读入MATLAB进行后续处理。在该过程中路径管理、文件命名和中间结果的缓存策略尤为关键需要尽量统一文件命名规则如以模型编号和时间戳组合以便批量管理同时为了减少I/O开销可对训练数据进行批量导出在参数寻优与BMA权重更新时重复使用同一数据文件只替换配置文件或命令行参数。另一个挑战在于XGBoost自身参数空间较大而金融数据又往往需要多次调整超参数因此必须设计合理的参数网格或启发式搜索策略并在MATLAB侧实现统一的参数管理结构以便后续解析结果和可视化分析。通过上述设计可以在保持XGB性能优势的前提下使其自然融入MATLAB建模流程既不破坏现有金融分析脚本又能充分利用外部高性能库。BMA权重估计与模型不确定性量化的统计与数值难点BMA的核心在于通过后验概率对模型族进行加权但在金融时间序列场景中模型数量可能较多各模型结构差异明显直接构造精确的后验分布在计算和理论上都具有较高难度。理想情况需要为每个模型定义先验概率和参数先验再根据似然函数进行贝叶斯更新这在高维非线性模型上几乎难以解析求解。为解决这一问题可以采用近似贝叶斯策略将模型在验证集或滚动窗口上的表现与模型后验概率进行关联。具体做法之一是将每个模型在验证集上的均方误差或负对数似然转换为“拟似然”指标通过指数加权方式构建近似后验例如以exp(-λ·误差)形式作为权重的未归一化表征然后通过归一化得到一组满足加和为1的权重向量。这种方法虽然不完全等价于严格的贝叶斯推断但在工程实践中能够较好地反映模型优劣且计算简洁、可扩展。数值层面上还需注意防止权重计算过程中的数值溢出如在误差值较大或λ取值较大时exp(-λ·误差)可能接近机器精度下限。可以通过减去误差的最小值、使用对数归一化等技巧进行稳定计算。此外为了避免权重过于集中在某一个模型上可以引入平滑系数或温度参数对权重分布进行适度扩散从而更好地平衡模型多样性与性能。通过这些改进可以在MATLAB中实现一套计算稳定、逻辑清晰的BMA权重估计流程。金融数据特性导致的过拟合风险与模型鲁棒性提升策略股票价格及其衍生特征往往呈现高噪声、非平稳、状态切换频繁等特性在这种数据环境下XGB这类高表达能力的模型极易出现过拟合问题在训练区间表现优异但在未来数据上预测失真。项目在这方面面临的挑战是需要在保证模型表达能力的前提下通过合理的正则化与验证策略提高鲁棒性。其中一项重要策略是采用时间序列交叉验证或滚动窗口验证而不是随机打乱样本进行传统交叉验证因为随机切分会破坏时间顺序导致过于乐观的评估结果。通过按时间顺序划分训练集、验证集和测试集甚至采用多段滚动窗口对每个子模型的性能进行更加真实的检验。另一个关键点是合理约束XGB的复杂度例如控制树的最大深度、叶节点最小样本数、子采样比例等并利用学习率降低每次提升步骤的步长以避免单次迭代过度拟合噪声。在BMA层面通过保留多个结构不同的子模型可以让表现略逊但更平滑、更稳定的模型在权重分配中仍拥有一定份额从而在整体上削弱过于“激进”的模型对综合预测的主导作用。此外还可以在特征工程阶段对原始特征进行必要的平滑处理和去噪如使用移动平均、波动率平滑、异常值截断等方法减少极端噪声对模型训练的干扰。当这些策略综合使用时能够在很大程度上缓解过拟合提高BMA-XGB在真实市场数据上的泛化能力和鲁棒性使得项目成果更具实用价值和可迁移性。项目模型架构整体架构概览与模块划分整个BMA-XGB股票价格预测项目可以划分为若干紧密衔接的模块数据管理模块、特征工程模块、XGB子模型族模块、BMA融合模块和结果评估与可视化模块。数据管理模块负责从CSV、数据库或者本地文件中加载股票行情与相关数据对缺失值、异常值进行统一处理并按照时间顺序进行切分确保训练、验证和测试数据的逻辑一致性。特征工程模块以时间序列为中心对原始价格与成交量数据构造技术指标例如收益率、对数收益、移动均线、滚动波动率、RSI、MACD因子等也可以引入市场指数、行业指数或情绪指标等外部变量并将所有特征整理成模型输入矩阵。XGB子模型族模块是模型架构的核心围绕多个设计各异的XGB子模型进行构建差异体现在超参数配置、特征选取范围、训练样本区间以及目标变量形式这些子模型在外部XGBoost程序驱动下分别完成训练和预测。BMA融合模块通过对各子模型在验证集上的表现进行分析使用近似贝叶斯策略计算模型后验权重对测试集或未来时点的预测值进行加权平均形成综合预测结果并提供不确定性刻画。结果评估与可视化模块则通过误差指标、时间序列对比图、残差分布图和权重演化图等方式对模型性能和稳定性进行多角度展示。整体架构在逻辑上是线性的但在实现上允许各模块独立优化和扩展例如可以在不改变BMA模块的情况下再增加新的XGB子模型或调整特征工程模块提高信息含量。XGB子模型族设计与内部机制XGB子模型族的设计是本项目的技术重点之一。利用梯度提升决策树的框架每个子模型由若干棵回归树顺序叠加构成每一次迭代都基于当前残差或负梯度进行拟合从而逐步逼近目标函数的最优解。决策树能够通过递归划分特征空间将复杂的非线性关系分解为若干区域内的近似常数或简单函数从而实现对非线性结构的刻画。在构建子模型族时可将不同的建模偏好固化为不同的超参数组合例如某些子模型采用较深的树结构以提升对复杂模式的识别能力另一些子模型采用较浅的树和更强的正则化以保证平滑性与稳健性在学习率设置上也可以设计“快速响应”和“平稳缓慢”两类模型从而在市场突变和常规行情下分别发挥作用。除了参数差异还可以在特征维度上进行模型分拆例如构造仅使用价格技术指标的模型、仅使用成交量和换手率的模型、或者使用宏观与市场情绪信息的模型再由BMA统一调配。这种子模型族的设计使整体模型具有“多视角”观测市场的能力每个子模型承担一个侧面任务而综合预测则集成各个侧面的信息。从算法内部机制上看XGB通过定义一个目标函数通常由损失项和正则化项构成在每次迭代中选择一棵最优的树来最大化目标函数的增益。具体计算时利用一阶和二阶梯度信息估计每个候选划分的增益从而大幅加速树结构搜索。项目中可以选用平方误差损失用于价格或收益率预测同时通过L2正则化约束树的叶节点权重避免过大权重导致过拟合。通过合理配置树数量、最大深度、子采样比例等参数可以在表达能力与泛化能力之间找到平衡为后续BMA融合提供高质量的子模型预测结果。贝叶斯模型平均权重计算原理与实现逻辑BMA模块的核心在于将若干个XGB子模型输出的预测结果按照模型后验概率进行加权得到综合预测。理论上需要为每个模型指定先验概率再基于数据计算后验概率。由于金融时间序列场景中难以精确构造模型似然函数本项目采用基于验证集表现的近似贝叶斯策略。具体思路是将每个模型在验证集上的预测误差或负对数似然转化为“拟似然”再通过指数变换和归一化得到权重。例如将每个模型在验证集上的均方误差记为MSE_m先对误差进行标准化处理随后计算一个权重分数score_m exp(-λ·MSE_m)其中λ为调节参数用于控制权重分布的集中程度。然后对所有score_m进行归一化得到w_m score_m / Σ_k score_k这些w_m就可视作模型的近似后验概率。对于预测阶段的每个时间点综合预测值可以写为ŷ Σ_m w_m·ŷ_m其中ŷ_m为第m个XGB子模型的预测值。该方法的优势在于无需对复杂的XGB模型构建显式概率模型而是通过性能指标间接反映模型对数据的解释能力。此处的λ可以使用经验法则或简单搜索进行选择当λ较大时权重更偏向于误差最小的模型整体预测更类似“赢家通吃”的模式当λ较小时权重较为均匀有利于保留模型多样性。为了增强数值稳定性权重计算时可以减去所有MSE中的最小值避免exp函数在浮点运算中的下溢。还可以对多轮滚动验证的结果进行累积形成时间上的权重平滑使模型权重在短期内不会剧烈波动从而提高整体预测的稳定性。这套权重计算逻辑在MATLAB中采用矩阵运算可以高效实现与XGB训练模块通过标准化接口进行连接。数据特征工程与时间序列切分策略高质量的特征工程是股票价格预测成功的关键一环。项目中首先围绕原始收盘价、最高价、最低价、开盘价和成交量构建基本特征例如日收益率、对数收益率、价格的移动平均线MA、指数移动平均线EMA、成交量的滚动平均和变化率等。在此基础上可以构造波动率类特征如滚动标准差、真实波动幅度、ATR以及反映趋势强度的指标如价格相对强弱指标RSI、MACD快慢线差值和信号线等。对于更复杂的场景还可以引入外部市场指数、行业指数、利率或汇率指标以及基于文本情绪分析生成的情绪分数等。所有特征按时间对齐后组成一个特征矩阵X与目标向量y以便输入XGB模型。时间序列切分方面必须保持时间顺序防止信息泄漏。常见策略是采用训练集、验证集和测试集的顺序划分例如用较早的70%数据作为训练集中间的15%作为验证集最后15%作为测试集。为了更好地刻画模型随时间的表现还可以采用滚动窗口方法在每一次训练中使用一个固定长度的窗口作为训练集紧随其后的若干时间点作为验证集然后向前滚动窗口重复训练和评估。滚动验证的结果不仅可以用于BMA权重计算还能够揭示某些模型在特定市场阶段如牛市、熊市、震荡市的相对优势为后续子模型族优化提供依据。在MATLAB环境中时间索引可以以向量方式统一管理使得窗口切分、特征对齐和样本构建过程保持简洁而清晰。结果评估、可视化与解释性扩展为了全面评估BMA-XGB模型的性能需要从多个角度进行结果分析。首先可以计算常用的回归误差指标如均方误差、均方根误差、平均绝对误差、平均绝对百分比误差等对比单个XGB子模型与BMA组合的表现差异。通常期望BMA组合在误差指标上优于大部分单模尤其在测试集上表现更为稳定。其次通过绘制真实价格与预测价格随时间变化的对比曲线可以直观观察模型在趋势行情、震荡行情与急剧波动时期的跟踪能力和延迟情况。同时可以绘制预测误差随时间的走势图从而识别出预测较困难的区间例如重大消息或极端波动时段。在不确定性刻画方面可以利用BMA权重与子模型间差异来构建预测区间。具体做法是在每个子模型预测值周围估计误差分布的标准差然后根据模型权重加权叠加得到综合预测的方差估计进而构造诸如95%预测区间。还可以进一步分析模型权重在时间上的演化绘制各个子模型在不同时间段的权重曲线从而理解市场结构变化对模型组合的影响。例如在趋势明显时期某些强调趋势特征的子模型权重可能上升而在振荡市场中强调短期反转信号的模型权重可能上升。这类可视化有助于解释模型决策依据提高对BMA-XGB组合行为的理解和信任度。若有需要还可引入特征重要性分析对XGB子模型中的特征贡献进行评估再结合BMA权重形成整体特征重要性排名为策略构建与因子研究提供解释性依据。项目模型描述及代码示例数据加载与基础预处理示例 clear; clc; close all; % 清空工作区变量、命令窗口和图形窗口保证脚本在干净环境下运行 dataFile stock_price_sample.csv; % 指定包含股票历史数据的CSV文件名包含日期、价格和成交量等信息 rawTable readtable(dataFile,VariableNamingRule,preserve); % 使用readtable读取CSV为表格格式并保留原始列名便于按列名操作 dateCol datetime(rawTable.Date,InputFormat,yyyy-MM-dd); % 将日期字符串转换成datetime类型方便后续按时间排序和切分 rawTable.Date dateCol; % 将转换后的datetime类型日期覆盖回表格的Date列以统一时间格式 rawTable sortrows(rawTable,Date); % 按日期从早到晚进行排序确保时间序列顺序正确 closePrice rawTable.Close; % 提取收盘价列作为价格序列是后续构造目标变量和技术指标的基础 volume rawTable.Volume; % 提取成交量列用于构建与成交活跃度相关的特征 ret diff(log(closePrice)); % 计算对数收益率序列反映相邻交易日价格相对变化 ret [NaN; ret]; % 将收益率序列长度补齐为与价格相同在首位填充NaN以占位 ma5 movmean(closePrice,[4 0]); % 计算5日移动平均价窗口向前看4天加当前一天用于描述短期趋势 ma20 movmean(closePrice,[19 0]); % 计算20日移动平均价窗口较大用于体现中期趋势 vol_ma5 movmean(volume,[4 0]); % 计算5日成交量移动平均用于刻画短期成交活跃变化 ret_std10 movstd(ret,[9 0],omitnan); % 计算10日滚动收益率标准差采用omitnan忽略NaN用于衡量短期波动率 X [ret ma5 ma20 vol_ma5 ret_std10]; % 将构造好的多个特征列拼接成特征矩阵X每一列对应一个特征 y closePrice; % 将收盘价作为预测目标变量y后续可替换为收益率或其他形式 nanMask any(isnan(X),2); % 识别特征矩阵中含有NaN的行避免这些样本参与训练 X_clean X(~nanMask,:); % 删除含NaN的样本行得到清理后的特征矩阵 y_clean y(~nanMask); % 同步删除目标变量中对应的样本保持特征和目标对齐 date_clean rawTable.Date(~nanMask); % 同步保留清理后对应的日期向量用于后续时间序列切分和绘图 n size(X_clean,1); % 计算清理后样本总数用于划分训练、验证和测试区间 idx_train_end floor(0.7*n); % 将70%的最早样本作为训练集末尾索引 idx_valid_end floor(0.85*n); % 将中间15%的样本作为验证集末尾索引剩余为测试集 X_train X_clean(1:idx_train_end,:); % 提取训练集特征矩阵用于XGB子模型训练 y_train y_clean(1:idx_train_end); % 提取训练集目标变量与训练特征一一对应 X_valid X_clean(idx_train_end1:idx_valid_end,:); % 提取验证集特征矩阵用于模型性能评估和BMA权重计算 y_valid y_clean(idx_train_end1:idx_valid_end); % 提取验证集目标变量评估预测误差 X_test X_clean(idx_valid_end1:end,:); % 提取测试集特征矩阵用于最终性能评估 y_test y_clean(idx_valid_end1:end); % 提取测试集目标变量对比真实与预测效果 date_test date_clean(idx_valid_end1:end); % 提取测试集对应日期用于后续可视化预测曲线 特征标准化与参数配置示例 muX mean(X_train,1); % 计算训练集特征的按列均值用于后续标准化减去中心 sigmaX std(X_train,0,1); % 计算训练集特征的按列标准差用于缩放特征方差到同一量级 sigmaX(sigmaX0) 1; % 防止标准差为0导致除法错误将零标准差替换为1保持数值稳定 X_train_std (X_train - muX) ./ sigmaX; % 使用训练集均值和标准差对训练特征进行标准化提高模型收敛稳定性 X_valid_std (X_valid - muX) ./ sigmaX; % 对验证特征采用同一均值和标准差进行标准化避免信息泄漏 X_test_std (X_test - muX) ./ sigmaX; % 对测试特征进行同样的标准化使训练和预测特征空间一致 xgbExe xgboost; % 假定系统路径中已配置xgboost可执行程序名称用于后续命令行调用 workDir fullfile(pwd,xgb_work); % 在当前目录下指定一个工作子目录存放中间训练和预测文件 if ~exist(workDir,dir); mkdir(workDir); end % 若工作目录不存在则创建用于集中管理所有XGB相关文件 nModels 3; % 准备构建3个XGB子模型示例实际应用中可以扩展为更大的模型族 paramList cell(nModels,1); % 使用单元格数组保存每个子模型的参数结构便于统一管理 paramList{1} struct(max_depth,3,eta,0.1,subsample,0.8,colsample_bytree,0.8,num_round,200); % 第1个模型采用较浅树和中等学习率偏向稳健 paramList{2} struct(max_depth,5,eta,0.05,subsample,0.9,colsample_bytree,0.7,num_round,300); % 第2个模型树更深学习率更小强调拟合复杂模式 paramList{3} struct(max_depth,4,eta,0.2,subsample,0.7,colsample_bytree,0.9,num_round,150); % 第3个模型学习率较大迭代轮数较少偏重快速响应 trainFile fullfile(workDir,train_data.csv); % 训练数据导出的CSV路径用于XGB命令行读取 validFile fullfile(workDir,valid_data.csv); % 验证数据导出的CSV路径用于XGB评估和预测 testFile fullfile(workDir,test_data.csv); % 测试数据导出的CSV路径用于最终预测 trainTable array2table([y_train X_train_std]); % 将训练目标和特征合并为表格第一列为目标后面为特征 validTable array2table([y_valid X_valid_std]); % 构造验证集表格用于XGB验证或预测 testTable array2table([zeros(size(X_test_std,1),1) X_test_std]); % 测试表格第一列填0占位仅供XGB读取格式一致 writetable(trainTable,trainFile,WriteVariableNames,false); % 将训练表格写入CSV且不写列名避免影响XGB命令行解析 writetable(validTable,validFile,WriteVariableNames,false); % 将验证表格写入CSV文件便于外部XGB使用 writetable(testTable,testFile,WriteVariableNames,false); % 将测试表格写入CSV未来通过XGB生成预测值 XGB子模型命令行调用与预测生成示例 y_valid_pred_mat zeros(length(y_valid),nModels); % 为验证集预测结果预分配矩阵每列对应一个子模型的预测 y_test_pred_mat zeros(length(y_test),nModels); % 为测试集预测结果预分配矩阵后续用于BMA加权 for m 1:nModels % 遍历每一个子模型编号从1到nModels依次训练和预测 pm paramList{m}; % 提取当前子模型的参数结构便于构造命令行参数 modelCfgFile fullfile(workDir,sprintf(model_%d.conf,m)); % 为当前子模型生成专属配置文件路径 modelOutFile fullfile(workDir,sprintf(model_%d.bin,m)); % 指定训练完成后模型文件的二进制输出路径 validPredFile fullfile(workDir,sprintf(valid_pred_%d.txt,m)); % 验证集预测结果输出路径将被读取回MATLAB testPredFile fullfile(workDir,sprintf(test_pred_%d.txt,m)); % 测试集预测结果输出路径用于最终评估 fid fopen(modelCfgFile,w); % 打开当前模型配置文件以写模式准备写入参数和数据路径 fprintf(fid,objectivereg:squarederror\n); % 指定XGB回归目标为平方误差回归适用于价格预测 fprintf(fid,max_depth%d\n,pm.max_depth); % 写入最大树深度参数控制模型复杂度 fprintf(fid,eta%f\n,pm.eta); % 写入学习率决定每次迭代的步长大小 fprintf(fid,subsample%f\n,pm.subsample); % 写入样本子采样比例降低过拟合并加快训练 fprintf(fid,colsample_bytree%f\n,pm.colsample_bytree); % 写入列采样比例控制每棵树使用的特征子集比例 fprintf(fid,num_round%d\n,pm.num_round); % 写入提升轮数决定总共拟合多少棵树 fprintf(fid,data%s\n,trainFile); % 指定训练数据CSV路径供XGB加载训练样本 fprintf(fid,model_out%s\n,modelOutFile); % 指定训练完成后模型保存路径便于后续预测调用 fclose(fid); % 关闭配置文件确保写入内容全部生效 trainCmd sprintf(%s tasktrain config%s,xgbExe,modelCfgFile); % 构造训练命令行字符串指定执行程序和配置文件 system(trainCmd); % 调用系统命令执行XGB训练过程生成模型文件 validPredCmd sprintf(%s taskpred model_in%s data%s name_pred%s,xgbExe,modelOutFile,validFile,validPredFile); % 构造验证集预测命令指定模型输入、数据和输出路径 system(validPredCmd); % 执行验证集预测命令产生预测文本文件 testPredCmd sprintf(%s taskpred model_in%s data%s name_pred%s,xgbExe,modelOutFile,testFile,testPredFile); % 构造测试集预测命令同样指定模型、数据和输出 system(testPredCmd); % 执行测试集预测命令得到测试集预测文件 y_valid_pred readmatrix(validPredFile); % 将验证集预测文件读入MATLAB形成数值向量 y_test_pred readmatrix(testPredFile); % 将测试集预测文件读入MATLAB用于最终评估 y_valid_pred_mat(:,m) y_valid_pred; % 将当前子模型在验证集上的预测写入矩阵对应列 y_test_pred_mat(:,m) y_test_pred; % 将当前子模型在测试集上的预测写入矩阵对应列 end % 完成所有子模型的训练与验证、测试集预测 BMA权重计算与综合预测示例 mse_valid mean((y_valid_pred_mat - y_valid).^2,1); % 按列计算每个子模型在验证集上的均方误差作为性能度量 mse_min min(mse_valid); % 求出所有子模型MSE中的最小值用于数值稳定处理 lambda_bma 5; % 设定BMA中的权重敏感参数lambda控制误差与权重的关系强度 score_raw exp(-lambda_bma*(mse_valid - mse_min)); % 通过指数函数将误差差值映射为未归一化权重分数误差越小分数越大 w_bma score_raw ./ sum(score_raw); % 将未归一化分数向量归一化使所有模型权重之和为1 y_valid_bma y_valid_pred_mat * w_bma; % 对验证集预测按权重进行线性加权得到BMA综合预测 y_test_bma y_test_pred_mat * w_bma; % 对测试集预测按相同权重加权生成最终综合预测结果 rmse_valid_models sqrt(mean((y_valid_pred_mat - y_valid).^2,1)); % 计算各子模型在验证集上的RMSE用于对比评估 rmse_valid_bma sqrt(mean((y_valid_bma - y_valid).^2)); % 计算BMA组合在验证集上的RMSE验证加权效果 rmse_test_models sqrt(mean((y_test_pred_mat - y_test).^2,1)); % 计算各子模型在测试集上的RMSE用于测试表现对比 rmse_test_bma sqrt(mean((y_test_bma - y_test).^2)); % 计算BMA组合在测试集上的RMSE观察综合模型的实际效果 disp(单个子模型在验证集上的RMSE:); % 提示输出子模型验证集RMSE结果方便在命令窗口查看 disp(rmse_valid_models); % 输出各子模型验证集RMSE数组便于比较优劣 disp(BMA组合在验证集上的RMSE:); % 输出BMA组合验证集RMSE提示文字 disp(rmse_valid_bma); % 输出BMA组合验证集RMSE数值判断是否优于大多数单模 disp(单个子模型在测试集上的RMSE:); % 提示输出子模型测试集RMSE信息 disp(rmse_test_models); % 输出各子模型测试集RMSE结果观测其泛化能力 disp(BMA组合在测试集上的RMSE:); % 提示输出BMA组合测试集RMSE说明 disp(rmse_test_bma); % 输出BMA组合测试集RMSE数值用于综合评估表现 预测结果可视化与误差分析示例 fig1 figure(Name,BMA-XGB Test Prediction); % 新建图形窗口用于展示测试集预测结果命名便于识别 plot(date_test,y_test,k-,LineWidth,1.2); % 绘制测试集真实收盘价曲线使用黑色实线表示 hold on; % 保持当前图形以便叠加绘制BMA预测曲线 plot(date_test,y_test_bma,r-,LineWidth,1.2); % 绘制BMA综合预测价格曲线使用红色实线便于区分 datetick(x,yyyy-mm,keeplimits); % 将横轴日期格式化为年月显示保持时间范围不变 xlabel(Date); % 为横轴添加日期标签说明时间维度 ylabel(Price); % 为纵轴添加价格标签表明数值含义 title(BMA-XGB Stock Price Prediction on Test Set); % 添加图形标题说明图示内容为测试集股票价格预测 legend({Real Price,BMA Prediction},Location,best); % 添加图例区分真实价格曲线与BMA预测曲线 grid on; % 打开网格线方便观察时间和价格刻度 fig2 figure(Name,Prediction Error on Test Set); % 新建图形窗口用于展示预测误差随时间变化 err_test_bma y_test_bma - y_test; % 计算测试集BMA预测误差正值表示预测高于真实 plot(date_test,err_test_bma,b-,LineWidth,1); % 绘制误差曲线使用蓝色实线表示误差波动 datetick(x,yyyy-mm,keeplimits); % 格式化横轴日期显示使时间标记清晰 xlabel(Date); % 为误差图横轴设置标签标明日期 ylabel(Prediction Error); % 为纵轴设置预测误差标签标明误差数值单位 title(BMA-XGB Prediction Error on Test Set); % 添加误差图标题表明显示对象为BMA预测误差 yline(0,k:); % 绘制误差零值的参考虚线方便判断高估或低估 grid on; % 开启网格线帮助识别误差在不同日期的水平 模型权重展示与解释性扩展示例 fig3 figure(Name,BMA Model Weights); % 新建图形窗口用于展示各XGB子模型在BMA中的权重 bar(1:nModels,w_bma); % 使用柱状图显示每个模型的权重大小横轴为模型编号 xlabel(Model Index); % 为横轴添加标签表明对应的是模型索引编号 ylabel(BMA Weight); % 为纵轴添加标签表示贝叶斯模型平均分配的权重大小 title(Posterior-like Weights for XGB Submodels in BMA); % 添加标题说明此图展示BMA中XGB子模型的后验式权重 grid on; % 打开网格线便于比较不同模型权重差异 [~,bestIdxValid] min(mse_valid); % 找出在验证集上MSE最小的模型索引用于与BMA比较 disp(验证集上表现最优的单模型索引:); % 提示输出验证集最佳子模型编号信息 disp(bestIdxValid); % 输出验证集MSE最小的模型索引数字 disp(该模型在BMA权重中的占比:); % 提示输出该最佳模型在BMA权重中的比重 disp(w_bma(bestIdxValid)); % 输出最佳模型对应的BMA权重观察其在组合中的话语权更多详细内容请访问http://金融预测MATLAB实现基于BMA-XGB贝叶斯模型平均BMA结合极端梯度提升XGB进行股票价格预测的详细项目实例含完整的程序GUI设计和代码详解_GUI股票分析工具资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/90423873https://download.csdn.net/download/xiaoxingkongyuxi/90423873https://download.csdn.net/download/xiaoxingkongyuxi/90423873