时序模式

常用时间序列模型如下:

模型名称

描述

平滑法

利用修匀技术,削弱短期随机波动的影响,包括移动平均法和指数平滑法

趋势拟合法

建立回归模型,分为线性拟合和曲线拟合

组合模型

长期趋势、季节变动、周期变动和不规则变动,分为加法模型和乘法模型

AR模型

以前p期的序列值为自变量建立线性回归模型

MA模型

以前q期随机扰动为自变量建立线性回归模型

ARMA模型

AR+MA综合

ARIMA模型

差分平稳序列

ARCH模型

序列具有异方差性并且异方差函数短期自相关

GARCH模型

广义ARCH模型,更能反映实际序列中的长期记忆性、信息的非对称性等性质

时间序列的预处理

  • 白噪声序列(纯随机序列):序列的各项之间没有任何相关关系,没有信息可提取的平稳序列
  • 平稳非白噪声序列:常数均值和方差
  • 非平稳序列:均值和方差不稳定,先转变为平稳序列,再进行分析

1.平稳性检验

(1)时序图检验,序列值始终在一个常数附近随机波动,而且波动的范围有界;如果有明显的趋势性或者周期性,那它通常不是平稳序列。
(2)自相关图检验,平稳序列具有短期相关性,随着延迟期数k的增加,平稳序列的自相关系数(延迟k期)会比较快的衰减趋向于零,并在零附近随机波动,而非平稳序列的自相关系数衰减的速度比较慢。
(3)单位根检验,如果存在单位根就是非平稳时间序列。

2.纯随机性检验

也称白噪声检验,一般是构造检验统计量来检验序列的纯随机性,常用的统计量有Q统计量、LB统计量,由样本各延迟期数的自相关系数可以计算得到。如果p值显著大于显著性水平α,则表示该序列不能拒绝纯随机的原假设,可以停止对该序列的分析。

1. 平稳时间序列

模型

自相关系数(ACF)

偏自相关系数(PACF)

AR( p )

拖尾

p 阶截尾

MA( q )

q 阶截尾

拖尾

ARMA(p,q)

p 阶拖尾

q 阶拖尾

三者都是常数均值和常数方差

建模步骤如下:

自相关性python代码 python自相关检验_python

  • 计算ACF和PACF
  • ARMA模型识别,模型定阶
  • 估计模型中未知参数的值并进行参数检验
  • 模型检验
  • 模型优化
  • 模型应用:进行短期预测

2. 非平稳时间序列

  • 确定性因素分解的时序分析:长期因素、季节变动、循环变动和随机扰动
  • 随机时序分析:为了弥补确定性因素分解方法的不足,随机时序分析可以建立ARIMA模型、残差自回归模型、季节模型、异方差模型等

ARIMA模型建模步骤:

自相关性python代码 python自相关检验_差分_02


下面应用以上的理论知识,对某餐厅的销售数据进行建模:

数据集概况:

#ARIMA模型
import pandas as pd

#参数初始化
discfile = 'G:/Python数据分析与挖掘实战/chapter5/demo/data/arima_data.xls'
forecastnum = 5
data = pd.read_excel(discfile, index_col='日期')
data.head()

输出结果:        
日期         销量   
2015-01-01  3023
2015-01-02  3039
2015-01-03  3056
2015-01-04  3138
2015-01-05  3188

1.检验序列的平稳性

#时序图
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
%matplotlib

#中文和负号的正常显示
plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False
data.plot()
plt.show()

#自相关图
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data).show()

#平稳性检测
from statsmodels.tsa.stattools import adfuller as ADF
print('原始序列的ADF检验结果为:',ADF(data['销量']))
#返回值依次为:adf、pvalue、usedalg、nobs、critical values、icbest、regresults、resstore 

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

自相关性python代码 python自相关检验_python_03


自相关性python代码 python自相关检验_python_04

  • 时序图显示该序列具有明显的单调递增趋势,可以判断为是非平稳序列
  • 自相关图显示自相关系数长期大于零,说明序列间具有很强的长期相关性
  • 单位根检验统计量对应的p值显著大于0.05,不能拒绝原假设,即认为该序列为非平稳序列

2.对原始序列进行一阶差分,并进行平稳性和白噪声检验

(1)差分,再做平稳性判断

#差分后的结果
D_data = data.diff().dropna()
D_data.columns = [u'销量差分']
D_data.plot() #时序图
plt.show()

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

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

输出结果:
差分序列的ADF检验结果为: (-3.1560562366723532, 0.02267343544004886, 0, 35, 
{'1%': -3.6327426647230316, '5%': -2.9485102040816327, '10%': -2.6130173469387756}, 287.5909090780334)

自相关性python代码 python自相关检验_差分_05


自相关性python代码 python自相关检验_方差_06

  • 一阶差分后的序列的时序图在均值附近比较平稳的波动
  • 自相关图有很强的短期相关性
  • 单位根检验p值小于0.05
  • 所以一阶差分后的序列是平稳序列

(2)平稳非白噪声检验

#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
print('差分序列的白噪声检验结果为:',acorr_ljungbox(D_data, lags=1)) #返回统计量和p值

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

输出的p值远小于0.05,所以一阶差分之后的序列是平稳非白噪声序列。

3.对一阶差分之后的平稳非白噪声序列拟合ARMA模型

(1)人为识别

自相关性python代码 python自相关检验_自相关性python代码_07


从一阶差分后自相关图显示出1阶截尾,偏自相关图显示出拖尾性,所以可以考虑MA(1)模型拟合1阶差分后的序列,即对原序列建立ARIMA(0, 1, 1)模型。

(2)相对最优模型识别

计算ARMA(p, q),当p和q均小于等于3的所有组合的BIC信息量,取其中BIC信息量达到最小的模型阶数。

from statsmodels.tsa.arima_model import ARIMA

#定阶
pmax = int(len(D_data)/10) #一般阶数不超过length/10
qmax = int(len(D_data)/10) #一般阶数不超过length/10
bic_matrix = [] #bic矩阵
for p in range(pmax+1):
    tmp = []
    for q in range(qmax+1):
        try: #存在部分报错,所以用try来跳过报错
            tmp.append(ARIMA(data, (p,1,q)).fit().bic)
        except:
            tmp.append(None)
    bic_matrix.append(tmp)
bic_matrix = pd.DataFrame(bic_matrix) 
p, q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置
print('BIC最小的p值和q值为:%s、%s' % (p,q))

输出结果:
BIC最小的p值和q值为:0、1

自相关性python代码 python自相关检验_自相关性python代码_08


p值为0、q值为1时最小BIC值为:422.510082。

下面对一阶差分后的序列MA(1)模型进行分析:

model = ARIMA(data, (p,1,q)).fit()
print(model.summary2())

自相关性python代码 python自相关检验_差分_09

  • 模型检验:残差为白噪声序列,p值为0.627016(不明白)
  • 参数检验和参数估计:

4.ARIMA模型预测

应用ARIMA(0, 1, 1)对销售数据做为期5天的预测:

model.forecast(5)

(array([4873.9665477 , 4923.92261622, 4973.87868474, 5023.83475326,
        5073.79082178]),
 array([ 73.08574262, 142.32680643, 187.54283213, 223.80283273,
        254.95705912]),
 array([[4730.72112437, 5017.21197102],
        [4644.96720157, 5202.87803086],
        [4606.3014882 , 5341.45588128],
        [4585.18926146, 5462.48024505],
        [4574.0841683 , 5573.49747526]]))

利用模型向前预测的时期越长,预测误差将会越大。