时间序列分析之ADF检验
在使用很多时间序列模型的时候,如 ARMA、ARIMA,都会要求时间序列是平稳的,所以一般在研究一段时间序列的时候,第一步都需要进行平稳性检验,除了用肉眼检测的方法,另外比较常用的严格的统计检验方法就是ADF检验,也叫做单位根检验。
ADF检验就是判断序列是否存在单位根:如果序列平稳,就不存在单位根;否则,就会存在单位根。
所以,ADF检验的 H0 假设就是存在单位根,如果得到的显著性检验统计量小于三个置信度(10%,5%,1%),则对应有(90%,95,99%)的把握来拒绝原假设。
ADF检验可以通过python中的 statsmodels 模块,导入adfuller函数
# -*- coding: utf-8 -*-
# @Time : 2021/5/19 15:13
# @Author : Orange
# @File : Stationarity.py
from statsmodels.tsa.stattools import *
# 时间序列平稳性检验,ADF检验
result = adfuller(P_data)
print(result)
(-9.087535016007157, 3.9034351012238036e-15, 3, 2973, {‘1%’: -3.432551464895929, ‘5%’: -2.8625126635320393, ‘10%’: -2.567287774919901}, 24322.072376998112)
拒绝该假设
(这里原假设是存在单位根,即时间序列为非平稳的。),本数据中,adf结果为-9, 小于-3.432551464895929,说明有99%的把握认为原序列平稳。因此这个时间序列是平稳的。
封装一下
# adf 稳定性检验
def stationarity_test(dataset, number):
data = dataset.copy()
data = data[: len(data) - number] # 不检测最后number个数据
# 平稳性检测
from statsmodels.tsa.stattools import adfuller as ADF
diff = 0
adf = ADF(data)
while adf[1] > 0.05: # 用概率判断,若p<0.05,认为序列平稳
diff = diff + 1
adf = ADF(data.diff(diff).dropna()) # 对序列求1阶差分后,判断其是否平稳
print(u'原始序列经过%s阶差分后归于平稳,p值为%s' % (diff, adf[1]))
return adf
adf = stationarity_test(ar, 0)
print("adf:", adf)
自相关图
偏自相关图
如何根据自相关(ACF)图和偏自相关(PACF)图选择ARIMA模型的p、q值
ACF
:衡量 y t y_t yt和 y t − k y_{t-k} yt−k在 k = 1 , 2 , 3... k=1,2,3... k=1,2,3...时的相关性,横坐标为k
PACF
:若回顾之前我们所说过的,自相关图(ACF Plot)反映了自回归中 y t y_t yt和 y t − k y_{t-k} yt−k在不同k取值时的相关性,若 y t y_t yt和 y t − 1 y_{t-1} yt−1有相关性,则 y t − 1 y_{t-1} yt−1和 y t − 2 y_{t-2} yt−2必然具有相关性,然而 y t y_{t} yt和 y t − 2 y_{t-2} yt−2也必然相关,因为他们都与 y t − 1 y_{t-1} yt−1相关,而不是因为$ y_{t-2} 包 含 新 的 信 息 可 以 预 测 包含新的信息可以预测 包含新的信息可以预测y_{t}$ 。而偏自相关图,可以反映在移除 1 , 2... k − 1 1,2...k-1 1,2...k−1延迟的情况下, y t − k y_{t-k} yt−k对 y t y_{t} yt的影响
平稳性
:肉眼来看,一个平稳的时间序列,它是在一个水平线附近上下波动,没有明显的趋势性和季节性。平稳的时间序列具有短期的自相关性,
自相关图和偏相关图
# -*- coding: utf-8 -*-
# @Time : 2021/5/19 15:13
# @Author : Orange
# @File : Stationarity.py
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(P_data.dropna(),lags=1440*10)
plt.show()
plot_acf(P_data.dropna(),lags=1440*10)
plt.show()
(1)白噪声自相关系数很快就衰减到0附近,是明显的平稳序列。滞后期为0时自相关系数和偏自相关系数其实就是序列自己和自己的相关性,故为1;滞后期为1时,自相关系数为0,表示白噪声无自相关性。(2) 随机游走,自相关系数下降非常缓慢,故为非平稳序列;另从偏自相关系数中可以看到随机游走只和前一项有关。(3) GDP数据的自相关图中也可以看到存在一定的周期性,滞后4、8、12等自相关系数较大下降较慢,差分后下降多一些起到一定效果,认为差分后序列是平稳的。同可视化数据一样,直观判断带有较强主观性,但能让我们对数据有更直观的认识。
注:这种方式比较主观,不推荐
白噪声
白噪声检验
也称为纯随机性检验, 当数据是纯随机数据时,再对数据进行分析就没有任何意义了, 所以拿到数据后最好对数据进行一个纯随机性检验。
可以通过调用statsmodels.stats.diagnostic里的acorr_ljungbox
实现
from statsmodels.stats.diagnostic import acorr_ljungbox
lb, p = acorr_ljungbox(data, lags=1)
返回值
# 白噪声检验
# 白噪声检验
def whitenoise_test(dataset, number):
data = dataset.copy()
data = data[: len(data) - number] # 不使用最后number个数据
# 白噪声检测
from statsmodels.stats.diagnostic import acorr_ljungbox
l = acorr_ljungbox(data, lags=1)
p=l['lb_pvalue'].values[0]
if p < 0.05:
print(u'原始序列为非白噪声序列,对应的p值为:%s' % p)
else:
print(u'原始该序列为白噪声序列,对应的p值为:%s' % p)
l= acorr_ljungbox(data.diff().dropna(), lags=1)
p=l['lb_pvalue'].values[0]
if p < 0.05:
print(u'一阶差分序列为非白噪声序列,对应的p值为:%s' % p)
else:
print(u'一阶差分该序列为白噪声序列,对应的p值为:%s' % p)
whitenoise_test(pd.Series(ar), 0)
补充:白噪声序列是一个平稳的时间序列,无周期性、无趋势性,无自相关性
白噪声检验
时间序列分析