时间序列差分:完整指南

导航至

什么是时间序列差分分析?

时间差分分析是一种在设定的时间段内,以规则的时间间隔分析数据点的方法。然而,在时间序列分析中,我们推导出关键信息,例如一段时间内数据点之间变量的方差。这提供了关于数据如何随时间变化的额外信息。这可以用于分析不同时间间隔不同趋势期间的数据。它还可以帮助验证时间序列是否遵循平稳模式或具有非平稳模式,以及如何分析这两种模式。

时间序列分析通常被商业、科学和其他类型的组织用于更好地进行预测性分析。时间序列分析旨在发现不同时间段内数据模式的变化。这提供了数据趋势如何移动的更好画面,允许用户基于这些观察结果开发一个模型,该模型捕捉了数据的大部分趋势。

平稳和非平稳数据趋势是基于一段时间内的数据趋势对数据进行的不同分类。平稳数据趋势是一种数据模式,它在没有季节性变化或波动的情况下重复出现,并且随时间推移具有恒定的方差。非平稳数据趋势是一种数据趋势,它随时间推移不具有恒定的方差,但在不同的时间段内具有季节性波动。在本文中,我们将主要关注非平稳数据趋势,并简要概述平稳数据趋势。

平稳时间序列

平稳时间序列是指数据方差在不同时间段内恒定的时间序列。随着时间的推移,数据模式没有季节性波动或变化。数据是自相关的,并且数据点之间的差异遵循静态模式。这通常可以在数据点的图中清楚地看到。这种类型的数据不提供关于数据趋势的有用信息。平稳时间序列仅遵循具有恒定方差的水平方向。

测试时间序列:Dicky-Fuller 检验

统计学中的Dicky-Fuller 检验用于测试给定的数据模型是平稳的还是非平稳的。我们设置零假设(Ho),表明数据是平稳的。这也意味着单位根(δ)为零。在δ = 0的情况下,Dicky-Fuller 检验中的单位根证实了零假设,否则任何情况都证实了备择假设。下面,我们有三个在不同条件下测试单位根的检验。该检验的三个版本是

  1. 单位根检验 ΔY = δY-1 + At,其中 δY-i 是前一项的两个数据点之间的差异。At 是误差变量项,它可以变化,例如在下面的随机游走非平稳模型中。
  2. 具有常数的单位根检验 ΔY = δY-i + At + Co,其中 Co 是常数。
  3. 具有常数和确定性时间趋势 (t) 的单位根检验:ΔY = δY-i + At + Co + tCi

然而,Dicky-Fuller 检验可能容易出现接近于零的观测问题。这就是为什么我们将使用 Augmented Dicky-Fuller 检验 (ADF),它从序列中消除了自相关性。Augmented Dicky-Fuller 检验遵循与一般 Dicky-Fuller 检验相似的检验版本。此外,ADF 与一般 Dicky-Fuller 检验具有相同的零假设。

如果单位根的数量 (δ) > 0 且 p 值 > 0.05,则不拒绝零假设。但是,对于 p 值 < 0.05 的显著性水平的情况,则拒绝零假设。ADF 的最终公式为 D.F= δ/S.E(δ),其中 D.F 是 Dicky-Fuller 值,S.E 是标准误差,我们在其中从序列中消除了自相关性。

非平稳时间序列

非平稳时间序列是指数据方差在一段时间内存在模式或趋势的情况。与方差在一段时间内恒定的平稳时间序列不同,非平稳时间序列显示时间序列的变化或波动。这提供了关于一段时间内数据趋势的信息。

何时时间序列是非平稳的?ADF 和拒绝备择假设

在 Augmented Dicky-Fuller 检验中,如果未拒绝零假设,我们可以测试时间序列是否是非平稳的。

如果单位根的数量 (δ) 大于 0 且 p 值 大于 0.05 的显著性水平,则时间序列被认为是非平稳的。如果 p 值 < 0.05,则零假设 (Ho) 被拒绝,并且备择假设 (Ha) 被认为是正确的。

