趋近智
虽然肉眼观察能为我们提供关于平稳性的线索,但这可能带有主观性。细微的趋势或缓慢的均值回归可能难以察觉,我们需要一种更客观、量化的方法来验证我们的观察。统计假设检验提供了这种严谨性。它们使我们能够严谨地检验时间序列是否符合平稳性条件。
平稳性检验中最常用的方法之一是增广迪基-富勒 (ADF) 检验。
ADF 检验是一种统计检验,被称为单位根检验。“单位根”的存在是说明时间序列非平稳的一种正式说法。具体来说,这表明冲击或过去的值对序列的未来值有持续影响,这是非平稳过程(如随机游走)的特点。
核心思想是建立一个假设检验:
我们的目标通常是找到反对零假设的证据。如果我们能拒绝 ,我们就能更有把握地认为我们的序列是平稳的(或已成功转换为平稳的)。
ADF 检验会生成多个输出,但对我们的解释来说,最重要的是ADF 检验统计量和p 值。
statsmodels 库提供了一个 ADF 检验的便捷实现。让我们看看如何使用它。假设你有一个包含时间序列值的 Pandas Series series_data:
# 导入 adfuller 函数
from statsmodels.tsa.stattools import adfuller
import pandas as pd
import numpy as np
# 例子:生成非平稳数据(随机游走)
np.random.seed(42)
random_walk = np.random.randn(500).cumsum()
series_data_non_stationary = pd.Series(random_walk)
# 例子:生成平稳数据(白噪声)
white_noise = np.random.randn(500)
series_data_stationary = pd.Series(white_noise)
# 定义一个函数来执行并打印 ADF 检验结果
def perform_adf_test(series, series_name=""):
print(f"--- {series_name} 的 ADF 检验结果 ---")
# 执行 ADF 检验
result = adfuller(series.dropna()) # dropna() 处理可能因差分产生的 NaN
# 提取并打印结果
print(f'ADF Statistic: {result[0]:.4f}')
print(f'p-value: {result[1]:.4f}')
print('临界值:')
for key, value in result[4].items():
print(f'\t{key}: {value:.4f}')
# 解释 p 值
if result[1] <= 0.05:
print("\n结论:拒绝零假设 (H0)。数据很可能是平稳的。")
else:
print("\n结论:未能拒绝零假设 (H0)。数据很可能是非平稳的。")
print("-"*(30 + len(series_name))) # 分隔符
# 检验非平稳数据
perform_adf_test(series_data_non_stationary, "随机游走 (非平稳示例)")
print("\n") # 在输出之间添加空格
# 检验平稳数据
perform_adf_test(series_data_stationary, "白噪声 (平稳示例)")
代码输出:
--- 随机游走 (非平稳示例) 的 ADF 检验结果 ---
ADF 统计量: -1.1272
p 值: 0.6964
临界值:
1%: -3.4436
5%: -2.8674
10%: -2.5699
结论:未能拒绝零假设 (H0)。数据很可能是非平稳的。
-------------------------------------------------------------
--- 白噪声 (平稳示例) 的 ADF 检验结果 ---
ADF 统计量: -22.0378
p 值: 0.0000
临界值:
1%: -3.4436
5%: -2.8674
10%: -2.5699
结论:拒绝零假设 (H0)。数据很可能是平稳的。
--------------------------------------------------------
解释:
ADF 检验是时间序列分析工具集中的一种标准工具。它提供了一种正式方法来检查平稳性假设,这在进行 ARIMA 等依赖于此的模型处理之前是需要的。如果检验表明非平稳性,我们将需要应用变换,例如差分,我们将在下文介绍。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造