【视频讲解】线性时间序列原理及混合ARIMA-LSTM神经网络模型预测股票收盘价研究实例

news/2024/9/19 9:04:27/文章来源:https://www.cnblogs.com/tecdat/p/18414742

原文链接:https://tecdat.cn/?p=37702 

原文出处:拓端数据部落公众号 

分析师:Dongzhi Zhang 

近年来人工神经网络被学者们应用十分广泛,预测领域随着神经网络的引入得到了很大的发展。本文认为单一神经网络模型对序列所包含的线性信息和非线性信息的挖掘是有限的,因此本文为了进一步的提高对这两类数据的预测效果,将神经网络与传统的时间序列模型ARIMA模型相结合建立混合模型,并提供了数据和代码应用于预测股票收盘价数据。 

一、时间序列数据来源及研究目的
本项目选取的时间序列为国家数据库公布的 2010 年 1 月至 2023 年 3 月期间对外出口额的月度数据。本文旨在对该时间序列进行时间序列分析建模,并实施向前一步预测,进而与实际公布值进行对比。

二、代码部分

数据读取:

monthexport = rev(datal[,2])
time = rev(datal[,1])
ts.plot(monthexport)

三、文本解释部分

线性时间序列分析的对象为时间序列数据。线性时间序列的适用范围为平稳时间序列。
弱平稳序列(宽平稳序列,weakly stationary time series)定义如下:若时间序列{Xt}存在有限的二阶矩且满足(1)EXt = μ与 t 无关;(2)Var(Xt)=σ²与 t 无关;(3)YR = Cov(Xt-k,Xt),k = 1,2,...与 t 无关,则称{Xt}为弱平稳序列。

两种具有平稳性的理想模型如下:

Definition 3.1:p 阶自回归模型(An autoregressive model of order p,缩写为 AR(p))形式为 xₜ = φ₁xₜ₋₁ + φ₂xₜ₋₂ +……·+ φₚXₜ₋ₚ + wₜ,其中 xₜ为平稳序列,wₜ~wn(0,σ²w),φ₁,φ₂,…,φₚ为常数(p ≠ 0)。若 xₜ的均值不为零,将 xₜ替换为 xₜ - μ,即 μ = φ₁(Xₜ₋₁ - μ)+φ₂(Xₜ₋₂ - μ)+·…+φₚ(Xₜ₋ₚ - μ)+ wₜ,或者写成 xₜ = α+φ₁xₜ₋₁+φ₂xₜ₋₂+··+φₚxₜ₋ₚ + wₜ,其中 α = μ(1-φ₁—…—φₚ)。

Definition 3.3:q 阶移动平均模型(The moving average model of order q,即 MA(q)模型)定义为 Xₜ = wₜ + θ₁wₜ₋₁ + θ₂wₜ₋₂ +…+θₚwₜ₋ₚ,其中 wₜ~wn(0,σ²),θ₁,θ₂,…,θₚ(θₚ≠0)为参数。

通过自相关函数(ACF)和偏自相关函数(PACF)确定自回归移动平均模型(ARMA)的阶数,具体表现为:对于 AR(p)模型,ACF 拖尾,PACF 在滞后 p 步后截尾;对于 MA(q)模型,ACF 在滞后 q 步后截尾,PACF 拖尾;对于 ARMA(p,q)模型,ACF 和 PACF 均拖尾。

进行 ARMA 模型拟合:

irma4 = arima(logIR,order = c(12,0,2), include.mean = TRUE)

拟合结果如下:

 
  1.  
    Call:
  2.  
    arima(x = logIR,order = c(12,0,2), include.mean = TRUE)
  3.  
    Coefficients:
  4.  
    ar1 ar2 ar3 ar4 ar5 ar6 ar7 ar8
  5.  
    0.0557 -0.1379 -0.1501 -0.0487 -0.1605 -0.0539 -0.1039 -0.0575
  6.  
    s.e. 0.1058 0.1109 0.0937 0.0949 0.0902 0.0880 0.0877 0.0871
  7.  
    ar9 ar10 ar11 ar12 ma1 ma2 intercept
  8.  
    -0.0658 -0.1195 0.0436 0.6035 -0.7995 0.2306 0.0061
  9.  
    s.e. 0.0855 0.0820 0.0863 0.0794 0.1310 0.1100 0.0025
  10.  
    sigma^2 estimated as 0.007476: log likelihood = 157.86, aic = -283.73。
 

