当前位置: 首页 > news >正文

项目介绍 MATLAB实现基于BMA-XGB 贝叶斯模型平均(BMA)结合极端梯度提升(XGB)进行股票价格预测(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励

MATLAB实现基于BMA-XGB 贝叶斯模型平均(BMA)结合极端梯度提升(XGB)进行股票价格预测的详细项目实例

请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人

或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)

金融市场是一个高度复杂、非线性、强噪声且随时间动态变化的系统,股票价格在不同时间尺度上呈现出显著的波动性和不确定性。传统的线性时间序列模型,如AR、ARMA、ARIMA、GARCH等,对平稳性、线性关系以及误差分布都有较强约束,在市场出现结构性变化、政策扰动或者极端行情时,经常出现预测失真或失效的问题。随着高频交易、量化投资和智能投顾的发展,市场参与者对预测精度、稳定性和泛化能力提出了更高要求,单一模型的局限性越来越明显。

在这样的技术环境中,集成学习思想逐渐成为金融预测领域的核心范式之一。极端梯度提升(XGBoost,简称XGB)由于在处理非线性关系、变量交互、缺失值、异方差等方面具有显著优势,已被广泛用于回归和分类任务,尤其适用于高维特征、复杂关系和存在噪声的金融数据。树模型能够自动学习特征之间的高阶交互关系,无需进行过多的人工特征组合,并且在应对离群点和非高斯分布方面具有较好的鲁棒性,这些特性与股票价格变化的特点高度契合。XGB通过梯度提升框架迭代优化目标函数,采用二阶梯度信息进行加速,同时引入正则化抑制过拟合,使得模型在复杂数据环境中仍能保持较好的整体性能。

然而,尽管XGB表现突出,仍然存在一些不容忽视的风险与不足。首先,XGB作为单一模型,会受到特定超参数配置、训练样本划分和特征选取等因素的影响,存在不确定性和模型偏差。其次,在金融预测场景中,模型解释性和不确定性量化越来越受到重视,仅仅给出点预测往往难以满足风险控制和资本约束的需求。风险管理部门更关心在不同置信水平下的预测区间、不同模型的相对贡献以及在极端情形下的潜在损失,这些内容需要更系统的贝叶斯统计工具进行支持。

贝叶斯模型平均(Bayesian Model Averaging,BMA)通过对多个候选模型进行加权组合,引入模型后验概率来刻画模型不确定性,从而在理论上获得更接近“真实模型”的综合预测。与简单的加权平均或投票方法不同,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_end+1:idx_valid_end,:); % 提取验证集特征矩阵,用于模型性能评估和BMA权重计算 y_valid = y_clean(idx_train_end+1:idx_valid_end); % 提取验证集目标变量,评估预测误差 X_test = X_clean(idx_valid_end+1:end,:); % 提取测试集特征矩阵,用于最终性能评估 y_test = y_clean(idx_valid_end+1:end); % 提取测试集目标变量,对比真实与预测效果 date_test = date_clean(idx_valid_end+1:end); % 提取测试集对应日期,用于后续可视化预测曲线 特征标准化与参数配置示例 muX = mean(X_train,1); % 计算训练集特征的按列均值,用于后续标准化减去中心 sigmaX = std(X_train,0,1); % 计算训练集特征的按列标准差,用于缩放特征方差到同一量级 sigmaX(sigmaX==0) = 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,'objective=reg: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 task=train config=%s',xgbExe,modelCfgFile); % 构造训练命令行字符串,指定执行程序和配置文件 system(trainCmd); % 调用系统命令执行XGB训练过程,生成模型文件 validPredCmd = sprintf('%s task=pred model_in=%s data=%s name_pred=%s',xgbExe,modelOutFile,validFile,validPredFile); % 构造验证集预测命令,指定模型输入、数据和输出路径 system(validPredCmd); % 执行验证集预测命令,产生预测文本文件 testPredCmd = sprintf('%s task=pred 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/90423873

https://download.csdn.net/download/xiaoxingkongyuxi/90423873

https://download.csdn.net/download/xiaoxingkongyuxi/90423873

http://www.jsqmd.com/news/900430/

相关文章:

  • LeetCode 22. 括号生成(JS里的回溯算法)
  • CPT Markets:多维度评测平台透明度与稳定性
  • 终极指南:3分钟掌握FSearch极速文件搜索神器,告别Linux找文件烦恼!
  • 基于 HarmonyOS 6.0 的日程备忘应用:待办事项板与提醒卡片详解
  • 2026最新!3款抖音视频提取免费神器,亲测无水印直存,真香体验好用到哭!
  • 【限时首发】ChatGPT生日派对创意黄金公式:基于217场真实活动AB测试提炼的5大变量模型
  • 仿生优化算法NOAH:从藤壶幼虫到水下机器人集群的智能协同
  • 美股盘前盘后数据接入前的 4 项核验:交易窗口、返回样本、timestamp 与失败分支
  • SLAM实战笔记:用李代数扰动模型搞定旋转矩阵求导(附Python代码)
  • 实战:用Python和Gensim复现LINE算法(附处理加权边与稀疏网络的技巧)
  • 如何分辨正宗特产:景区与批发市场选购避坑指南
  • 从顺序表到ArrayList,吃透动态数组的底层逻辑
  • Surface Pro/Laptop 用户必看:不关Secure Boot,搞定Arch Linux双系统与驱动签名全流程
  • QKeyMapper:终极Windows按键映射解决方案,游戏办公一键搞定
  • 程序员3年卡18k?收藏这份AI转型指南,弯道超车迎高薪!
  • 【开源软件移植】NitroShare 适配鸿蒙 PC 全流程实战 — Qt-OHOS × 手把手移植教程
  • 工业视觉辅助系统:实时检测与装配质量优化
  • 分数阶微积分导向的离散制造检测数据融合技术【附算法】
  • 05 - Tool 工具调用:让 AI “长出双手“
  • 从‘找不到文件’到成功运行:一次完整的Windows 10家庭版gpedit.msc启用记录与排错心得
  • 存储芯片和逻辑芯片的区别是什么?
  • 窗口尺寸调整难题的终极解决方案:WindowResizer使用全攻略
  • 研究生读文献亲测好用的工具
  • GS算法与Fienup算法详解:为什么你的相位恢复总不收敛?可能是反馈机制没搞懂
  • CrossOver容器访问Mac外置硬盘?手把手教你映射D盘(保姆级图文)
  • 06 - MCP 模型上下文协议:统一 AI 工具的“Type-C 接口“
  • 从CS231N作业到你的实验:Tiny-ImageNet数据集完整使用指南(含预处理与可视化)
  • 2026年智慧工地系统推荐榜单:工地人脸识别/塔吊防碰撞/AI视频巡检/扬尘监测/实名制考勤/车辆道闸/升降机监控/劳务管理平台全解析 - 品牌企业推荐师(官方)
  • 微信AI机器人终极指南:打造智能群聊助手的完整教程
  • G1舞蹈开发三步曲:从预设到强化学习