时间序列预测模型-ARIMA原理及Python实现!
⽯晓⽂,中国⼈民⼤学信息学院在读研究⽣,美团外卖算法实习⽣1、数据介绍
我们先来导⼊⼀下我们的数据,顺便画出收盘价数据的折线图:
importpandas aspd
importmatplotlib.pyplot asplt
ChinaBank = pd.read_csv( 'ChinaBank.csv',index_col = 'Date',parse_dates=[ 'Date'])
#ChinaBank.index = pd.to_datetime(ChinaBank.index)
sub = ChinaBank[ '2014-01': '2014-06'][ 'Close']
train = sub.ix[ '2014-01': '2014-03']
diff函数test = sub.ix[ '2014-04': '2014-06']
plt.figure(figsize=( 10, 10))
print(train)
plt.plot(train)
plt.show()
数据如下:
介绍了数据,我们接下来进⼊今天的正题。
2、时间序列平稳性 2.1 平稳性
平稳性就是要求经由样本时间序列所得到的拟合曲线在未来⼀段时间内仍能顺着现有的形态惯性地延续下去。平稳性要求序列的均值和⽅差不发⽣明显变化。
严平稳
严平稳表⽰的分布不随时间的改变⽽改变。如⽩噪声(正太),⽆论怎么取,都是期望为0,⽅差为1
宽平稳
期望与相关系数(依赖性)不变。未来某时刻的t的值Xt就要依赖于它的过去信息,所以需要依赖性。这种依赖性不能有明显的变化。
2.2 差分法
使⽤差分法可以使得数据更平稳,常⽤的⽅法就是⼀阶差分法和⼆阶差分法。
时间序列差分值的求解可以直接通过pandas中的diff函数得到:
ChinaBank[ 'Close_diff_1'] = ChinaBank[ 'Close'].diff( 1)
ChinaBank[ 'Close_diff_1'] = ChinaBank[ 'Close'].diff( 1)
ChinaBank[ 'Close_diff_2'] = ChinaBank[ 'Close_diff_1'].diff( 1)
fig = plt.figure(figsize=( 20, 6))
ax1 = fig.add_subplot( 131)
ax1.plot(ChinaBank[ 'Close'])
ax2 = fig.add_subplot( 132)
ax2.plot(ChinaBank[ 'Close_diff_1'])
ax3 = fig.add_subplot( 133)
ax3.plot(ChinaBank[ 'Close_diff_2'])
plt.show()
绘制的图如下所⽰:
可以看到,基本上时间序列在⼀阶差分的时候就已经接近于平稳序列了。
3、ARIMA模型介绍 3.1 ⾃回归模型AR
⾃回归模型描述当前值与历史值之间的关系,⽤变量⾃⾝的历史时间数据对⾃⾝进⾏预测。⾃回归模型必须满⾜平稳性的要求。
⾃回归模型⾸先需要确定⼀个阶数p,表⽰⽤⼏期的历史值来预测当前值。p阶⾃回归模型的公式定义为:
上式中yt是当前值,u是常数项,p是阶数 ri是⾃相关系数,et是误差。
⾃回归模型有很多的限制:
1、⾃回归模型是⽤⾃⾝的数据进⾏预测
2、时间序列数据必须具有平稳性
3、⾃回归只适⽤于预测与⾃⾝前期相关的现象
3.2 移动平均模型MA
移动平均模型关注的是⾃回归模型中的误差项的累加,q阶⾃回归过程的公式定义如下:
移动平均法能有效地消除预测中的随机波动。
3.3 ⾃回归移动平均模型ARMA
⾃回归模型AR和移动平均模型MA模型相结合,我们就得到了⾃回归移动平均模型ARMA(p,q),计算公式如下:
3.4 差分⾃回归移动平均模型ARIMA
将⾃回归模型、移动平均模型和差分法结合,我们就得到了差分⾃回归移动平均模型ARIMA(p,d,q),其中d是需要对数据进⾏差分的阶数。
4、建⽴ARIMA模型的过程
⼀般来说,建⽴ARIMA模型⼀般有三个阶段,分别是模型识别和定阶、参数估计和模型检验,接下来,我们⼀步步来介绍:
4.1 模型识别和定阶
模型的识别问题和定阶问题,主要是确定p,d,q三个参数,差分的阶数d⼀般通过观察图⽰,1阶或2阶即可。这⾥我们主要介绍p和q的确定。我们⾸先介绍两个函数。
⾃相关函数ACF(autocorrelation function)
⾃相关函数ACF描述的是时间序列观测值与其过去的观测值之间的线性相关性。计算公式如下:
其中k代表滞后期数,如果k=2,则代表yt和yt-2
偏⾃相关函数PACF(partial autocorrelation function)
偏⾃相关函数PACF描述的是在给定中间观测值的条件下,时间序列观测值预期过去的观测值之间的线性相关性。
举个简单的例⼦,假设k=3,那么我们描述的是yt和yt-3之间的相关性,但是这个相关性还受到yt-1和yt-2的影响。PACF 剔除了这个影响,⽽ACF包含这个影响。
拖尾和截尾
拖尾指序列以指数率单调递减或震荡衰减,⽽截尾指序列从某个时点变得⾮常⼩:
出现以下情况,通常视为(偏)⾃相关系数d阶截尾:
1)在最初的d阶明显⼤于2倍标准差范围
2)之后⼏乎95%的(偏)⾃相关系数都落在2倍标准差范围以内
3)且由⾮零⾃相关系数衰减为在零附近⼩值波动的过程⾮常突然
出现以下情况,通常视为(偏)⾃相关系数拖尾:
1)如果有超过5%的样本(偏)⾃相关系数都落⼊2倍标准差范围之外
2)或者是由显著⾮0的(偏)⾃相关系数衰减为⼩值波动的过程⽐较缓慢或⾮常连续。
p,q阶数的确定
根据刚才判定截尾和拖尾的准则,p,q的确定基于如下的规则:
根据不同的截尾和拖尾的情况,我们可以选择AR模型,也可以选择MA模型,当然也可以选择ARIMA模型。接下来,我们就来画⼀下我们数据的拖尾和截尾情况:
importstatsmodels.api assm
fig = plt.figure(figsize=( 12, 8))
ax1 = fig.add_subplot( 211)
fig = sm.graphics.tsa.plot_acf(train, lags= 20,ax=ax1)
ax1.xaxis.set_ticks_position( 'bottom')
fig.tight_layout()
ax2 = fig.add_subplot( 212)
fig = sm.graphics.tsa.plot_pacf(train, lags= 20, ax=ax2)
ax2.xaxis.set_ticks_position( 'bottom')
fig.tight_layout()
plt.show()
结果如下:
哈哈,咱们这个数据⾃相关系数4阶拖尾,偏⾃相关系数2阶截尾,因此可以选择的是AR(2)模型。
4.2 参数估计
通过拖尾和截尾对模型进⾏定阶的⽅法,往往具有很强的主观性。回想我们之前在参数预估的时候往往是怎么做的,不就是损失和正则项的加权么?我们这⾥能不能结合最终的预测误差来确定p,q的阶数呢?在相同的预测误差情况下,根据奥斯卡姆剃⼑准则,模型越⼩是越好的。那么,平衡预测误差和参数个数,我们可以根据信息准则函数法,来确定模型的阶数。预测误差通常⽤平⽅误差即残差平⽅和来表⽰。
常⽤的信息准则函数法有下⾯⼏种:
AIC准则
AIC准则全称为全称是最⼩化信息量准则(Akaike Information Criterion),计算公式如下:
AIC = =2 *(模型参数的个数)-2ln(模型的极⼤似然函数)
BIC准则
AIC准则存在⼀定的不⾜之处。当样本容量很⼤时,在AIC准则中拟合误差提供的信息就要受到样本容量的放⼤,⽽参数个数的惩罚因⼦却和样本容量没关系(⼀直是2),因此当样本容量很⼤时,使⽤AIC准则选择的模型不收敛与真实模型,它通常⽐真实模型所含的未知参数个数要多。BIC(Bayesian InformationCriterion)贝叶斯信息准则弥补了AIC的不⾜,计算公式如下:
BIC = ln(n) * (模型中参数的个数) - 2ln(模型的极⼤似然函数值),n是样本容量
BIC = ln(n) * (模型中参数的个数) - 2ln(模型的极⼤似然函数值),n是样本容量
好了,我们通过类似于⽹格搜索的⽅式来寻我们模型最佳的p,q组合吧,这⾥我们使⽤BIC进⾏试验,AIC同理: #遍历,寻适宜的参数
importitertools
importnumpy asnp
importseaborn assns
p_min = 0
d_min = 0
q_min = 0
p_max = 5
d_max = 0
q_max = 5
# Initialize a DataFrame tostorethe results,,以BIC准则
results_bic = pd.DataFrame(index=['AR{}'.format(i) foriinrange(p_min,p_max+1)],
columns=['MA{}'.format(i) foriinrange(q_min,q_max+1)])
forp,d,q initertools.product(range(p_min,p_max+1),
range(d_min,d_max+1),
range(q_min,q_max+1)):
ifp==0andd==0andq==0:
results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = np.nan
continue
try:
model= sm.tsa.ARIMA(train, order=(p, d, q),
#enforce_stationarity=False,
#enforce_invertibility=False,
)
results = model.fit()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论