赞
踩
平稳时间序列分为严平稳时间序列与宽平稳时间序列。如果在一个时间序列中,各期数据的联合概零分布与时间 t 无关,则该序列为严平稳时间序列。实际中讨论的平稳时间序列是宽平稳时间序列,指对任意时间下,序列的均值、方差存在并为常数,且自协方差函数与自相关系数只与时间间隔k有关。只有平稳时间序列才可以进行统计分析,因为平稳性保证了时间序列数据都是出自同一分布。可以使用单位根检验来检验时间序列的平稳性。
若一个平稳时间序列的序列值之间没有相关性,那么就意味着这种数据前后没有规律,也就无法挖掘出有效的信息,这种序列称为纯随机序列。在纯随机序列中,有一种序列称为白噪声序列,这种序列随机且各期的方差一致。平稳时间序列分析在于充分挖掘时间序列之间的关系,当时间序列中的关系被提取出来后,剩下的序列就应该是个白噪声序列。
时间序列自相关与概率论中的相关定义本质是一致的,它衡量的是序列自身在不同时刻随机变量的相关性;偏自相关系数则剔除了两时刻之间其他随机变量的干扰,是更加纯粹的相关。
1、AR模型认为通过时间序列过去时点的线性组合加上白噪声即可预测当前时点。
Xt = α1Xt-1 + α2Xt-2 +…+ αpXt-p + εt ,其中 εt 是一个独立于 Xt 的白噪声序列。AR模型在金融模型中主要是对金融序列过去的表现进行建模,如交易中的动量与均值回归。
2、MA模型是历史白噪声的线性组合。与AR最大的不同之处在于,AR模型中历史白噪声的影响是间接影响当前预测值的(通过影响历史时序值)。Xt = εt - β1εt-1 - β2εt-2 -…- βqεt-q 。在金融模型中,MA常用来刻画冲击效应,例如预期之外的事件。
3、ARMA模型是AR和MA模型的混合,AR( p )和MA( q )共同组成了ARMA(p,q)。Xt = α1Xt-1 + α2Xt-2 +…+ αpXt-p + εt - β1εt-1 - β2εt-2 -…- βqεt-q 。
如何确定p、q的值就是ARMA模型的定阶问题。一个常用的定阶方法是利用ACF图和PACF图,不同模型的ACF、PACF图识别方法如下表:
模型 | AR( p ) | MA( q ) | ARMA(p,q) |
---|---|---|---|
ACF | 拖尾 | q阶截尾 | 拖尾 |
PACF | p阶截尾 | 拖尾 | 拖尾 |
所谓截尾指的是从某阶开始均为(接近)0的性质,拖尾指的是并不存在某一阶突然跳变到0而是逐渐衰减为0。
使用ACF与PACF对ARMA模型进行定阶时,由于估计误差的存在,实际中有时很难判断AR模型与MA模型的截尾期数。在实际操作中,可以通过AIC或者BIC准则识别,两个统计量都是越小越好。
ARMA建模的基本步骤是:检验数据的平稳性→定阶→ARMA建模→模型预测→残差白噪声检验。先导入库和数据,查看时序图:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
data= pd.read_csv(r'C:\Users\lenovo\Desktop\ts_simu200.csv',index_col='t')
dates=pd.date_range(start='2017/01/01', periods=200)
data.set_index(dates, inplace=True)
data=data['ARMA_11_b']
data.plot(figsize=(12,8))
plt.show()
ADF是一种常用的单位根检验方法,它的原假设为序列具有单位根,即非平稳,对于一个平稳的时序数据,就需要在给定的置信水平上显著,拒绝原假设。
temp = np.array(data)
t = sm.tsa.stattools.adfuller(temp) # ADF检验
output=pd.DataFrame(index=['Test Statistic Value', "p-value", "Lags Used", "Number of Observations Used","Critical Value(1%)","Critical Value(5%)","Critical Value(10%)"],columns=['value'])
output['value']['Test Statistic Value'] = t[0]
output['value']['p-value'] = t[1]
output['value']['Lags Used'] = t[2]
output['value']['Number of Observations Used'] = t[3]
output['value']['Critical Value(1%)'] = t[4]['1%']
output['value']['Critical Value(5%)'] = t[4]['5%']
output['value']['Critical Value(10%)'] = t[4]['10%']
output
Out[1]:
value
Test Statistic Value -4.8944
p-value 3.57598e-05
Lags Used 3
Number of Observations Used 196
Critical Value(1%) -3.46416
Critical Value(5%) -2.8764
Critical Value(10%) -2.57469
可以看出,p-value接近于0,小于显著性水平。原假设"序列具有单位根即非平稳"被拒绝,因此该时间序列为平稳的。
先用第一种定阶方法:利用ACF图和PACF图找出该序列适合的模型。
#自相关和偏自相关图
fig = plt.figure(figsize=(12,8))
fig = sm.graphics.tsa.plot_acf(data,lags=20)#lags表示展示的滞后的阶数
fig = sm.graphics.tsa.plot_pacf(data,lags=20)
plt.show()
很明显图中ACF和PACF都是拖尾的,应该建立ARMA(p,q)模型。下面分别应用AIC和BIC法则为我们的模型定阶。为了控制计算量,根据上图我们限制AR最大阶不超过5,MA最大阶不超过5:
sm.tsa.arma_order_select_ic(data,max_ar=5,max_ma=5,ic='aic')['aic_min_order']# AIC
Out[3]: (1, 1)
sm.tsa.arma_order_select_ic(data,max_ar=5,max_ma=5,ic='bic')['bic_min_order']# BIC
Out[4]: (1, 1)
可以看出,AIC和BIC法则求解的模型阶次均为(1,1),下面就来建立ARMA(1,1)模型,源数据的最后20个数据用于预测。
为了检验拟合效果,可用经调整的R²来测算:
order = (1,1)
train = data[:-20]
test = data[-20:]
tempModel = sm.tsa.ARMA(train,order).fit()
#拟合效果打分
delta = tempModel.fittedvalues - train
score = 1 - delta.var()/train.var()
print (score)
0.8106057124595238
可以发现拟合精度较高,接着来看预测效果。
由于该数据集从2017-01-01开始,共有200条,因此我们需要预测最后20条并对比,即2017-06-30至2017-07-19。
predicts = tempModel.predict(180,199,dynamic=True)
comp = pd.DataFrame()
comp['original'] = test
comp['predict'] = predicts
comp.plot()
可以发现预测效果不是很好。结合之前的拟合效果来看,发现该模型拟合历史数据较好,而预测差强人意:
import datetime
fig = tempModel.plot_predict(pd.to_datetime('2017-01-01'),\
pd.to_datetime('2017-01-01')+datetime.timedelta(days=220), dynamic=False, plot_insample=True)
plt.show()
模型是否提取了原数据足够的信息的重要参考是ARMA模型的残差是否是白噪声序列:
resid = tempModel.resid
sm.graphics.tsa.plot_acf(resid, lags=50)
sm.graphics.tsa.plot_pacf(resid, lags=50)
plt.show()
可以看出,残差已经无信息可提取。在ACF图中,残差滞后各期均无显著的自相关性(ACF第0期代表与自身的相关性,其值恒为1),在PACF图中,各期也无显著的偏自相关性。可以判定,残差序列为白噪声序列。
常国珍等《Python数据科学:技术详解与商业实践》,机械工业出版社;
https://uqer.datayes.com/v3/community/share/57988677228e5ba28e05faff
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。