“预测非常困难,特别是关于未来”。丹麦物理学家尼尔斯·波尔(Neils Bohr)很多人都会看到这句名言。预测是这篇博文的主题。在这篇文章中,我们将介绍流行的ARIMA预测模型,以预测库存的回报,并演示使用R编程的ARIMA建模的逐步过程。
时间序列中的预测模型是什么?
预测涉及使用其历史数据点预测变量的值,或者还可以涉及在给定另一个变量的值的变化的情况下预测一个变量的变化。预测方法主要分为定性预测和定量预测。时间序列预测属于定量预测的范畴,其中统计原理和概念应用于变量的给定历史数据以预测同一变量的未来值。使用的一些时间序列预测技术包括:
- 自回归模型(AR)
- 移动平均模型(MA)
- 季节回归模型
- 分布式滞后模型
什么是自回归移动平均模型(ARIMA)?
ARIMA代表Autoregressive Integrated Moving Average。ARIMA也被称为Box-Jenkins方法。Box和Jenkins声称,通过对系列Y t进行差分,可以使非平稳数据静止。Y t的一般模型写成,
ARIMA模型结合了三种基本方法:
- 自回归(AR) - 在自回归的一个给定的时间序列数据在他们自己的滞后值,这是由在模型中的“P”值表示回归的值。
- 差分(I-for Integrated) - 这涉及对时间序列数据进行差分以消除趋势并将非平稳时间序列转换为静态时间序列。这由模型中的“d”值表示。如果d = 1,则查看两个时间序列条目之间的差异,如果d = 2,则查看在d = 1处获得的差异的差异,等等。
- 移动平均线(MA) - 模型的移动平均性质由“q”值表示,“q”值是误差项的滞后值的数量。
该模型称为自回归整合移动平均值或Y t的 ARIMA(p,d,q)。我们将按照下面列举的步骤来构建我们的模型。
第1步:测试和确保平稳性
要使用Box-Jenkins方法对时间序列进行建模,该系列必须是静止的。静止时间序列表示没有趋势的时间序列,其中一个具有恒定的均值和随时间的方差,这使得预测值变得容易。
测试平稳性 -我们使用Augmented Dickey-Fuller单位根测试测试平稳性。对于静止的时间序列,由ADF测试得到的p值必须小于0.05或5%。如果p值大于0.05或5%,则可以得出结论:时间序列具有单位根,这意味着它是一个非平稳过程。
差分 -为了将非平稳过程转换为静止过程,我们应用差分方法。区分时间序列意味着找出时间序列数据的连续值之间的差异。差异值形成新的时间序列数据集,可以对其进行测试以发现新的相关性或其他有趣的统计特性。
我们可以连续多次应用差分方法,产生“第一差异”,“二阶差异”等。
在我们进行下一步之前,我们应用适当的差分顺序(d)使时间序列静止。
第2步:识别p和q
在此步骤中,我们通过使用自相关函数(ACF)和部分自相关函数(PACF)来确定自回归(AR)和移动平均(MA)过程的适当顺序。有关ACF和PACF功能的说明,请参阅我们的博客“从时间序列开始”。
识别AR模型的p阶
对于AR模型,ACF将以指数方式衰减,PACF将用于识别AR模型的顺序(p)。如果我们在PACF上的滞后1处有一个显着峰值,那么我们有一个1阶AR模型,即AR(1)。如果我们在PACF上有滞后1,2和3的显着峰值,那么我们有一个3阶AR模型,即AR(3)。
识别MA模型的q阶
对于MA模型,PACF将以指数方式衰减,ACF图将用于识别MA过程的顺序。如果我们在ACF上的滞后1处有一个显着的峰值,那么我们有一个1阶的MA模型,即MA(1)。如果我们在ACF上的滞后1,2和3处有显着的峰值,那么我们有一个3阶的MA模型,即MA(3)。
第3步:估算和预测
一旦我们确定了参数(p,d,q),我们就可以估算ARIMA模型在训练数据集上的准确性,然后使用拟合模型使用预测函数预测测试数据集的值。最后,我们交叉检查我们的预测值是否与实际值一致。
使用R编程构建ARIMA模型
现在,让我们按照解释的步骤在R中构建ARIMA模型。有许多软件包可用于时间序列分析和预测。我们加载相关的R包进行时间序列分析,并从雅虎财务中提取股票数据。
#从雅虎财经中提取数据 getSymbols('TECHM.NS',from ='2012-01-01',to =''2015-01-01') #选择相关的收盘价系列 stock_prices = TECHM.NS [,4]
在下一步中,我们计算股票的对数收益,因为我们希望ARIMA模型预测日志收益而不是股票价格。我们还使用绘图函数绘制了日志返回系列。
#计算股票 一阶差分 stock = diff(log(stock_prices),lag = 1) plot(stock,type ='l',main ='log return plot')
接下来,我们对返回系列数据调用ADF测试以检查平稳性。来自ADF测试的p值为0.01告诉我们该系列是静止的。如果系列是非静止的,我们首先会对回归系列进行区分,使其保持静止。
在下一步中,我们修复了一个断点,该断点将用于将返回数据集拆分为代码中的两部分。
#将数据集拆分为两部分 - 训练和测试
acf.stock = acf(stock [c(1:breakpoint),],main ='ACF Plot',lag.max = 100)
我们可以观察这些图并得出自回归(AR)订单和移动平均(MA)订单。
我们知道,对于AR模型,ACF将呈指数衰减,PACF图将用于识别AR模型的阶数(p)。对于MA模型,PACF将以指数方式衰减,ACF图将用于识别MA模型的顺序(q)。从这些图中我们选择AR order = 2和MA order = 2.因此,我们的ARIMA参数将是(2,0,2)。
我们的目标是从断点开始预测整个回报序列。我们将在R中使用For循环语句,在此循环中,我们将预测测试数据集中每个数据点的返回值。
在下面给出的代码中,我们首先初始化一个系列,它将存储实际的回报,另一个系列来存储预测的回报。在For循环中,我们首先根据动态断点形成训练数据集和测试数据集。
我们在训练数据集上调用arima函数,其指定的顺序为(2,0,2)。我们使用这个拟合模型通过使用forecast.Arima函数来预测下一个数据点。该功能设置为99%置信水平。可以使用置信度参数来增强模型。我们将使用模型中的预测点估计。预测函数中的“h”参数表示我们要预测的值的数量,在这种情况下,第二天返回。
我们可以使用摘要功能确认ARIMA模型的结果在可接受的范围内。在最后一部分中,我们将每个预测收益和实际收益分别附加到预测收益序列和实际收益序列。
#初始化实际日志返回的xts对象 Actual_series = xts(0,as.Date(“2014-11-25”,“%Y-%m-%d”)) #初始化预测返回系列的数据帧 fit = arima(stock_train,order = c(2,0,2),include.mean = FALSE) #绘制残差的acf图 arima.forecast = forecast.Arima(fit,h = 1,level = 99) #绘制预测 #为预测期创建一系列预测回报 forecasted_series = rbind(forecasted_series,arima.forecast $ mean [1]) #为预测期创建一系列实际回报 Actual_series = c(Actual_series,xts(Actual_return)) RM(Actual_return) }
在我们转到代码的最后部分之前,让我们从测试数据集中检查ARIMA模型的结果以获取样本数据点。
从得到的系数,返回方程可写为:
Y t = 0.6072 * Y (t-1) -0.8818 * Y (t-2) -0.5447ε (t-1)+0.8972ε (t-2)
系数给出了标准误差,这需要在可接受的范围内。Akaike信息标准(AIC)评分是ARIMA模型准确性的良好指标。模型更好地降低AIC得分。我们还可以查看残差的ACF图; 良好的ARIMA模型的自相关性将低于阈值限制。预测的点返回为-0.001326978,在输出的最后一行中给出。
让我们通过比较预测回报与实际回报来检查ARIMA模型的准确性。代码的最后一部分计算此准确性信息。
#调整实际返回系列的长度 Actual_series = Actual_series [-1] #创建预测系列的时间序列对象 forecasted_series = xts(forecasted_series,index(Actual_series)) #创建两个回归系列的图 - 实际与预测 #创建一个表格,用于预测的准确性 comparsion = merge(Actual_series,forecasted_series) comparsion $ Accuracy = sign(comparsion $ Actual_series)== sign(comparsion $ Precasted) #计算准确度百分比指标 Accuracy_percentage = sum(comparsion $ Accuracy == 1)* 100 / length(comparsion $ Accuracy)
如果预测收益的符号等于实际收益的符号,我们已为其指定了正准确度得分。模型的准确率百分比达到55%左右,看起来像是一个不错的数字。可以尝试运行模型以获得(p,d,q)的其他可能组合,或者使用auto.arima函数选择最佳的最佳参数来运行模型。
结论
最后,在本文中,我们介绍了ARIMA模型,并将其应用于使用R编程语言预测股票价格回报。我们还通过实际回报检查了我们的预测结果。在我们即将发布的帖子中,我们将介绍其他时间序列预测技术,并使用Python / R编程语言进行尝试。