赞
踩
最近我们被客户要求撰写关于时间序列预测的研究报告,包括一些图形和统计输出。
使用ARIMA模型,您可以使用序列过去的值预测时间序列。在本文中,我们从头开始构建了一个最佳ARIMA模型,并将其扩展到Seasonal ARIMA(SARIMA)和SARIMAX模型。
时间序列是在定期时间间隔内记录度量的序列。
根据频率,时间序列可以是每年(例如:年度预算),每季度(例如:支出),每周(例如:销售数量),每天(例如天气),每小时(例如:股票价格),分钟(例如:来电提示中的呼入电话),甚至是几秒钟(例如:网络流量)。
因为预测时间序列(如需求和销售)通常具有巨大的商业价值。
在大多数制造公司中,它驱动基本的业务计划,采购和生产活动。预测中的任何错误都会扩散到整个供应链或与此相关的任何业务环境中。因此,准确地进行预测很重要,以节省成本,这对于成功至关重要。
不仅在制造业中,时间序列预测背后的技术和概念还适用于任何业务。
现在,预测时间序列可以大致分为两种类型。
如果仅使用时间序列的先前值来预测其未来值,则称为 单变量时间序列预测。
如果您使用序列以外的其他预测变量(也称为外生变量)进行预测,则称为 多变量时间序列预测。
这篇文章重点介绍一种称为ARIMA 建模的特殊类型的预测方法 。
ARIMA是一种预测算法,其基于以下思想:时间序列的过去值中的信息可以单独用于预测未来值。
那么ARIMA模型到底是什么?
ARIMA是一类模型,可以根据自身的过去值(即自身的滞后和滞后的预测误差)“解释”给定的时间序列,因此可以使用方程式预测未来价值。
任何具有模式且不是随机白噪声的“非季节性”时间序列都可以使用ARIMA模型进行建模。
ARIMA模型的特征在于3个项:p,d,q
p是AR项
q是MA项
d是使时间序列平稳所需的差分阶数
如果时间序列具有季节性模式,则需要添加季节性条件,该时间序列将变成SARIMA(“季节性ARIMA”的缩写)。一旦完成ARIMA。
那么,“AR项的阶数”到底意味着什么?我们先来看一下“ d”。
建立ARIMA模型的第一步是 使时间序列平稳。
为什么?
因为ARIMA中的“自回归”一词意味着它是一个 线性回归模型 ,使用自己的滞后作为预测因子。如您所知,线性回归模型在预测变量不相关且彼此独立时最有效。
那么如何使一序列平稳呢?
最常见的方法是加以差分。即,从当前值中减去先前的值。
因此,d的值是使序列平稳所需的最小差分阶数。如果时间序列已经平稳,则d = 0。
接下来,什么是“ p”和“ q”?
“ p”是“自回归”(AR)项的阶数。它指的是要用作预测变量的Y的滞后阶数。而“ q”是“移动平均”(MA)项的阶数。它是指应输入ARIMA模型的滞后预测误差的数量。
那么什么是AR和MA模型?AR和MA模型的实际数学公式是什么?
AR模型是Yt仅取决于其自身滞后的模型。也就是说,Yt是“ Yt滞后”的函数。
同样,纯 移动平均线(仅MA)模型 是Yt仅取决于滞后预测误差的模型。
误差项是各个滞后的自回归模型的误差。误差Et和E(t-1)是来自以下方程式的误差:
那分别是AR和MA模型。
那么ARIMA模型的方程是什么样的呢?
ARIMA模型是这样的模型,其中时间序列至少差分一次以使其平稳,然后将AR和MA项组合在一起。因此,等式变为:
因此,目的是识别p,d和q的值。
进行差分的目的是使时间序列平稳。
但是您需要注意不要使序列过分差分。因为,超差分序列可能仍然是平稳的,这反过来将影响模型参数。
那么如何确定正确的差分阶数呢?
正确的差分阶数是获得近似平稳序列的最小差分,该序列围绕定义的平均值波动,并且ACF曲线相当快地达到零。
如果自相关对于许多阶数之后(10个或更多)为正,则该序列需要进一步求差。
在这种情况下,你不能真正确定两个差分阶数之间的差,然后选择在差分序列中给出最小标准偏差的阶数。
让我们来看一个例子。
首先,我将使用Augmented Dickey Fuller测试()检查该序列是否平稳。
因为,仅当序列非平稳时才需要进行差分。否则,不需要差分,即d = 0。
ADF检验的零假设是时间序列是非平稳的。因此,如果检验的p值小于显着性水平(0.05),则拒绝原假设,并推断时间序列确实是平稳的。
因此,在我们的情况下,如果P值> 0.05,我们将继续寻找差分的阶数。
- from statsmodels.tsa.stattools import adfuller
- from numpy import log
- result = adfuller(df.value.dropna())
- print('ADF Statistic: %f' % result[0])
- print('p-value: %f' % result[1])
- ADF Statistic: -2.464240
- p-value: 0.124419
由于P值大于显着性水平,因此让我们对序列进行差分,看看自相关图的样子。
- import numpy as np, pandas as pd
- from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
- import matplotlib.pyplot as plt
- plt.rcParams.update({'figure.figsize':(9,7), 'figure.dpi':120})
-
- # 导入数据
- df = pd.read_csv('wwwusage.csv', names=['value'], header=0)
-
- # 原始数据
- fig, axes = plt.subplots(3, 2, sharex=True)
- axes[0, 0].plot(df.value); axes[0, 0].set_title('Original Series')
- plot_acf(df.value, ax=axes[0, 1])
-
- # 一阶差分
- axes[1, 0].plot(df.value.diff()); axes[1, 0].set_title('1st Order Differencing')
- plot_acf(df.value.diff().dropna(), ax=axes[1, 1])
-
- # 二阶差分
- axes[2, 0].plot(df.value.diff().diff()); axes[2, 0].set_title('2nd Order Differencing')
- plot_acf(df.value.diff().diff().dropna(), ax=axes[2, 1])
-
- plt.show()
对于以上序列,时间序列达到平稳,具有两个不同的阶数。但是,在查看第二次差分的自相关图时,滞后会很快进入负值区域,这表明该序列可能已经过差分。
因此,即使该序列不是完全平稳的(平稳性较弱),我也将暂时将差分的阶数设置为1。
-
- ## Adf 检验
- ndiffs(y, test='adf') # 2
-
- # KPSS 检验
- ndiffs(y, test='kpss') # 0
-
- # PP 检验:
- ndiffs(y, test='pp') # 2
2 0 2
下一步是确定模型是否需要AR。您可以通过检查偏自相关(PACF)图来找出所需的AR阶数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。