时间序列平稳性分析和白噪声检验

文章目录

  • 一、时间序列平稳性
    • 1、ADF检验
      • 1.1、ADF检验原理
      • 1.2、ADF的python实现
    • 2、ACF和PACF
  • 二、白噪声检验

原始的负荷时间序列曲线
时间序列平稳性分析和白噪声检验_第1张图片

一、时间序列平稳性

时间序列分析之ADF检验

1、ADF检验

在使用很多时间序列模型的时候,如 ARMA、ARIMA,都会要求时间序列是平稳的,所以一般在研究一段时间序列的时候,第一步都需要进行平稳性检验,除了用肉眼检测的方法,另外比较常用的严格的统计检验方法就是ADF检验,也叫做单位根检验。

1.1、ADF检验原理

ADF检验就是判断序列是否存在单位根:如果序列平稳,就不存在单位根;否则,就会存在单位根。

所以,ADF检验的 H0 假设就是存在单位根,如果得到的显著性检验统计量小于三个置信度(10%,5%,1%),则对应有(90%,95,99%)的把握来拒绝原假设。

1.2、ADF的python实现

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)

  • 1%、%5、%10不同程度拒绝原假设的统计值和ADF Test result的比较,ADF Test result同时小于1%、5%、10%即说明非常好地拒绝该假设(这里原假设是存在单位根,即时间序列为非平稳的。),本数据中,adf结果为-9, 小于-3.432551464895929,说明有99%的把握认为原序列平稳。
  • P-value是否非常接近0。本数据中,P-value 为3.9034351012238036e-15<0.05,也可以从另一方面说明序列平稳。

因此这个时间序列是平稳的。

封装一下

# 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)

2、ACF和PACF

自相关图
偏自相关图
如何根据自相关(ACF)图和偏自相关(PACF)图选择ARIMA模型的p、q值

ACF:衡量 y t y_t yt y t − k y_{t-k} ytk 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} ytk在不同k取值时的相关性,若 y t y_t yt y t − 1 y_{t-1} yt1有相关性,则 y t − 1 y_{t-1} yt1 y t − 2 y_{t-2} yt2必然具有相关性,然而 y t y_{t} yt y t − 2 y_{t-2} yt2也必然相关,因为他们都与 y t − 1 y_{t-1} yt1相关,而不是因为$ y_{t-2} 包 含 新 的 信 息 可 以 预 测 包含新的信息可以预测 y_{t}$ 。而偏自相关图,可以反映在移除 1 , 2... k − 1 1,2...k-1 1,2...k1延迟的情况下, y t − k y_{t-k} ytk y t y_{t} yt的影响

平稳性:肉眼来看,一个平稳的时间序列,它是在一个水平线附近上下波动,没有明显的趋势性和季节性。平稳的时间序列具有短期的自相关性,

  • 1)如果在自相关图中,lag越大,自相关系数越小并很快衰减为接近于0,那就说明该时间序列具有短期相关性,是平稳时间序列。
  • 2)如果在自相关图中,lag越大,自相关系数并不是衰减为0,而是继续变为负数,那就说明该时间序列不具有短期相关性,不是平稳时间序列。

自相关图和偏相关图

# -*- 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()

时间序列平稳性分析和白噪声检验_第2张图片
(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)

返回值

  • lbvalue:测试的统计量
  • pvalue:基于卡方分布的p统计量,pvalue<0.05,说明不是白噪声
# 白噪声检验
# 白噪声检验
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)


补充:白噪声序列是一个平稳的时间序列,无周期性、无趋势性,无自相关性
白噪声检验
时间序列分析

你可能感兴趣的:(时间序列预测算法,python,开发语言)