我们可以使用 Python 中的 statsmodel 包、R 中的 tseries 库或 Julia 中的 HypothesisTests,但我们在此文章中仅介绍 Python 代码。

在 Python 中应用 Augmented Dicky-Fuller 检验

首先,安装所需的包


pip3 install statsmodels matplotlib

然后通过创建一个包含随机值的列表来启动代码


import random

data = [random.random() for x in range(10)]

现在,使用 matplotlib 绘制数据点


import random

import matplotlib.pyplot as plt

data = [random.random() for x in range(10)]

#We plot the data first and save the image of the graph

plt.plot(data)

虽然图表可能有所不同,但我得到的图表看起来像这样: 现在,使用 statsmodels 中的 Augmented Dicky-Fuller 函数 Adfuller 测试零假设。最终代码如下所示


import random

import matplotlib.pyplot as plt

from statsmodels.tsa.stattools import adfuller

data = [random.random() for x in range(10)]

#We plot the data first and save the image of the graph

plt.plot(data)

#We finally test using the Augmented Dicky fuller test

adf_result = adfuller(data)

print(f"Test Static: {adf_result[0]}\n p-value: {adf_result[1]}")

上面代码执行时的最终 p 值


p-value: 0.200584620

这大于 0.05 的显著性水平。因此,不拒绝零假设,我们可以得出结论,给定的数据模型是非平稳的。

下面,我们将讨论一阶和二阶时间序列差分。在一阶时间序列差分中,我们将讨论并实现对数变换,以将非平稳时间序列转换为平稳时间序列。

一阶时间序列差分

顾名思义,一阶时间序列是将非平稳时间序列转换为平稳时间序列,以便进一步分析数据并帮助理解数据中的方差。对数据模型应用对数变换之类的变换可以获得数据的平稳表示。

我们将通过使用 NumPy 对数函数对数据应用对数变换,基于上面的代码来实现对数变换。这可以通过将以下代码添加到我们之前的代码中来实现


import numpy as np

log_data = np.log(data)

我们还添加了一行代码,将我们的图表另存为 PNG 图像


plt.savefig('Graph_cmpr.png')

最终代码将如下所示


import random

import matplotlib.pyplot as plt

from statsmodels.tsa.stattools import adfuller

import numpy as np

data = [random.randrange(5, 20) for x in range(10)]

#We plot the data first and save the image of the graph

plt.plot(data)

#We finally test using the Augmented Dicky fuller test

adf_result = adfuller(data)

if adf_result[1] > 0.05:  # We check if p-value is greater

	# than 0.05

	pass  # continue the code below

else:

	print(

	    "The p-value is lesser than the significant value. Hence the data is already stationary and cannot be further processed"

	)

	quit()

# We apply the log transformation to the data

log_data = np.log(data)

#Now we plot the log transformed data

plt.plot(log_data)

#Now finally we save the plot of two graphs for comparison

plt.savefig('Graph_cmpr.png')

通过执行上述代码生成的最终图表为: 蓝色图线是数据点的实际值,而橙色图线是数据点的对数变换。因此,我们可以看到,通过对数据进行差分,我们可以从非平稳数据趋势中推导出平稳数据趋势。

二阶时间序列差分

如果时间序列的一阶差分仍未平稳,我们可以应用二阶差分,使时间序列平稳以进行进一步分析。通常,一阶时间序列差分对于大多数情况都已足够,但如果数据在不均匀的时间间隔内变化很大,则可以使用二阶差分。

最终想法

这篇文章介绍了时间序列分析以及平稳和非平稳时间序列之间的区别。它还介绍了使用 Dicky-Fuller 检验测试非平稳时间序列。然后,它涵盖了一阶和二阶差分之间的区别。最后,它展示了如何使用它们来生成数据的平稳表示。