时间序列分析方法整理总结


时间序列分析方法1主要有:时间序列分解模型、指数平滑模型、ARIMA模型。

一、方法简介

方法 简介
时间序列分解模型 该模型认为某一经济变量时间序列Yt主要由长期趋势T、季节变动S、周期变动C和不规则变动I四种因素构成,Yt是这四种因素的函数。 Y t = f ( T t , S t , C t , I t ) Y_t=f(T_t,S_t,C_t,I_t) . 时间序列分解预测的基本原理是通过将原始时间序列分解为T、S、C、I因素,然后通过对各个因素的预测来合成对经济变量的预测。
根据序列的特点,可以构建加法模型和乘法模型。
指数平滑模型 该方法是一种根据时间序列自身的成长发展趋势进行外推的预测方法,其基本模型为: Y ^ t + 1 = α Y t + ( 1 α ) Y ^ t \hat{Y}_{t+1}=\alpha Y_t +(1-\alpha)\hat{Y}_t ,其中 Y ^ t + 1 Y ^ t \hat{Y}_{t+1},\hat{Y}_t 分别为时间序列第t+1,t期的预测值。
python可以实现简单指数平滑法、Holt双参数线性指数平滑法和Winters线性和季节性指数平滑法。
ARIMA模型 是一种仅适用时间序列的过去值及随机扰动项建立的随机时间序列模型,它是建立在平稳时间序列的ARMA模型的基础上的。我们在研究经济社会问题时遇到的大多数都是具有明显长期趋势或季节变动的非平稳时间序列,这时需要对原序列进行差分运算使其变动平稳,然后对差分序列建立ARMA模型,这样得到关于原序列的模型成为ARIMA模型。
Python可以实现AR模型、MA模型、ARMA模型及ARIMA模型
GARCH模型 也称为异方差模型,适用于金融时间序列

数据示例

在这里插入图片描述

二、ARIMA模型python建模过程2

1 添加基础库

# 添加基础库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.graphics.api import qqplot
from statsmodels.graphics.tsaplots import plot_acf # 自相关图 函数
from statsmodels.tsa.stattools import adfuller as ADF # 平稳性检验
from statsmodels.graphics.tsaplots import plot_pacf  # 偏自相关图 函数
from statsmodels.stats.diagnostic import acorr_ljungbox # 白噪声检验 函数

2 读取数据

# 获取数据
data = pd.read_excel(r'arima_data.xls',index_col=0) # 指定日期列为索引,pandas自动将‘日期’列识别为Datetime格式
print('数据样例:\n',data.head())
print('\n数据格式:',data.dtypes)

3 绘制时间序列图

# 绘制时间序列图
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号
data.plot()
plt.show()

在这里插入图片描述

4 自相关

# 绘制自相关图,判断序列是否自相关
plot_acf(data)
plt.show()

在这里插入图片描述
由自相关图可以看出,在3阶后才落入区间内,并且自相关系数长期大于零,显示出很强的自相关性。

5 平稳性检验

# 平稳性检验
print(r'原始序列的ADF检验结果为:',ADF(data['销量']))
# 返回值依次为 adf 、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore

原始序列的ADF检验结果为: (1.8137710150945268, 0.9983759421514264, 10, 26, {‘1%’: -3.7112123008648155, ‘5%’: -2.981246804733728, ‘10%’: -2.6300945562130176}, 299.46989866024177)

6 时间序列的差分d

ARIMA模型对时间序列的要求是平稳型。因此当得到一个非平稳的时间序列时,首先要做的是时间序列的差分,直到得到一个平稳时间序列。如果对时间序列做d次差分才能得到一个平稳序列,那么可以使用ARIMA(p,d,q)模型,其中d是差分次数。

# 时间序列的差分d
D_data = data.diff().dropna()
D_data.columns = ['销量一次差分']
D_data.plot() #时序图
plt.show()

在这里插入图片描述

# 自相关图
plot_acf(D_data)
plt.show()

在这里插入图片描述
差分后的序列迅速落入区间,并呈现向0靠拢的趋势,序列没有自相关性

# 偏自相关检验
plot_pacf(D_data)
plt.show()

在这里插入图片描述
由偏自相关图可以看出,差分后的序列也没有显示出偏自相关性

# 平稳性检验
print('差分序列的ADF检验结果为:',ADF(D_data['销量一次差分']))

差分序列的ADF检验结果为: (-3.1560562366723537, 0.022673435440048798, 0, 35, {‘1%’: -3.6327426647230316, ‘5%’: -2.9485102040816327, ‘10%’: -2.6130173469387756}, 287.5909090780334)

# 白噪声检验
print('差分序列的白噪声检验结果为:',acorr_ljungbox(D_data,lags=1)) # lags表示滞后的阶数

差分序列的白噪声检验结果为: (array([11.30402222]), array([0.00077339]))。
通过白噪声检验,序列为白噪声序列。

7 合适的p,q

得到平稳时间序列后,接下来就是选择合适的ARIMA模型,即确定ARIMA模型中合适的p,q

# 第一步,要先检查平稳时间序列的自相关图和偏自相关图

# 模型定阶,确定合适的p,q
dta = data.diff(1)[1:]
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig1 = plot_acf(dta['销量'],lags=10,ax=ax1) # lags表示滞后的阶数
ax2 = fig.add_subplot(212)
fig2 = plot_pacf(dta['销量'],lags=10,ax=ax2)
plt.show()

