BO-NARX贝叶斯优化非线性自回归外生模型股票价格预测,MATLAB代码




1. 研究背景

股票价格预测是金融时间序列分析中的核心问题。由于股价具有非线性、高噪声和非平稳等特征,传统线性模型(如ARIMA)难以充分捕捉其动态规律。非线性自回归外生(NARX)神经网络能够结合历史收盘价的自回归项与外部影响因素(成交量、开高低价),对复杂非线性关系进行建模。为了减少人工调参的主观性和计算成本,引入贝叶斯优化(BO)自动确定最优超参数(滞后阶数、隐藏层大小、正则化系数),从而提升预测精度与模型泛化能力。

2. 主要功能

  • 读取股票日线数据(日期、成交量、开盘价、最高价、最低价、收盘价),按8:2划分训练集与测试集;
  • 将所有特征(成交量、开高低收)进行Z-score标准化(基于训练集均值和标准差);
  • 使用贝叶斯优化搜索最优超参数组合(滞后阶数、隐藏层神经元数、正则化参数);
  • 基于最优超参数训练最终NARX神经网络模型;
  • 在测试集上预测收盘价,并计算MSE、RMSE、MAE、MAPE四个误差指标;
  • 绘制实际值与预测值对比曲线及残差图。

3. 算法步骤

  1. 数据预处理

    • 导入PriceData.xlsx,提取各列特征;
    • 计算训练集的均值与标准差,对全部数据进行标准化;
    • 按80%比例划分训练/测试集。
  2. 贝叶斯优化超参数

    • 定义优化变量:lag∈[1,10]整数、hiddenSize∈[5,30]整数、lambda∈[1e-5,1e-1]对数变换;
    • 目标函数:在训练集内再划分20%作为验证集,构造NARX设计矩阵(包含收盘价滞后及外生变量滞后),训练前馈神经网络,返回验证集上的均方误差(MSE);
    • 执行30次优化评估,采用期望改进(EI)采集函数,记录最小验证MSE对应的超参数。
  3. 最终模型训练

    • 使用全部训练数据,以最优超参数构建神经网络(Levenberg-Marquardt训练,90%训练/10%验证,早停轮数15);
    • 得到训练好的网络模型。
  4. 测试集预测与评估

    • 基于训练集尾部数据构造测试样本的滞后特征;
    • 将预测值反标准化还原为真实价格尺度;
    • 计算误差指标并绘图。

4. 技术路线

  • NARX模型 :将收盘价的lag阶滞后值以及外生变量(成交量、开盘价、最高价、最低价)的lag阶滞后值共同作为输入,当前时刻收盘价作为输出,由单隐层前馈神经网络逼近非线性映射。
  • 贝叶斯优化:以高斯过程为代理模型,利用采集函数平衡探索与开发,高效寻找使验证损失最小的超参数组合。
  • 正则化 :在训练损失中加入lambda * (权重平方和),抑制过拟合。
  • 数据标准化:消除量纲差异,加速神经网络收敛。

5. 公式原理

  • 标准化

xnorm=x−μtrainσtrain x_{\text{norm}} = \frac{x - \mu_{\text{train}}}{\sigma_{\text{train}}} xnorm=σtrainx−μtrain

  • NARX 模型
    y(t)=f(y(t−1),...,y(t−d),  x1(t−1),...,xm(t−d)) y(t) = f\big( y(t-1), \dots, y(t-d),\; x_1(t-1), \dots, x_m(t-d) \big) y(t)=f(y(t−1),...,y(t−d),x1(t−1),...,xm(t−d))

    其中 y(t)y(t)y(t) 为收盘价,x1,...,xmx_1,\dots,x_mx1,...,xm为外生变量(成交量、开高低价),ddd为滞后阶数,fff由单隐层神经网络实现。

  • 损失函数(含正则化)
    L=1N∑i=1N(yi−y^i)2+λ∑jwj2 L = \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y}i)^2 + \lambda \sum{j} w_j^2 L=N1i=1∑N(yi−y^i)2+λj∑wj2

  • 贝叶斯优化

    最大化采集函数 α(θ)=E[max⁡(0,fmin⁡−f(θ))]\alpha(\theta) = \mathbb{E}[\max(0, f_{\min} - f(\theta))]α(θ)=E[max(0,fmin−f(θ))](期望改进),其中 f(θ)f(\theta)f(θ) 为验证MSE,fmin⁡f_{\min}fmin 为当前最优值。

