时序差分:完整指南
作者:社区 / 开发者
2023年12月29日
导航至
什么是时序差分分析?
时序差分分析是一种分析在一定时间段内以固定时间间隔的数据点的方法。然而,在时序分析中,我们推导出变量在一段时间内的方差等关键信息。这为数据随时间的变化提供了额外的信息。这可以用来分析不同时间间隔内不同趋势的数据。它还可以帮助验证时序是否遵循平稳模式或非平稳模式,以及如何分析这些模式。
时序分析通常由商业、科学和其他类型的组织用于更好的预测分析。时序分析旨在寻找不同时间段内数据模式的变化。这为数据趋势的运动提供了一个更好的画面,使用户能够基于这些观察结果开发一个模型,该模型可以捕捉到大部分数据趋势。
平稳数据趋势与非平稳数据趋势:它们是什么?
平稳和非平稳数据趋势是根据一段时间内数据趋势的不同分类。平稳数据趋势是一种数据模式,它不会因为季节变化或波动而重复出现,且在时间上具有恒定的方差。非平稳数据趋势是一种数据趋势,它在时间上不具有恒定的方差,而是在不同时间段内具有季节性波动。在本文中,我们将主要关注非平稳数据趋势,并对平稳数据趋势进行简要概述。
平稳时间序列
平稳时间序列是指在不同时间段内数据方差保持恒定的时间序列。数据没有季节性波动或随时间变化的数据模式。数据是自相关的,且数据点之间的差异遵循静态模式。这种模式通常可以在数据点的图表中清晰地看到。这种类型的数据不会提供有关数据趋势的有用信息。平稳时间序列仅随时间保持恒定的方差并沿水平方向移动。
时间序列测试:迪基-富勒测试
统计学中的迪基-富勒测试用于测试给定数据模型是平稳的还是非平稳的。我们设定零假设(H0),表示数据是平稳的。这也意味着单位根(δ)为零。迪基-富勒测试中的单位根在δ = 0的情况下确认零假设,否则确认备择假设。下面,我们介绍了在不同条件下对单位根的三种测试。测试的三个版本如下
- 单位根测试:ΔY = δY-1 + At,其中δY-i是前一项中两个数据点之间的差异。At是误差变量项,可以变化,如下面的随机游走非平稳模型所示。
- 单位根测试(常数):ΔY = δY-i + At + Co,其中Co是常数。
- 单位根测试(常数和确定性时间趋势t):ΔY = δY-i + At + Co + tCi
然而,迪基-富勒测试容易受到接近零观测值的问题。这就是为什么我们将使用增强型迪基-富勒测试(ADF),它消除了序列中的自相关。增强型迪基-富勒测试遵循与一般迪基-富勒测试相似的测试版本。此外,ADF与一般迪基-富勒测试具有相同的零假设。
如果单位根(δ)> 0且p值> 0.05,则不会拒绝零假设。然而,如果p值< 0.05的显著性水平,则拒绝零假设。ADF的最终公式为D.F= δ/S.E(δ),其中D.F是迪基-富勒值,S.E是标准误差,我们在序列中消除了自相关。
非平稳时间序列
非平稳时间序列是指一段时间内数据方差存在模式或趋势的情况。与方差在一段时间内保持恒定的平稳时间序列不同,非平稳时间序列显示出时间序列中的变化或波动。这提供了有关一段时间内数据趋势的信息。
何时时间序列是非平稳的?ADF和拒绝备择假设
在增强型迪基-富勒测试中,如果零假设未被拒绝,则可以测试时间序列是否为非平稳的。
如果单位根(δ)的数量大于0且p值大于0.05的显著性水平,则认为时间序列是非平稳的。如果p值< 0.05,则拒绝零假设(H0),认为备择假设(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测试对非平稳时间序列进行测试。然后它涵盖了第一阶和第二阶差分的区别。最后,它展示了如何使用它们来产生数据的平稳表示。