如何去除时间序列中的非平稳性

17 Mar 2025 | 5 分钟阅读
How to Remove Non-Stationarity From Time Series

除了正态性假设外,大多数机器学习算法都假设输入特征和输出之间存在静态关系。

静态关系需要输入和输出具有恒定的特征,例如均值、中位数和方差。换句话说,当输入和输出固定时,算法效果最好。时间序列预测并非如此。随时间波动的分布可能表现出明显的特征,例如季节性和趋势。这些特征反过来又会导致序列均值和方差的波动,从而难以对其行为进行建模。

因此,使分布平稳是时间序列预测中的一个严格条件。

平稳性的重要性

如果分布不稳定,则难以建模。算法通过计算底层分布的关键参数来建立输入和输出之间的联系。

当所有这些因素都随时间变化时,算法会在不同时间点遇到不同的值。如果时间序列足够精细(例如,分钟或秒),模型可能比实际数据包含更多的参数。输入和输出之间这种可变的关系从根本上破坏了任何模型的决策功能。如果关系随时间变化,模型将使用过时的关系或不增加其预测能力的关系。

因此,您必须在工作流程中花费一定的精力来检测非平稳性并消除其影响。

统计学上检测非平稳性

有多种测试属于单位根检验的范畴。增强的 Dickey-Fuller 检验可能是最常见的,我们已经在之前的内核中看到了如何使用它来识别随机游走。

以下是如何使用它来确定序列是否平稳。

简单来说,以下是检验的零假设和备择假设:

  • 零假设指出,分布是非平稳的且与时间相关(具有单位根)。
  • 备择假设指出,分布是平稳的,而不是与时间相关的(它不能用单位根表示)。

p 值决定了检验的结果。如果它小于关键阈值(0.05 或 0.01),则我们拒绝零假设,并推断序列是平稳的。否则,我们未能拒绝零假设,并推断序列不是平稳的。

整个检验可以轻松地作为 statsmodels 中的一个 adplete 函数来实现。首先,让我们将其应用于我们知道是稳定的分布,并熟悉其结果。

输出

How to Remove Non-Stationarity From Time Series

我们查看 p 值,该值接近零。这意味着我们可以轻易地拒绝零假设,并假设该分布是平稳的。让我们从 Kaggle 导入 TPS July Playground 数据集,看看目标一氧化碳是否平稳。

输出

How to Remove Non-Stationarity From Time Series

令人惊讶的是,一氧化碳被发现保持平稳。这可能是因为数据是在短时间内收集的,从而减少了时间分量的影响。事实上,数据中的所有变量都是完全平稳的。

现在,让我们加载一些非平稳的股票数据。

输出

How to Remove Non-Stationarity From Time Series

正如您所见,亚马逊股票呈现出明确的上升趋势。让我们运行 Dickey-Fuller 检验。

输出

How to Remove Non-Stationarity From Time Series

我们得到一个完美的 p 值 1,表示 100% 非平稳的时间序列数据。在继续处理此类数据的其他策略之前,让我们对微软股票进行最后一次检验。

输出

How to Remove Non-Stationarity From Time Series

输出

How to Remove Non-Stationarity From Time Series

p 值接近 1。无需解释。

将非平稳序列转换为平稳序列

差分是改变最基本非平稳数据的一种方法。此过程涉及取连续观测值之间的差值。为此,Pandas 有一个不同的函数。

输出

How to Remove Non-Stationarity From Time Series

上述输出显示了一阶、二阶和三阶差分的结果。

对于简单的分布,一阶差分足以使其平稳。让我们通过将 adfuller 函数应用于微软股票的一阶差分 diff_1 来验证这一点。

输出

How to Remove Non-Stationarity From Time Series

当我们对微软股票的原始分布使用 adfuller 时,p 值接近一。差分后,p 值恰好为 0,这表明我们可以拒绝零假设,并推断序列现在是平稳的。

然而,其他分布可能不容易处理。回到亚马逊股票。

输出

How to Remove Non-Stationarity From Time Series

在计算差分之前,我们必须考虑明显的非线性趋势。否则,序列仍将是非平稳的。为了消除非线性,我们将使用对数函数 np.log,然后计算一阶差分。

输出

How to Remove Non-Stationarity From Time Series

输出

How to Remove Non-Stationarity From Time Series

正如您所见,在变换之前具有完美 p 值的分布现在已完全平稳。

让我们看另一个例子。下图显示了澳大利亚抗生素的月销量。

输出

How to Remove Non-Stationarity From Time Series

正如您所见,数据同时表现出上升趋势和明显的季节性。为了消除季节性,我们将再次应用对数变换,但这次使用年度差分(12 个月)。每个步骤的样子如下:

输出

How to Remove Non-Stationarity From Time Series

我们可以使用 adfuller 来确认平稳性。

输出

How to Remove Non-Stationarity From Time Series

p 值非常小,表明变换过程是有效的。

总的来说,每个分布都是独一无二的,因此实现平稳性可能需要一系列程序。其中大多数包括对数、一阶/二阶计算或季节性差分。


下一个主题AutoEncoders