如何检查时间序列是否平稳,如果它是非平稳的,我们可以怎么处理

当未来的数据与现在相似时,它更容易建模。平稳性描述了时间序列的统计特征不随时间变化的概念。因此一些时间序列预测模型,如自回归模型,依赖于时间序列的平稳性。

什么是平稳性?

平稳性描述了时间序列如何未来保持不变的概念。用数学术语来说,当时间序列的统计特性与时间无关时,它是平稳的,包括

  • 均值不变(为常数)
  • 方差不变
  • 协方差与时间无关

这就是平稳性的弱形式的定义。另一种平稳性是严格平稳性。这意味着相同大小的样本具有相同的分布。由于严格平稳性具有局限性和罕见性,所以本文仅关注弱形式平稳性。

为什么平稳性很重要?

一些时间序列预测模型(例如,自回归模型)需要平稳的时间序列,因为它们更容易建模,因为它们具有恒定的统计属性。因此如果时间序列不是平稳的,就应该尽量让它平稳。

如何检验平稳性?

你可以用两种方法来测试时间序列的平稳性:

  • 直观的方法:肉眼评估
  • 统计方法:单位根检验

我们将创建几个示例,使用Hyndman 和 Athanasopoulos的时间序列分析教材《Forecasting: principles and practice》中提到方法解释平稳性的视觉评估,并扩展它们的用法,并解释使用单位根测试进行的平稳性测试。数据来自R的fma 包。

时间序列的平稳性_时间序列

1、直观地评估平稳性

最简单的方法是将时间序列分成两半,并比较时间序列的前半部分到后半部分的平均值、振幅和周期长度。

  • 均值常数-时间序列前半段的均值应该与后半段的均值相似。
  • 方差常数-时间序列的前半段的振幅应该与后半段相似。
  • 协方差与时间无关——时间序列前半部分的周期长度应该与后半部分的周期长度相似。周期应该在时间上是独立的(例如,不是每周或每月等)。

时间序列的平稳性_差分_02

对于我们的例子,评估结果如下图所示:

时间序列的平稳性_机器学习_03

2、统计评估平稳性——单位根检验

单位根是一种随机趋势,称为“带漂移的随机游走”。由于随机性无法预测,这意味着:

单位根存在:不稳定(不可预测),单位根不存在:平稳的

为了用单位根检验平稳性,可以将两个这两个假设作为初始假设:

  • 零假设(H0) -时间序列是平稳的(没有单位根存在)
  • 备择假设(H1) -时间序列不是平稳的(存在单位根)

然后根据以下两种方法评估是否拒绝零假设:

p 值方法:

如果 p 值 > 0.05,则无法拒绝原假设。如果 p 值 ≤ 0.05,则拒绝零假设。

临界值法:

如果检验统计量没有临界值那么极端,则无法拒绝原假设。如果检验统计量比临界值更极端,则拒绝原假设。当 p 值接近0.05时,应使用临界值法 。

有几个单位根测试可以用来检查平稳性。本文将重点介绍最流行的2个:

Augmented Dickey-Fuller test 和 Kwiatkowski-Phillips-Schmidt-Shin test

3、Augmented Dickey-Fuller test

Augmented Dickey-Fuller test的假设为:

H0:时间序列不是平稳的,因为有一个单位根(如果p值> 0.05)

H1:时间序列是平稳的,因为没有单位根(如果p值≤0.05)

在Python中,我们可以直接使用statsmodels.tsa.stattools库中的adfuller方法。

from statsmodels.tsa.stattools import adfuller
 result = adfuller(df["example"].values)

如果我们可以拒绝ADF检验的零假设,则时间序列是平稳的:

时间序列的平稳性_差分_04

下面是样本数据集的ADF测试结果:

时间序列的平稳性_差分_05

4、Kwiatkowski-Phillips-Schmidt-Shin test

Kwiatkowski-Phillips-Schmidt-Shin (KPSS)检验的假设是[4]:

H0:时间序列是平稳的,因为没有单位根(如果p值> 0.05)

H1:时间序列不是平稳的,因为有一个单位根(如果p值≤0.05)

statsmodels.tsa.stattools库中的kpss方法,我们需要使用参数regression = 'ct’来指定检验的零假设是数据是趋势平稳的。

from statsmodels.tsa.stattools import kpss
 
 result = kpss(df["example"].values, 
               regression = "ct")

如果我们不能拒绝KPSS检验的零假设,则时间序列是平稳的:

时间序列的平稳性_python_06

下面是样本数据集的KPSS测试结果:

时间序列的平稳性_深度学习_07

非平稳时间序列数据处理

我们可以对一个非平稳时间序列应用不同的变换,使其接近平稳:因为有几种平稳性类型,所以我们可以结合ADF和KPSS测试来确定要进行哪些变换:

  • 如果ADF测试结果是平稳的,而KPSS测试结果是非平稳的,则时间序列是差分平稳的-对时间序列应用差分,并再次检查平稳。
  • 如果ADF检验结果是非平稳性的,而KPSS检验结果是平稳性的,则该时间序列为趋势平稳的-需要去掉去趋势,并再次检查平稳性。

1、差分

差分计算两个连续观测值之间的差值。它稳定了时间序列的平均值,从而降低了趋势

df["example_diff"] = df["example"].diff()

时间序列的平稳性_差分_08

2、同过模型拟合去趋势

从非平稳时间序列中去除趋势的一种方法是将一个简单的模型(例如,线性回归)拟合到数据上,然后对该拟合的残差进行建模。

from sklearn.linear_model import LinearRegression
 
 # Fit model (e.g., linear model)
 X = [i for i in range(0, len(airpass_df))]
 X = numpy.reshape(X, (len(X), 1))
 y = df["example"].values
 model = LinearRegression()
 model.fit(X, y)
 
 # Calculate trend
 trend = model.predict(X)
 
 # Detrend
 df["example_detrend"] = df["example"].values - trend

结果如下:

时间序列的平稳性_差分_09

3、对数变换

对数变换可以稳定时间序列的方差。

df["example_diff"] = np.log(df["example"].value)

结果如下:

时间序列的平稳性_机器学习_10

正如你所看到的,模型拟合的去趋势和对数变换都不能使我们的例子时间序列平稳。所以需要结合不同的技术使时间序列平稳。

总结

在时间序列预测中,具有恒定统计属性(均值、方差和协方差)且与时间无关的时间序列被描述为平稳的。由于稳定的统计特征,平稳时间序列比非平稳时间序列更容易建模。所以很多时间序列预测模型都假设了平稳性。

平稳性可以通过目测或统计方法进行检查。统计方法检查单位根,最流行的两种单位根测试是ADF和KPSS。这两种工具都可以在Python stattools库中找到。

如果时间序列是非平稳的,可以尝试通过差分、对数转换或去除趋势来使其接近平稳。


作者:Leonie Monigatti