时序模式
常用时间序列模型如下:
模型名称 | 描述 |
平滑法 | 利用修匀技术,削弱短期随机波动的影响,包括移动平均法和指数平滑法 |
趋势拟合法 | 建立回归模型,分为线性拟合和曲线拟合 |
组合模型 | 长期趋势、季节变动、周期变动和不规则变动,分为加法模型和乘法模型 |
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 阶拖尾 |
三者都是常数均值和常数方差
建模步骤如下:
- 计算ACF和PACF
- ARMA模型识别,模型定阶
- 估计模型中未知参数的值并进行参数检验
- 模型检验
- 模型优化
- 模型应用:进行短期预测
2. 非平稳时间序列
- 确定性因素分解的时序分析:长期因素、季节变动、循环变动和随机扰动
- 随机时序分析:为了弥补确定性因素分解方法的不足,随机时序分析可以建立ARIMA模型、残差自回归模型、季节模型、异方差模型等
ARIMA模型建模步骤:
下面应用以上的理论知识,对某餐厅的销售数据进行建模:
数据集概况:
#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)
- 时序图显示该序列具有明显的单调递增趋势,可以判断为是非平稳序列
- 自相关图显示自相关系数长期大于零,说明序列间具有很强的长期相关性
- 单位根检验统计量对应的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)
- 一阶差分后的序列的时序图在均值附近比较平稳的波动
- 自相关图有很强的短期相关性
- 单位根检验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)人为识别
从一阶差分后自相关图显示出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
p值为0、q值为1时最小BIC值为:422.510082。
下面对一阶差分后的序列MA(1)模型进行分析:
model = ARIMA(data, (p,1,q)).fit()
print(model.summary2())
- 模型检验:残差为白噪声序列,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]]))
利用模型向前预测的时期越长,预测误差将会越大。