骑行的掌柜J
我用ARIMA模型对老师一开始的那组时间序列进行了分析预测,因为字数限制:省略一开始的数据加载和最后的预测步骤,但是加入对差分次数d的查找、找ARIMA模型的p、q值和模型检验三个步骤,希望对大家有用,谢谢
# -*- coding: utf-8 -*-
# 用 ARIMA 进行时间序列预测
import numpy as np
from statsmodels.graphics.tsaplots import acf,pacf,plot_acf,plot_pacf
#2.下面我们先对非平稳时间序列进行时间序列的差分,找出适合的差分次数
#fig = plt.figure(figsize=(12, 8))
#ax1 = fig.add_subplot(111)
#diff1 = data.diff(1)
#diff1.plot(ax=ax1)
#这里是做了1阶差分,可以看出时间序列的均值和方差基本平稳,
#这里我们使用一阶差分的时间序列,把上面代码注释掉
#3.接下来我们要找到ARIMA模型中合适的p和q值:
data = data.diff(1)
data.dropna(inplace=True)
#第一步:先检查平稳序列的自相关图和偏自相关图
fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(data,lags=40,ax=ax1)
#lags 表示滞后的阶数,下面分别得到acf 图和pacf 图
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(data, lags=40,ax=ax2)
#由下图我们可以分别用ARMA(0,1)模型、ARMA(7,0)模型、ARMA(7,1)模型等来拟合找出最佳模型:
#第三步:找出最佳模型ARMA
arma_mod1 = sm.tsa.ARMA(data,(7,0)).fit()
print(arma_mod1.aic, arma_mod1.bic, arma_mod1.hqic)
arma_mod2 = sm.tsa.ARMA(data,(0,1)).fit()
print(arma_mod2.aic, arma_mod2.bic, arma_mod2.hqic)
arma_mod3 = sm.tsa.ARMA(data,(7,1)).fit()
print(arma_mod3.aic, arma_mod3.bic, arma_mod3.hqic)
arma_mod4 = sm.tsa.ARMA(data,(8,0)).fit()
print(arma_mod4.aic, arma_mod4.bic, arma_mod4.hqic)
#由上面可以看出ARMA(7,0)模型最佳
#第四步:进行模型检验,首先对ARMA(7,0)模型所产生的残差做自相关图
resid = arma_mod1.resid
#一定要加上这个变量赋值语句,不然会报错resid is not defined
fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(),lags=40,ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(resid, lags=40,ax=ax2)
#接着做德宾-沃森(D-W)检验
print(sm.stats.durbin_watson(arma_mod1.resid.values))
#得出来结果是不存在自相关性的
#再观察是否符合正态分布,这里用qq图
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)
fig = qqplot(resid, line='q',ax=ax, fit=True)
#最后用Ljung-Box检验:检验的结果就是看最后一列前十二行的检验概率(一般观察滞后1~12阶)
r,q,p = sm.tsa.acf(resid.values.squeeze(),qstat=True)
data1 = np.c_[range(1,41), r[1:], q, p]
table= pd.DataFrame(data1, columns=[ 'lag','AC','Q','Prob(>Q)'])
print(table.set_index('lag'))