python ADF单位根检验,序列平稳性检验

平稳性、单位根理解

平稳的序列 直观感受如下:

但统计意义上的平稳并不是这样哈,我们都知道一个成语“一叶障目”:当数据量小的时候往往结论比较偏激,当数据量大的时候,什么大风大浪都见过,那么结论就相对靠谱一些。

但还有一种情况:数据量也大,但是结论依旧比较离谱,比如我统计考研人数:

  • 第一年上去一拨人,另一波人二战
  • 第二年,参加考试的二战的同学凭实力挤下去应届的,但仍有人三战;也有一部分应届生考上了,但另一部分二战
  • 第三年…三战的挤下去二战的,二战的挤下去一战的…同样,一战变为二战,二战变为三战,三战变为四战…

所以当我要统计考研人数的时候,其实统计的就是:一战的 + (二战剩下的+三战剩下的+…+N战剩下的),时间维度越长,这个N战剩下的就对结果影响越大。

其中当我要预测考研人数的时候:二战剩下的+三战剩下的+.....+N战剩下的 = 之前剩下的这个之前剩下的就称为单位根,带着单位根预测有没有问题?没有问题!但是不够准!

单位根检验 / 平稳性检验:就是用来判断是否数据中是否存在“之前剩下的”这一部分,如果能剔除出去,问题就变得简单了,准确性也会更高。单位根检验分很多,更多请参考其他更理论的内容哈

一般常用的就是ADF单位根检验

python ADF检验

  • H0:不平稳,存在单位根
  • H1:平稳,不存在单位根

示例代码:

from statsmodels.tsa.stattools import adfuller
import numpy as np


if __name__ == '__main__':
    array = np.random.standard_normal(size=100)
    adf_result = adfuller(array)
    adf_value = adf_result[0]
    print("adf值:", adf_value)
    p_value = adf_result[1]
    print("p:", p_value)
    t_value = adf_result[4]
    print("临界值:", t_value)

得到结果:

adf值: -4.918907632344451
p: 3.203639985122076e-05
临界值: {'1%': -3.506944401824286, '5%': -2.894989819214876, '10%': -2.584614550619835}

如果要证明数据平稳,需要:

  1. 条件1:p值,需要p大于0.05(可以看到上述结果第一个条件都不满足,直接得:序列不平稳)
  2. 条件2:临界值这里是三个置信区间,如果adf值>1%对应的值,说明在置信区间1%内平稳,最苛刻的是10%

参考文章

How to interpret adfuller test results?:https://stackoverflow.com/questions/47349422/how-to-interpret-adfuller-test-results

おすすめ

転載: blog.csdn.net/weixin_35757704/article/details/121769993