原文链接: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)
拟合结果如下:
-
Call:
-
arima(x = logIR,order = c(12,0,2), include.mean = TRUE)
-
Coefficients:
-
ar1 ar2 ar3 ar4 ar5 ar6 ar7 ar8
-
0.0557 -0.1379 -0.1501 -0.0487 -0.1605 -0.0539 -0.1039 -0.0575
-
s.e. 0.1058 0.1109 0.0937 0.0949 0.0902 0.0880 0.0877 0.0871
-
ar9 ar10 ar11 ar12 ma1 ma2 intercept
-
-0.0658 -0.1195 0.0436 0.6035 -0.7995 0.2306 0.0061
-
s.e. 0.0855 0.0820 0.0863 0.0794 0.1310 0.1100 0.0025
-
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,以及数据建模,统计推断,数据采集。