当前位置: 首页 > article >正文

(五十一)时间序列分析二:平稳时间序列分析(ARMA)

平稳时间序列

平稳时间序列分为严平稳时间序列与宽平稳时间序列。如果在一个时间序列中,各期数据的联合概零分布与时间 t 无关,则该序列为严平稳时间序列。实际中讨论的平稳时间序列是宽平稳时间序列,指对任意时间下,序列的均值、方差存在并为常数,且自协方差函数与自相关系数只与时间间隔k有关。只有平稳时间序列才可以进行统计分析,因为平稳性保证了时间序列数据都是出自同一分布。可以使用单位根检验来检验时间序列的平稳性。

若一个平稳时间序列的序列值之间没有相关性,那么就意味着这种数据前后没有规律,也就无法挖掘出有效的信息,这种序列称为纯随机序列。在纯随机序列中,有一种序列称为白噪声序列,这种序列随机且各期的方差一致。平稳时间序列分析在于充分挖掘时间序列之间的关系,当时间序列中的关系被提取出来后,剩下的序列就应该是个白噪声序列。
在这里插入图片描述
时间序列自相关与概率论中的相关定义本质是一致的,它衡量的是序列自身在不同时刻随机变量的相关性;偏自相关系数则剔除了两时刻之间其他随机变量的干扰,是更加纯粹的相关。

ARMA模型与定阶

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阶截尾拖尾
PACFp阶截尾拖尾拖尾

所谓截尾指的是从某阶开始均为(接近)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()

在这里插入图片描述

1、平稳性检验

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,小于显著性水平。原假设"序列具有单位根即非平稳"被拒绝,因此该时间序列为平稳的。

2、ARMA模型定阶

先用第一种定阶方法:利用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个数据用于预测。

3、ARMA(1,1)建模

为了检验拟合效果,可用经调整的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

可以发现拟合精度较高,接着来看预测效果。

4、模型预测

由于该数据集从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()

在这里插入图片描述

5、残差白噪声检验

模型是否提取了原数据足够的信息的重要参考是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

http://www.lryc.cn/news/2416505.html

相关文章:

  • 6to4隧道和6in4隧道的区别
  • 高分一号影像处理流程
  • postgresql 设置执行命令超时时间
  • nginx + lua环境配置
  • 【Excel系列9】-- 28个基础图表
  • 在JavaEye晃了一个来月真的感慨。
  • 从零开始搭建 reviewboard 环境(四) -- reviewboard 的安装过程中的问题解决
  • IP欺骗
  • 使用NE555制作多谐振荡器
  • MFC的坐标转换GetClientRect/GetWindowRect/ClientToScreen/GetCursorPos/ScreenToClient
  • Collections.synchronizedMap()与ConcurrentHashMap的区别
  • C++中critical section的使用
  • 高等数学学习笔记——第九十九讲——一阶线性微分方程组
  • 初学C语言以及C语言的常见概念
  • Sublime text 3最新注册码
  • Windows Installer Clean Up 软件正常卸载不了时,请它帮忙!
  • cocostudio使用基本要点汇总
  • AIS(自动识别系统)介绍
  • 【.NET】.NET 框架概述
  • fastDB个人使用心得
  • 进化算法——多目标优化
  • MNE溯源fieldtrip官网教程
  • JDK1.6安装详解、环境变量设置、测试安装及注意事项
  • leetcode Surrounded Regions 详解
  • java正则Matcher.matches()、Matcher.lookingAt()、Matcher.find()、 group()详解
  • 【实践】java.lang.Integer源码分析
  • CImage 从内存中读取图像
  • FileZilla Server简介及使用说明
  • 解决Adobe reader 8 突然打不开了并报许可协议的问题
  • 2023年【A特种设备相关管理(锅炉压力容器压力管道)】报名考试及A特种设备相关管理(锅炉压力容器压力管道)模拟考试题