在这里插入图片描述
通过两图观察得到:

  • 自相关图显示 滞后1阶超出了置信边界
  • 偏相关图显示在滞后1阶时的偏自相关系数超出了置信边界,从lag 1滞后偏自相关系数值缩小至0

则有以下模型可以供选择:

  • ARMA(0,1)模型:即自相关图在滞后1阶之后缩小为0,且偏自相关缩小至0,则是一个阶数q=2的移动平均模型
  • ARMA(1,0)模型:即偏自相关图在滞后1阶之后缩小为0,且自相关缩小至0,则是一个阶数p=1的自回归模型

针对可供选择的模型,通常采用ARMA模型的AIC法则,AIC鼓励数据拟合的优良性,但应尽量避免出现过度拟合的情况;赤池信息准则的方法是寻找可以最好地解释数据但包含最少自由参数的模型。

# AIC、BIC、HQ,统计量检验
arma_mod01 = sm.tsa.ARMA(dta,(0,1)).fit()
print('ARMA(0,1)模型:\nAIC:',arma_mod01.aic,'\nBIC:',arma_mod01.bic,'\nHQ统计量:',arma_mod01.hqic)

arma_mod10 = sm.tsa.ARMA(dta,(1,0)).fit()
print('ARMA(1,0)模型:\nAIC:',arma_mod10.aic,'\nBIC:',arma_mod10.bic,'\nHQ统计量:',arma_mod10.hqic)

ARMA(0,1)模型:
AIC: 417.7595253867189
BIC: 422.51008220208723
HQ统计量: 419.4175969547745
ARMA(1,0)模型:
AIC: 418.8777193331795
BIC: 423.62827614854785
HQ统计量: 420.53579090123515

对比发现,ARMA(0,1)的aic,bic,hqic均最小,因此是最佳模型

8 模型检验

对于选择的模型,观察ARMA模型的残差是否是平均值为0且方差为常数(服从零均值、方差不变的正态分布),同时也要观察连续残差是否(自)相关。

# 残差QQ图
resid = arma_mod01.resid
fig = plt.figure(figsize=(10,6))
ax = fig.add_subplot(111)
qqplot(resid,line='q',ax=ax,fit=True)
plt.show()

在这里插入图片描述

# 残差自相关检验
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
plot_acf(resid.values.squeeze(),lags=10,ax=ax1)   # squeeze 函数:从数组的形状中删除单维度条目,即把shape中为1的维度去掉
ax2 = fig.add_subplot(212)
plot_pacf(resid.values.squeeze(),lags=10,ax=ax2)
plt.show()

在这里插入图片描述

# D-W检验
'''
目前检验自相关性最常用的方法,但只适用于检验一阶自相关性。
- DW=0,存在正自相关
- DW=4,存在负自相关
- DW=2,不存在(一阶)自相关
'''
print('DW检验值:',sm.stats.durbin_watson(resid.values))

DW检验值:1.9734861502397292

Ljung-Box检验

Ljung-Box检验是对随机性的检验,或者说是对时间序列是否存在滞后相关的一种统计检验。LB检验是基于一系列滞后阶数,判断序列总体的相关性或者随机性是否存在。
而ACF或者PACF都仅仅考虑是否存在某一特定滞后阶数的相关(对于滞后相关的检验,常用的方法还是计算ACF和PACF并观察其图像)

时间序列中一个最基本的模型就是高斯白噪声序列。对于ARIMA模型,其残差被假定为高斯白噪声序列,因此当用ARIMA模型去拟合数据时,拟合后要对残差的估计序列进行LB检验,判断其是否是高斯白噪声,如果不是,那么说明ARIMA模型也许并不是一个适合样本的模型。

# Ljung-Box检验
r,q,p = sm.tsa.acf(resid.values.squeeze(),qstat=True)
datap = np.c_[range(1,36),r[1:],q,p]
table = pd.DataFrame(datap,columns=['lag','AC','Q','Prob(>Q)'])
print(table.set_index('lag'))

在这里插入图片描述
检验的结果就是看最后一列前12行的检验概率(一般观察滞后1~12阶),如果相关系数与零没有显著差异,即为白噪声序列

9 模型预测

对未来9日的数据进行预测

# 预测
predict_y = arma_mod01.predict('2015-2-07','2015-2-15',dynamic=True)
fig= plt.figure(figsize=(12,8))
print('差分预测值:',predict_y)

predict_y[0] += data['2015-2-06':]['销量']
data = pd.DataFrame(data)
for i in range(len(predict_y)-1):
    predict_y[i+1] = predict_y[i]+predict_y[i+1]
print('预测值:',predict_y)
ax = data.ix['2015':].plot()
predict_y.plot(ax=ax)
plt.show()

在这里插入图片描述
参考资料


  1. 安秀梅, 肖尧. 跨年度财政收支预测方法研究——以北京市财政收入预测为例[J]. 经济研究参考, 2017, 000(050):40-49. ↩︎

  2. 书名:Python与数据挖掘,作者:张良均 杨海宏 何子健 杨征 等,出版社:机械工业出版社,出版时间:2016-11,ISBN:9787111552611 ↩︎

猜你喜欢

转载自blog.csdn.net/weixin_42521211/article/details/106855797
今日推荐