基于Python的ADF单位根检验方法——时间序列平稳检验

写在最前面:

ADF检验总结一句话:如果序列是平稳的,则不存在单位根, 否则就会存在单位根。

同时,源数据不平稳(大多肉眼可见),可以做一阶差分、二阶差分这样子,看是否差分后平稳。

ADF检验的原假设是存在单位根,因此如果得到的统计量显著小于3个置信度(1%,5%,10%)的临界统计值时,说明是拒绝原假设的。另外是看P-value是否非常接近0(4为小数基本即可。)

 

下面的内容是乾坤大挪移过来的,《Python时间序列平稳检验--ADF检验》

我说我也实在不是谦虚,我一个CS狗,怎么就来学统计了呢?
后来我念了两句诗,叫“苟利国家生死以,岂因祸福避趋之”,就去了。

Abstract

在ARMA/ARIMA这样的自回归模型中,模型对时间序列数据的平稳是有要求的,因此,需要对数据或者数据的n阶差分进行平稳检验,而一种常见的方法就是ADF检验,即单位根检验。

平稳随机过程

在数学中,平稳随机过程(Stationary random process)或者严平稳随机过程(Strictly-sense stationary random process),又称狭义平稳过程,是在固定时间和位置的概率分布与所有时间和位置的概率分布相同的随机过程:即随机过程的统计特性不随时间的推移而变化。这样,数学期望和方差这些参数也不随时间和位置变化。
平稳在理论上有严平稳和宽平稳两种,在实际应用上宽平稳使用较多。宽平稳的数学定义为:
对于时间序列 ytyt,若对任意的t,k,mt,k,m,满足:

 


则称时间序列 ytyt 是宽平稳的。

平稳是自回归模型ARMA的必要条件,因此对于时间序列,首先要保证应用自回归的n阶差分序列是平稳的。

肉眼检验

我们以某次天池比赛的数据集为例,如图,是店铺从2015-09到2016-10的销售额:

该数据显然是不平稳的,我们来看看一阶差分:

_series = pd.Series(data=data['cnt']) # 获取data过程省略
diff1 = dta = _series.diff(1)[1:]  # dta[0] is nan
diff1.plot()
plt.savefig('./diff_1.jpg')


看起来似乎均值稳定在0左右,而且也具有一定周期性。

继续来看看二阶差分能否更平稳一些:

看起来二阶差分和一阶差分都比较稳定,肉眼难辨高下。

只用肉眼是分不清是否真的平稳的,因此,我们有必要引入数学方法对平稳进行形式化的检验。

单位根检验

单位根检验是指检验序列中是否存在单位根,因为存在单位根就是非平稳时间序列了。单位根就是指单位根过程,可以证明,序列中存在单位根过程就不平稳,会使回归分析中存在伪回归。
而迪基-福勒检验(Dickey-Fuller test)和扩展迪基-福勒检验(Augmented Dickey-Fuller test可以测试一个自回归模型是否存在单位根(unit root)。迪基-福勒检验模式是D. A迪基和W. A福勒建立的。
关于检验的详细内容,见[6],碍于公式实在太难打了,这里不再赘述。

ADF Test in Python

在python中对时间序列的建模通常使用statsmodel库,该库在我心中的科学计算库排名中长期处于垫底状态,因为早期文档实在匮乏,不过近来似有好转倾向。
statsmodels.tsa.stattools.adfuller中可进行adf校验,一般传入一个1d 的 array like的data就行,包括list, numpy array 和 pandas series都可以作为输入,其他参数可以保留默认.
其返回值是一个tuple,格式如下:

对上面一阶差分的数据进行adf检验,可以得到如下结果:

print sm.tsa.stattools.adfuller(dta)

(-9.1916312162314355, 2.1156279593784273e-15, 12, 338, {'5%': -2.8701292813761641, '1%': -3.449846029628477, '10%': -2.5713460670144603}, 4542.1540700410897)

如何确定该序列能否平稳呢?主要看:

  1. 1%、%5、%10不同程度拒绝原假设的统计值和ADF Test result的比较,ADF Test result同时小于1%、5%、10%即说明非常好地拒绝该假设,本数据中,adf结果为-9, 小于三个level的统计值。
  2. P-value是否非常接近0.本数据中,P-value 为 2e-15,接近0.

ADF检验的原假设是存在单位根,只要这个统计值是小于1%水平下的数字就可以极显著的拒绝原假设,认为数据平稳。注意,ADF值一般是负的,也有正的,但是它只有小于1%水平下的才能认为是及其显著的拒绝原假设。
对于ADF结果在1% 以上 5%以下的结果,也不能说不平稳,关键看检验要求是什么样子的。

但是对于本例,可以很自豪地说,数据是平稳的了。
就做了这么一点微小的工作,谢谢大家。

Reference

[1] 单位根检验--百度文库
[2] Time Series Analysis in Python with statsmodels
[3] 平稳时间序列预测法
[4] statsmodels 文档
[5] 平稳随机过程--百度百科
[6] 迪基-福勒检验-Wikipedia
[7] 如何看 单位根检验---ADF检验结果

评论 (1)
  1. 沙发
    6 天前

    2018网赚新项目,抢先机–我的座右铭:做不到日赚万元,死不瞑目!一辈子只做好一件事!

    1.2018年最有潜力的赚钱项目,目前红利期不要错过。

    2.稳定,每天赚个500-1000左右,我已经持续了一个多月,不然我也教不了你。

    3.正规项目,可以长期操作。真正想赚钱的我可以教你,你赚了钱再来拜师。

    4.好项目经得起考验,绝对不是垃圾项目,说的再好,你不做也是枉然。

    5.虽然我不是大师,但是我能带你月赚万元绝没问题,直接复制我的就OK,不懂手把手教。

    做网赚,别想一步登天,不是每个人都能赚钱的。如果,你没有坚定的信念,还是老老实实去上 班吧!

    想清楚了再加我的微信,我要的是你勇往向前的决心,微信sgvg6666 (写验证码126,加我必通过)

    我的座右铭:做不到日赚万元,死不瞑目!一辈子只做好一件事!