ARIMA模型学习笔记
ARIMA模型
Autoregressive Integrated Moving Average model
差分整合移动平均自回归模型
又称整合移动平均自回归模型(移动也可称作滑动)
时间序列平稳性
什么是平稳性
平稳性就是要求经由样本时间序列所得到的拟合曲线在未来一段时间内仍能顺着现有的形态惯性地延续下去。
平稳性要求序列的均值和方差不发生明显变化。
严平稳
严平稳表示的分布不随时间的改变而改变
弱平稳
期望与相关系数(依赖性)不变。
未来某时刻的t的值Xt就要依赖于它的过去信息,所以需要依赖性。
这种依赖性不能有明显的变化。
平稳性检验
ADF检验(Augmented Dickey-Fuller test)
也叫单位根检验
单位根
在一个自回归过程中: y t = b y t − 1 + a + ϵ t y_t=by_{t-1}+a+\epsilon_t yt=byt−1+a+ϵt,如果滞后项系数b为1,就称为单位根
当单位根存在时,自变量和因变量之间的关系具有欺骗性,因为残差序列的任何误差都不会随着样本量(即时期数)增大而衰减,也就是说模型中的残差的影响是永久的。
这种回归又称作伪回归。如果单位根存在,这个过程就是一个随机漫步(random walk)。
ADF检验的原理
判断序列是否存在单位根:
如果序列平稳,就不存在单位根;否则,就会存在单位根。
ADF检验的 H0 假设就是存在单位根,如果得到的显著性检验统计量小于三个置信度(10%,5%,1%),则对应有(90%,95,99%)的把握来拒绝原假设。
ADF检验的python实现
导入adfuller函数
from statsmodels.tsa.stattools import adfuller
adfuller(x, maxlag=None, regression=“c”, autolag=‘AIC’,store=False, regresults=False)
adfuller函数的参数意义分别是:
- x:一维的数据序列。
- maxlag:最大滞后数目。
- regression:回归中的包含项(c:只有常数项,默认;ct:常数项和趋势项;ctt:常数项,线性二次项;nc:没有常数项和趋势项)
- autolag:自动选择滞后数目(AIC:赤池信息准则,默认;BIC:贝叶斯信息准则;t-stat:基于maxlag,从maxlag开始并删除一个滞后直到最后一个滞后长度基于 t-statistic 显著性小于5%为止;None:使用maxlag指定的滞后)
- store:True False,默认。
- regresults:True 完整的回归结果将返回。False,默认。
返回值意义为:
- adf:Test statistic,T检验,假设检验值。
- pvalue:假设检验结果。
- usedlag:使用的滞后阶数。
- nobs:用于ADF回归和计算临界值用到的观测值数目。
- icbest:如果autolag不是None的话,返回最大的信息准则值。
- resstore:将结果合并为一个dummy。(啥是dummy??)
import numpy as np
from statsmodels.tsa.stattools import adfuller #ADF检验
x=np.array(train)
adftest=adfuller(x,autolag='AIC')
print(adftest)
(-0.6884153463469793, 0.8497274481606903, 3, 102, {'1%': -3.4961490537199116, '5%': -2.8903209639580556, '10%': -2.5821223452518263}, -444.50694059828345)
要确定序列平稳,需要两个条件
-
t-statistic值是否小于三个level?
t检验值为-0.68,大于1%(-3.49),大于5%(-2.89),大于10%(-2.58),则拒绝原假设(即不存在单位根的可能性)小于90%
-
P-value是否非常接近0?
数据平稳化
数据不稳定的原因主要有以下两点:
- 趋势(trend)-数据随着时间变化。比如说升高或者降低。
- 季节性(seasonality)-数据在特定的时间段内变动。比如说节假日,或者活动导致数据的异常。
对数变换
平滑法
一般情况下,这种方法更适合带有周期性稳步上升的数据类型。
移动平均法
利用一定时间间隔内的平均值作为某一期的估计值
指数平均法
用变权的方法来计算均值
差分法
import pandas as pd
import matplotlib.pyplot as plt
#parse_date参数可以将csv中的时间字符串转换成日期格式
CB=pd.read_csv('ChinaBank.csv',parse_dates=['Date']).set_index(['Date'])
CB.head()
Unnamed: 0 | Open | High | Low | Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2014-01-02 | 1 | 2.62 | 2.62 | 2.59 | 2.61 | 41632500 |
2014-01-03 | 2 | 2.60 | 2.61 | 2.56 | 2.56 | 45517700 |
2014-01-06 | 3 | 2.57 | 2.57 | 2.50 | 2.53 | 68674700 |
2014-01-07 | 4 | 2.51 | 2.52 | 2.49 | 2.52 | 53293800 |
2014-01-08 | 5 | 2.51 | 2.54 | 2.49 | 2.51 | 69087900 |
#对close这一列一阶差分
CB['Close_diff1']=CB['Close'].diff(1)
#二阶差分
CB['Close_diff2']=CB['Close_diff1'].diff(1)
cbdata=CB['2014-01':'2014-06']
plt.figure(figsize=(15, 5))
#plt.figure(figsize=(20,20))
cbdata['Close'].plot()
plt.figure(figsize=(15, 5))
cbdata['Close_diff1'].plot(style='r')
plt.figure(figsize=(15, 5))
cbdata['Close_diff2'].plot(style='b')
可以看出二阶差分之后的数据变得平稳了
再对一阶差分后的数据进行ADF检验
diff1=train.diff(1).dropna()
x1=np.array(diff1)
adftest1=adfuller(x1,autolag='AIC')
print(adftest1)
(-7.135100351267679, 3.4373575189577454e-10, 2, 102, {'1%': -3.4961490537199116, '5%': -2.8903209639580556, '10%': -2.5821223452518263}, -442.1879434989652)
可以看到t检验的值为-7.13,小于1%( -3.49)等三个level,因此有把握拒绝原假设,数据平稳
ARIMA模型介绍
AR(Autoregressive)模型
自回归模型描述当前值和历史值之间的关系,变量自身的历史时间数据对自身进行预测。
自回归模型必须满足平稳性的要求。
自回归模型首先需要确定一个阶数p,表示用几期的历史值来预测当前值。p阶自回归模型的公式定义为:
y t = μ + Σ i = 1 p γ i y t − 1 + ϵ t y_{t} = \mu + \Sigma_{i=1}^{p}\gamma_{i}y_{t-1}+\epsilon_{t} yt=μ+Σi=1pγiyt−1+ϵ