如何用 Python 进行平稳性检验

在时间序列分析中,平稳性是一个非常重要的概念。一个时间序列是平稳的,如果其统计特性(如均值、方差、自协方差等)不随时间变化。大多数时间序列预测模型(如ARIMA、SARIMA等)都要求输入的时间序列是平稳的。因此,进行平稳性检验是必要的步骤。

本文将介绍如何使用 Python 进行平稳性检验,包括 ADF 测试(Augmented Dickey-Fuller Test)、KPSS 测试(Kwiatkowski-Phillips-Schmidt-Shin Test)以及 PP 测试(Phillips-Perron Test)。我们还将通过代码示例帮助理解这些方法的应用。

1. 平稳性检验介绍

平稳性检验主要有以下几种方法:

  • ADF 检验:用于检验单位根的存在性。单位根存在表明序列是非平稳的。
  • KPSS 检验:与 ADF 检验相反,KPSS 检验假设序列是平稳的,且通过检验序列是否偏离平稳来判断。
  • PP 检验:与 ADF 检验类似,PP 检验也检验单位根的存在性,但其对自相关的处理方式稍有不同。

2. 安装必要的库

在进行平稳性检验之前,首先需要安装 statsmodels, pandas, 和 matplotlib 等库。你可以使用以下命令进行安装:

pip install statsmodels pandas matplotlib

3. ADF 检验示例

下面是 ADF 检验的 Python 示例代码:

import pandas as pd
import numpy as np
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt

# 生成一个非平稳的时间序列(随机游走)
np.random.seed(0)
n = 100
random_walk = np.cumsum(np.random.randn(n))

# 进行 ADF 检验
adf_result = adfuller(random_walk)
print('ADF Statistic: %f' % adf_result[0])
print('p-value: %f' % adf_result[1])
print('Critical Values:')
for key, value in adf_result[4].items():
    print('\t%s: %.3f' % (key, value))

# 绘制时间序列图
plt.figure(figsize=(10, 6))
plt.plot(random_walk)
plt.title('Random Walk')
plt.xlabel('Time')
plt.ylabel('Value')
plt.grid()
plt.show()

这个示例生成了一个随机游走的时间序列,并使用 ADF 检验对其进行平稳性检验。输出的 ADF 统计量和 p 值可用于判断序列的平稳性。

4. KPSS 检验示例

接下来,我们看看 KPSS 检验的示例代码:

from statsmodels.tsa.stattools import kpss

# 进行 KPSS 检验
kpss_result = kpss(random_walk, regression='c')

print('KPSS Statistic: %f' % kpss_result[0])
print('p-value: %f' % kpss_result[1])
print('Critical Values:')
for key, value in kpss_result[3].items():
    print('\t%s: %.3f' % (key, value))

5. PP 检验示例

以下是 PP 检验的实现:

from statsmodels.tsa.stattools import adfuller

# 使用和 ADF 检验相同的随机游走序列进行 PP 检验
pp_result = adfuller(random_walk, regression='c', autolag='AIC')
print('PP Statistic: %f' % pp_result[0])
print('p-value: %f' % pp_result[1])
print('Critical Values:')
for key, value in pp_result[4].items():
    print('\t%s: %.3f' % (key, value))

6. 结果解读

在上述代码中,AIC 自动选择了滞后阶数。对于 ADF 和 PP 检验:

  • 如果 p 值小于 0.05,拒绝原假设(原假设为数据具有单位根,非平稳),说明数据是平稳的。
  • 如果 p 值大于 0.05,不能拒绝原假设,说明数据是非平稳的。

对于 KPSS 检验:

  • 如果 p 值小于 0.05,拒绝原假设(原假设为数据平稳),说明数据是非平稳的。
  • 如果 p 值大于 0.05,不能拒绝原假设,说明数据是平稳的。

7. 旅行图与关系图

以下是用 mermaid 语法表示的 ER 图和旅行图:

erDiagram
    ADF_TEST {
      float ADF_Statistic
      float p_value
      map critical_values
    }

    KPSS_TEST {
      float KPSS_Statistic
      float p_value
      map critical_values
    }

    PP_TEST {
      float PP_Statistic
      float p_value
      map critical_values
    }

    RANDOM_WALK {
      float value
      int time
    }

    ADF_TEST ||--o| RANDOM_WALK : performs
    KPSS_TEST ||--o| RANDOM_WALK : tests
    PP_TEST ||--o| RANDOM_WALK : assesses
journey
    title 平稳性检验过程
    section 数据准备
      收集时间序列数据: 5: 了解数据
      生成随机游走序列: 5: 进行生成
    section 平稳性检验
      进行 ADF 检验: 4: 使用适当方法
      检查 p 值与统计量: 4: 进行解读
      进行 KPSS 检验: 4: 使用适当方法
      检查 KPSS p 值: 4: 进行解读
      进行 PP 检验: 4: 使用适当方法
      检查 PP p 值: 4: 进行解读

8. 结论

通过本文的介绍,我们系统地了解了如何使用 Python 对时间序列进行平稳性检验。我们探讨了 ADF、KPSS 和 PP 三种检验方法的原理和使用方法,且通过示例代码加深了理解。

在实际应用中,平稳性检验是进行时间序列分析的一个基础步骤。只有确保数据平稳,才能提高后续模型的预测性能。因此,务必重视这一过程,并根据不同检验得到的结果进一步调整数据(如进行差分或变换)来满足模型的要求。

在后续的时间序列分析中,我们可以结合本文讨论的检验结果,选择适合的模型进行预测。希望本文的内容能对你提升时间序列分析能力有所帮助!