模型检验和总结分析如下:

MA(2):at = Et -0.5645et-1-0.2630ct-2+0.0057,Var(Et)=0.01625;

MA(13)(不可逆):t = Et -1.3068Et-1 -0.6226t-13+0.0067,Var(et)=0.006589;

ARMA(12,2):xt = 0.7343nt-12+Et—0.7436ct-1+0.04576t2+0.0070,Var(et)=0.008091;

ARMA(12,1):xt = 0.7247xt—12+Et-0.7144Et-1+0.0070,Var(ct)=0.008126;

xt = -0.06605056。

构建数据框:

tabl = data.frame("模型"=c("MA(2)","ARMA(12,2)","ARMA(12,1)"),
pred = c(unlist(predict(irmal)[1]), unlist(predict(irma5)[1]), unlist(predict(irma6)[1])),
S.E. = c(unlist(predict(irmal)[2]), unlist(predict(irma5)[2]), unlist(predict(irma6)[2])),
Residuals = c(unlist(predict(irmal)[1])-xt, unlist(predict(irma5)[1])-xt, unlist(predict(irma6)[1])-xt))

数据框内容如下:

模型 pred S.E. Residuals

1 MA(2) 0.006404136 0.12747043 0.07245470

2 ARMA(12,2) -0.127044967 0.08994988 -0.06099441

3 ARMA(12,1) -0.114879301 0.09014648 -0.04882874。

混合ARIMA LSTM模型研究

在时间序列分析领域,准确预测未来趋势一直是一个重要且具有挑战性的任务。本文提出了一种混合模型,该模型结合了自回归积分滑动平均(ARIMA)模型和长短期记忆(LSTM)网络的优势,以提高时间序列预测的准确性。ARIMA模型作为一种经典的统计方法,能够捕捉数据的线性依赖关系,而LSTM网络作为一种深度学习技术,能够处理更复杂的非线性模式和长期依赖关系。

ARIMA模型

ARIMA模型是时间序列预测中常用的方法之一,它通过自回归(AR)、差分(I)和移动平均(MA)三个步骤来构建模型。在本研究中,我们首先对原始数据进行处理,提取收盘价(close)列,并将其分为训练集和测试集。通过对训练集数据进行ARIMA模型训练,我们得到了模型参数,并利用这些参数对未来数据进行了预测。预测结果如图1所示,展示了模型对部分训练数据的拟合情况。

# 数据处理attention_flag = False
train_len = 500
seq_length = 16
num_epochs = 100
# ARIMA模型的训练集和测试集划分
ARIMA_Train = raw_data.loc[:,['close']][0:train_len]
ARIMA_Test =  raw_data.loc[:,['close']][train_len:]
ARIMA_Test_Input = raw_data.loc[:,['date']][train_len:]

在图1中,我们展示了训练集中前100个数据点的收盘价时间序列图。通过对数据的可视化分析,我们可以更好地理解数据的波动特性和潜在的季节性模式。

ARIMA_mean_log = np.log(raw_data.loc[:,['close']])
plt.plot(ARIMA_Train.iloc[:100])

ARIMA LSTM网络结构

LSTM网络是循环神经网络(RNN)的一种特殊类型,它能够记忆长期的信息,非常适合处理时间序列数据。在本研究中,我们首先读取了ARIMA模型的残差数据,然后创建了序列数据,这些数据被用来训练LSTM网络。LSTM网络通过学习序列数据中的模式,能够预测未来的数据点。我们定义了编码器、解码器和注意力机制等网络结构,以提高模型的性能。