6. 参数设定

参数类别 取值/范围 说明
训练/测试划分 80% / 20%
滞后阶数 [1, 10] 整数 贝叶斯优化搜索空间
隐藏层大小 [5, 30] 整数 贝叶斯优化搜索空间
正则化系数 λ [1e-5, 1e-1] 对数变换 贝叶斯优化搜索空间
训练算法 trainlm (Levenberg-Marquardt)
最大迭代轮数 200(优化中)/ 300(最终模型)
早停耐心值 10(优化中)/ 15(最终模型)
贝叶斯优化评估次数 30
随机种子 2024 保证可重复性

7. 运行环境

  • 软件 :MATLAB(需包含以下工具箱)
    • 神经网络工具箱(fitnet, train
    • 统计与机器学习工具箱(bayesopt 及相关函数)
    • MATLAB 基本环境(readtable, plot 等)
  • 输入数据PriceData.xlsx 文件,包含工作表 PriceData,列顺序为 Dates, Volume, Open, High, Low, Close。
  • 输出:命令行打印最佳超参数与测试集误差,并显示预测对比图、残差图。

8. 应用场景

  • 金融时间序列预测:对个股或指数的收盘价进行短期预测,辅助投资决策。
  • 量化交易策略:将预测值作为交易信号(例如当预测上涨幅度超过阈值时触发买入)。
  • 风险管理:预测未来价格波动区间,用于设置止损或仓位调整。
  • 学术研究:作为非线性时间序列建模的基准方法,验证贝叶斯优化在金融预测中的有效性。

注:上述分析基于提供的MATLAB代码与Excel数据文件,代码已成功运行并输出最佳超参数(lag=7, hiddenSize=21, λ=0.0033)及测试集MAPE=2.12%。

相关推荐
机器学习之心17 小时前
基于CPO-VMD冠豪猪优化优化变分模态分解与最小包络熵的自适应变分模态分解方法,附MATLAB代码
开发语言·matlab·cpo-vmd·冠豪猪优化优化变分模态分解
Evand J19 小时前
【无人机控制例程】(3)多无人机队形变换控制代码,仿真程序。附MATLAB源代码
开发语言·matlab·无人机·控制·uav
2zcode1 天前
运动模糊图像复原的MATLAB仿真与优化
开发语言·matlab
yong99901 天前
MATLAB读取高光谱图像
开发语言·matlab
2zcode1 天前
基于MATLAB的肝病风险评估与分期分析系统设计与实现
开发语言·matlab
机器学习之心2 天前
DBO-Transformer模型回归+SHAP分析+新数据预测+多输出!深度学习可解释分析(附MATLAB代码)
深度学习·回归·transformer·shap分析
简简单单做算法2 天前
基于GAN生成对抗网络模型的图像生成与虚拟场景构建系统matlab仿真
人工智能·神经网络·生成对抗网络·matlab·gan·虚拟场景构建
Evand J2 天前
【编队控制例程】(2)基于UWB的多无人机协同定位与编队控制仿真,基于UKF(无迹卡尔曼滤波)定位。附MATLAB代码下载链接
matlab·无人机·控制·ukf
2zcode2 天前
基于MATLAB与SVM实现河道水面漂浮物的自动检测与识别
人工智能·支持向量机·matlab
破阵子443282 天前
如何用 Claude Code 等 Agent 工具操作 MATLAB(支持代码编写及 Simulink)
开发语言·matlab