如何在Python中进行KPSS测试

1,143 阅读2分钟

KPSS检验可以用来确定一个时间序列是否是趋势静止的。

这个测试使用以下的无效假设和备选假设:

  • H0:时间序列是趋势静止的
  • HA:时间序列不是趋势静止的

如果检验的p值小于某个显著性水平(如α=0.05),那么我们就拒绝无效假设,并得出结论,时间序列不是趋势静止的。

否则,我们就不能拒绝无效假设。

下面的例子展示了如何在 Python 中进行 KPSS 检验。

例1:Python中的KPSS测试(有静止的数据)

首先,让我们在Python中创建一些假数据来处理:

import numpy as np
import matplotlib.pyplot as plt

#make this example reproducible
np.random.seed(1)

#create time series data
data = np.random.normal(size=100)

#create line plot of time series data
plt.plot(data)

我们可以使用statsmodels 包中的 **kpss()**函数来对这个时间序列数据进行 KPSS 检验:

import statsmodels.api as sm

#perform KPSS test
sm.tsa.stattools.kpss(data, regression='ct')

(0.0477617848370993,
 0.1,
 1,
 {'10%': 0.119, '5%': 0.146, '2.5%': 0.176, '1%': 0.216})

InterpolationWarning: The test statistic is outside of the range of p-values available
in the look-up table. The actual p-value is greater than the p-value returned.

下面是如何解释输出结果的:

  • KPSS测试统计量:0.04776
  • P值:0.1
  • 截断滞后参数:1
  • 临界值为10%5%2.5%1%

p值为0.1。由于这个值不小于0.05,我们未能拒绝KPSS检验的无效假设。

这意味着我们可以假设该时间序列是趋势静止的。

注1:p值实际上甚至大于0.1,但kpss()函数将输出的最低值是0.1。

注2:我们必须使用参数regression='ct'来指定测试的无效假设是数据是趋势静止的。

例2:Python中的KPSS测试(非静止数据)

首先,让我们在Python中创建一些假的数据来工作:

import numpy as np
import matplotlib.pyplot as plt

#make this example reproducible
np.random.seed(1)

#create time series data
data =np.array([0, 3, 4, 3, 6, 7, 5, 8, 15, 13, 19, 12, 29, 15, 45, 23, 67, 45])

#create line plot of time series data
plt.plot(data)

再次,我们可以使用statsmodels 包中的 **kpss()**函数对这个时间序列数据进行 KPSS 检验。

import statsmodels.api as sm

#perform KPSS test
sm.tsa.stattools.kpss(data, regression='ct')

(0.15096358910843685,
 0.04586367574296928,
 3,
 {'10%': 0.119, '5%': 0.146, '2.5%': 0.176, '1%': 0.216})

下面是如何解释输出结果的:

  • KPSS测试统计量:0.1509
  • P值:0.0458
  • 截断滞后参数:3
  • 10%5%、2.5%1%的临界值

p值为0.0458。由于这个值小于0.05,我们拒绝KPSS检验的无效假设。

这意味着该时间序列不是趋势静止的:

注意:你可以在这里找到statsmodels软件包中kpss()函数的完整文档。

其他资源

下面的教程提供了关于如何在Python中处理时间序列数据的额外信息:

如何在Python中进行Augmented Dickey-Fuller测试
如何在Python中进行Mann-Kendall趋势测试
如何在Matplotlib中绘制一个时间序列图