LSTM_data = pd.read_csv('residual_result/{}_residual.csv'.format(data_name))
ARIMA_close_prices = LSTM_data['residuals'][train_len:].values.astype(float)
# 创建序列数据
# 数据归一化
scaler = MinMaxScaler()
training_data = scaler.fit_transform(ARIMA_close_prices.reshape(-1,1))
x, y = create_sequences(training_data, seq_length)

在上述代码中,我们首先读取了ARIMA模型的残差数据,并将其转换为浮点数格式。然后,我们定义了一个函数create_sequences来创建序列数据,这些数据将作为LSTM网络的输入。我们还对数据进行了归一化处理,以提高模型的训练效率。

训练ARIMA LSTM模型

在模型训练部分,我们设置了学习率、输入维度、隐藏层大小、层数和输出维度等超参数,并初始化了Seq2Seq模型。我们还使用了均方误差损失函数和Adam优化器来训练模型。在训练过程中,我们对模型进行了多次迭代,并在每个epoch后评估了模型在验证集上的性能。

learning_rate = 0.005
input_dim = 1
hidden_size = 32criterion = torch.nn.MSELoss()    # 均方误差损失函数
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

在上述代码中,我们设置了模型的超参数,并初始化了Seq2Seq模型。我们还定义了损失函数和优化器,这些将用于模型的训练过程。

ARIMA LSTM结果展示

在结果展示部分,我们加载了训练好的模型,并使用它对测试集进行了预测。然后,我们将预测结果与实际数据进行了可视化比较,以评估模型的性能。我们还计算了一些评价指标,如均方误差(MSE)、平均绝对误差(MAE)和平均绝对百分比误差(MAPE),以量化模型的预测准确性。

# 加载模型dataY_plot = dataY.data.numpy()
data_predict = scaler.inverse_transform(data_predict)
dataY_plot = scaler.inverse_transform(dataY_plot)
plt.figure(figsize=(10, 2))
plt.axvline(x=train_size, c='r', linestyle='--')
plt.plot(dataY_plot, label = data_name + ' ' + "实际值")
plt.plot(data_predict, label = data_name + ' ' + "预测值")
plt.suptitle(data_name + ' ' + '预测')
plt.legend()
plt.show()

在图2中,我们展示了模型对测试集的预测结果。可以看到,模型能够较好地拟合实际数据,预测值与实际值之间的差异较小。这表明混合ARIMA LSTM模型在时间序列预测方面具有较高的准确性。

综上所述,混合ARIMA LSTM模型在时间序列预测任务中表现出了良好的性能。通过结合传统统计方法和深度学习技术,该模型能够更准确地捕捉数据中的复杂模式和长期依赖关系。未来的研究可以进一步探索模型参数的优化和模型结构的改进,以提高预测的准确性和泛化能力。

在图3中,我们展示了混合ARIMA LSTM模型在整个数据集上的预测结果,包括训练集、验证集和测试集。可以看到,模型在整个时间序列上的预测结果与实际数据吻合得非常好,这进一步验证了模型的有效性和可靠性。

关于分析师

在此对Zhidong Zhang对本文所作的贡献表示诚挚感谢,他在复旦大学完成了数据科学与大数据技术专业的学位,专注人工智能领域。擅长R语言、Python、SQL、Tableau,以及数据建模,统计推断,数据采集。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/797220.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker-Compose搭建RustDesk服务器

前置条件:电脑安装RustDesk客户端,服务器安装Docker及docker-compose官方文档:安装 :: RustDesk文档操作流程:使用Vim编写docker-compose.yml文件,修改需要的端口,最好按照官方对应的端口来操作,< >内替换成服务器对外的端口。记住挂载文件路径,容器运行后会生成密…

CMake构建学习笔记16-使用VS进行CMake项目的开发

