ARIMA模型的部分python实现

主要参考了这篇博文
https://blog.csdn.net/kunlong0909/article/details/52756821

所用包

pandas,numpy,statmodels,matplotlib 几个实现统计功能的常用python包,python版本为3.5.1

ARIMA模型原理

1、ARIMA的含义。ARIMA包含3个部分,即AR、I、MA。AR——表示auto regression,即自回归模型;I——表示integration,即单整阶数,时间序列模型必须是平稳性序列才能建立计量模型,ARIMA模型作为时间序列模型也不例外,因此首先要对时间序列进行单位根检验,如果是非平稳序列,就要通过差分来转化为平稳序列,经过几次差分转化为平稳序列,就称为几阶单整;MA——表示moving average,即移动平均模型。可见,ARIMA模型实际上是AR模型和MA模型的组合。

ARIMA模型与ARMA模型的区别:ARMA模型是针对平稳时间序列建立的模型。ARIMA模型是针对非平稳时间序列建模。换句话说,非平稳时间序列要建立ARMA模型,首先需要经过差分转化为平稳时间序列,然后建立ARMA模型

2、ARIMA模型的原理。正如前面介绍,ARIMA模型实际上是AR模型和MA模型的组合。

3、建立ARIMA模型需要解决的3个问题。由以上分析可知,建立一个ARIMA模型需要解决以下3个问题:

(1)将非平稳序列转化为平稳序列。

(2)确定模型的形式。即模型属于AR、MA、ARMA中的哪一种。这主要是通过模型识别来解决的。

(3)确定变量的滞后阶数。即和的数字。这也是通过模型识别完成的。

4、ARIMA模型的识别

ARIMA模型识别的工具为自相关系数(AC)和偏自相关系数(PAC)。

自相关系数:时间序列滞后k阶的自相关系数由下式估计:

其中是序列的样本均值,这是相距k期值的相关系数。称为时间序列的自相关系数,自相关系数可以部分的刻画一个随机过程的形式。它表明序列的邻近数据之间存在多大程度的相关性。

偏自相关系数:偏自相关系数是在给定的条件下,之间的条件相关性。其相关程度用偏自相关系数度量。在k阶滞后下估计偏自相关系数的计算公式为:

其中是在k阶滞后时的自相关系数估计值。称为偏相关是因为它度量了k期间距的相关而不考虑k-1期的相关。如果这种自相关的形式可由滞后小于k阶的自相关表示,那么偏相关在k期滞后下的值趋于0。

识别:

AR(p)模型的自相关系数是随着k的增加而呈现指数衰减或者震荡式的衰减,具体的衰减形式取决于AR(p)模型滞后项的系数;AR(p)模型的偏自相关系数是p阶截尾的。因此可以通过识别AR(p)模型的偏自相关系数的个数来确定AR(p)模型的阶数p。

MA(q)模型的自相关系数在q步以后是截尾的。MA(q)模型的偏自相关系数一定呈现出拖尾的衰减形式。

ARMA(p,q)模型是AR(p)模型和MA(q)模型的组合模型,因此ARMA(p,q)的自相关系数是AR(p)自相关系数和MA(q)的自相关系数的混合物。当p=0时,它具有截尾性质;当q=0时,它具有拖尾性质;当p,q都不为0,它具有拖尾性质。
通常,ARMA(p,q)过程的偏自相关系数可能在p阶滞后前有几项明显的尖柱,但从p阶滞后项开始逐渐趋于0;而它的自相关系数则是在q阶滞后前有几项明显的尖柱,从q阶滞后项开始逐渐趋于0。

代码实现

from __future__ import print_function
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import statsmodels.api as sm

实际在python3中第一行可以不要。
这里使用的数据是1977至2016年我国粮食产量,已经是个list

dta=[1947.5,1900,2134.5,2148.5,2314.5,2217,2904,2983.5,2710.5
,2545.7,2980.9,2663,3149.4,3303.7,3010.3,3109.6,3639,3253.8,3466.5
,3839.9,3894.66 ,4009.61 ,4253.25 ,4101.50 ,4119.88 ,4209.98 ,3569.47 ,4260.00 ,4582.00 ,5112.30,5245.22 ,5365.48 ,5389.00 ,5437.10 
,5542.50 ,5638.60 ,5713.69 ,5772.30 ,6067.10 ,5946.60 ]

对已导入的数据做时序图,其实在导入数据时遇到了一个很低端的问题,因为未指定哪一列是产量的序列导致时序图无法做出来(电脑不知道该选哪个),报错为“x必须是一维而不是二维”,后来将数据直接以list形式录入变解决了,实际年份是直接自动填充的。

dta=pd.Series(dta)
dta.index=pd.Index(sm.tsa.datetools.dates_from_range('1977','2016'))
dta.plot(figsize=(12,8))
plt.show()

接着进行差分操作,通过观察图像判断是否平稳,再结合差分后的自相关图和偏自相关图进行定阶操作

fig = plt.figure(figsize=(12,8))#一阶差分图
ax1= fig.add_subplot(111)
diff1 = dta.diff(1)
diff1.plot(ax=ax1)
plt.show()

dta1= dta.diff(1)#做acf和pacf图
dta2=dta1.dropna()#差分的数据记得使用dropna方法去掉空值,否则acf和pacf图很可能出不来
fig = plt.figure(figsize=(12,8))
ax1=fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(dta2,lags=20,ax=ax1)#lags为滞后阶数,此处为20
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(dta2,lags=20,ax=ax2)
plt.show()

arma_mod20 = sm.tsa.ARMA(dta,(1,3)).fit()
#拟合模型,经过尝试后(1,1),(1,2),(1,3)比较符合
print(arma_mod20.aic,arma_mod20.bic,arma_mod20.hqic)


predict_sunspots = arma_mod20.predict('2016', '2021', dynamic=True)#预测模型并作图
print(predict_sunspots)
fig, ax = plt.subplots(figsize=(12, 8))
ax = dta.ix['1977':].plot(ax=ax)
predict_sunspots.plot(ax=ax)
plt.show()

主要旨在实现拟合模型和预测,对于模型是否合适及其检验并未做的详细,具体可参考开头那篇文章。

你可能感兴趣的:(ARIMA模型的部分python实现)