ADF 测试平稳性

Augmented Dickey Fuller 检验(ADF 检验)是一种常用的统计检验,用于检验给定的时间序列是否平稳。在分析序列的平稳性时,它是最常用的统计检验之一。

一、介绍

在 ARIMA 时间序列预测中,第一步是确定使序列平稳所需的差分次数。由于测试时间序列的平稳性是自回归模型中经常执行的活动,因此在执行时间序列分析时您需要熟练使用 ADF 测试和 KPSS 测试。要记住的另一点是 ADF 检验从根本上说是一种统计显着性检验。这意味着,存在一个涉及零假设和替代假设的假设检验,因此计算检验统计量并报告 p 值。根据检验统计量和 p 值,您可以推断给定序列是否平稳。那么,ADF 测试究竟是如何工作的呢?让我们用清晰的例子来看看测试背后的数学直觉。让我们开始。

二、什么是单位根检验

ADF 检验属于称为“单位根检验”的一类检验,它是检验时间序列平稳性的正确方法。那么“单位根”是什么意思?单位根是时间序列的一个特征,使其非平稳。从技术上讲,在下面的等式中,单位根被认为存在于 alpha = 1 值的时间序列中。

在这里插入图片描述
其中,Y t 是时间序列在时间 ‘t’ 的值,X e 是外生变量(单独的解释变量,也是时间序列)。这对我们意味着什么?单位根的存在意味着时间序列是非平稳的。此外,序列中包含的单位根数对应于使序列平稳所需的差分运算次数。

三、Dickey-Fuller 测试

在进入ADF测试之前,我们先来了解一下什么是Dickey-Fuller测试。Dickey-Fuller 检验是一种单位根检验,用于检验以下模型方程中 α=1 的复数假设。alpha是 Y 上第一个滞后的系数。 零假设 (H0): alpha=1
在这里插入图片描述
其中,

  • y(t-1) = 时间序列的滞后 1
  • delta Y(t-1) = 序列在时间 (t-1) 处的一阶差分

从根本上说,它具有与单位根检验类似的原假设。即 Y(t-1) 的系数为 1,表示存在单位根。如果没有被拒绝,则认为该系列是非平稳的。Augmented Dickey-Fuller 检验是基于上述方程发展而来的,是最常见的单位根检验形式之一。

四、增强 Dickey Fuller (ADF) 测试如何工作?

顾名思义,ADF 测试是 Dickey Fuller 测试的“增强”版本。ADF 检验扩展了 Dickey-Fuller 检验方程,以在模型中包含高阶回归过程。
在这里插入图片描述
如果您注意到,我们只是添加了更多的差分项,而等式的其余部分保持不变。这增加了测试的彻底性。然而,零假设仍然与 Dickey Fuller 检验相同。这里要记住的一个关键点是:由于原假设假设存在单位根,即 α=1,因此获得的 p 值应小于显着性水平(例如 0.05)以拒绝原假设。因此,推断该系列是平稳的。但是,这是分析师在此测试中犯的一个非常常见的错误。也就是说,如果 p 值小于显着性水平,人们就会错误地认为序列是非平稳的。
五、Python 中的 ADF 测试
那么,如何在 Python 中执行增强的 Dickey-Fuller 测试?该statsmodel包通过 中的函数提供了 ADF 测试的可靠实现。它返回以下输出:adfuller() statsmodels.tsa.stattools

  • p 值
  • 检验统计量的值
  • 测试考虑的滞后数
  • 临界值截止。

当检验统计量低于显示的临界值时,您拒绝原假设并推断时间序列是平稳的。好的,让我们对来自 R 包的a10数据集运行 ADF 测试。该数据fpp集计算属于 ATC 代码 A10 的医药产品的每月脚本总数。该数据集的原始来源是澳大利亚健康保险委员会。如前所述,检验的原假设是存在单位根,即序列是非平稳的。

# Setup and Import data
from statsmodels.tsa.stattools import adfuller
import pandas as pd
import numpy as np
%matplotlib inline

url = 'https://raw.githubusercontent.com/selva86/datasets/master/a10.csv'
df = pd.read_csv(url, parse_dates=['date'], index_col='date')
series = df.loc[:, 'value'].values
df.plot(figsize=(14,8), legend=None, title='a10 - Drug Sales Series');

在这里插入图片描述
包和数据已加载,我们拥有使用. 接受的可选参数是执行 OLS 回归时要考虑的滞后数。默认情况下,此值为,其中是系列中的观察数。但是,您可以选择使用参数指定最大滞后数,或者让算法迭代计算最佳数。这可以通过设置. 通过这样做,将选择产生最低 AIC 的滞后数。这通常是一个很好的选择。adfuller() adfuller()12*(nobs/100)^{1/4} nobsmaxlagsautolag='AIC’adfuller

# ADF Test
result = adfuller(series, autolag='AIC')
print(f'ADF Statistic: {result[0]}')
print(f'n_lags: {result[1]}')
print(f'p-value: {result[1]}')
for key, value in result[4].items():
    print('Critial Values:')
    print(f'   {key}, {value}') 

结果:

ADF Statistic: 3.1451856893067296
n_lags: 1.0
p-value: 1.0
Critial Values:
   1%, -3.465620397124192
Critial Values:
   5%, -2.8770397560752436
Critial Values:
   10%, -2.5750324547306476

获得的 p 值大于显着性水平 0.05,并且 ADF 统计量高于任何临界值。显然,没有理由拒绝原假设。所以,时间序列实际上是非平稳的。

六、静止序列的 ADF 测试

现在,让我们看另一个对一系列通常被认为是平稳的随机数进行测试的例子。让我们用来生成一个随机序列。np.random.randn()

# ADF test on random numbers
series = np.random.randn(100)
result = adfuller(series, autolag='AIC')
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
for key, value in result[4].items():
    print('Critial Values:')
    print(f'   {key}, {value}')

结果:

ADF Statistic: -7.4715740767231456
p-value: 5.0386184272419386e-11
Critial Values:
   1%, -3.4996365338407074
Critial Values:
   5%, -2.8918307730370025
Critial Values:
   10%, -2.5829283377617176

p 值远小于 0.05 的显着性水平,因此我们可以拒绝原假设并认为序列是平稳的。让我们也可视化该系列以进行确认。

import matplotlib.pyplot as plt
%matplotlib inline
fig, axes = plt.subplots(figsize=(10,7))
plt.plot(series);
plt.title('Random');

在这里插入图片描述

七、结论

我们看到了 Augmented Dickey Fuller 测试的工作原理以及如何使用statsmodels. 现在给定任何时间序列,您应该能够执行 ADF 测试并对序列是否平稳做出公平的推断

https://blog.csdn.net/weixin_42746776/article/details/103723615

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值