详细介绍了通过Visual Studio 2019 这款IDE进行CMake项目开发过程,能够极大增加C/C++程序的开发效率。目录1. 概论2. 详论2.1 创建工程2.2 加载工程2.3 配置文件2.4 工程配置2.5 调试执行3. 项目案例4. 总结 1. 概论 在之前的系列博文中,我们学习了如何构建第三方的依赖库,也…

USB总线-Linux内核USB3.0主机控制器驱动初始化流程分析(十三)

1.概述 RK3588有2个USB3.0 DRD控制器,2个USB2.0 Host控制器。USB3.0 DRD控制器既可以做Host,也可以做Device,向下兼容USB2.0和USB1.0。USB3.0 DRD控制器的内部结构如下图所示;总线接口为AXI或AHB;USB3.0和USB2.0及USB1.0硬件上独立;USB3.0控制器数字逻辑部分对应SS MAC,…

作业2:个人项目

个人项目-论文查重 一、课程信息这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 熟悉软件开发以及工具的使用、算法的设计、资料的搜集GitHub地址 二、开发环境开发工具 IDEA 2021.3.2项目构建工具 maven单元测试 Junit分词依赖包 hanlp三、…

Linkedin-SRE-中文教程-二-

Linkedin SRE 中文教程(二)原文:School of SRE 协议:CC BY-NC-SA 4.0一些 Python 概念原文:https://linkedin.github.io/school-of-sre/level101/python_web/python-concepts/虽然期望您了解 python 及其基本语法,但是让我们讨论一些基本概念,这将帮助您更好地理解 pyth…

分析负数取模与取余的规则

目录负数"取模"基本概念修正定义取整规则决定商的值取模和取余不一样. 负数"取模"基本概念如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r,且0 <= r < d。其中,q 被称为商,r 被称为余数。 //对应代码 int mai…

Openwrt挂载大容量NTFS磁盘,解决默认挂载不能写入问题,实现samba共享

1. 目的 在OpenWRT上挂载上大容量磁盘(NTFS文件系统),支持读写操作。解决默认挂载仅能读取,不能写入问题。 配置Samba36,实现局域网文件夹共享。 2. 环境架构 ARMv7 Processor rev 1 (v7l)固件版本 OpenWrt 19.07.7内核版本 3.10.33安装插件smbd -v # 检查是否安装了smb …

使用MySQL Workbench进行数据库备份

1、打开MySQL Workbench2、进行数据库连接配置 如果之前连过,会有历史记录,直接点击需要备份的连接即可3、进入主界面后,选择左侧的Administration选项卡,然后点击Data Export;或者点击工具栏的Server——Data Export4、选择要备份的数据库,默认选择所有的表,在objects …

Mininet安装记录

安装环境: Ubuntu虚拟机版本:14.04 Mininet版本:2.3.1b1 1、更改软件镜像源 在设置中进行如下操作:选择国内的镜像站点,如阿里云。 点击关闭后,在弹出的窗口中点击重新载入,等待缓存更新完成。2、下载git 在终端中执行如下命令: sudo apt-get install git没有报错的话,…

Redis运维之监控指标,性能监控,监控方式,响应慢分析

目录1 Redis监控1.1 Redis监控指标1.1.1 性能指标: Performance1.1.2 内存指标: Memory1.1.3 基本活动指标:Basic activity1.1.4 持久性指标: Persistence1.1.5 错误指标:Error1.2 监控方式1.2.1 info1.2.2 性能监控1.2.3 内存监控1.2.4 基本活动指标1.2.5 持久性指标1.2.6 错…

代码随想录算法 - 二叉树4

题目1 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。返回 nums 构建的 …

图的连通性小记

前言 DFS 树 无向图 DFS 树 定义:DFS树 是在图或树结构上进行深度优先搜索时形成的树。在 DFS 过程中,从一个顶点开始,尽可能深地搜索图的分支,直到达到一个没有未访问邻居的顶点,然后回溯到上一个顶点继续搜索。 从点 \(r\) 开始搜索,每次进入一个点 \(i\) 对应的边 \((…