如何测试时间序列中趋势的存在?

机器算法验证 时间序列 假设检验 趋势
2022-03-02 16:08:56

除了从时间序列图中检测趋势之外,您如何在使用移动平均线移除趋势之前测试它的存在?

我对数据拟合了一个数学趋势,斜率大约为零,这是否意味着没有趋势?

2个回答

您对趋势的行为做出假设。没有假设,您就无法希望测试数据。

去除时间序列的趋势实际上是对时间序列进行建模。

在处理时间序列时,您首先需要做出的最常见(并且经常被违反)的假设如下。

  1. E|Xt|2<,tN
  2. EXt=μ,tN
  3. γ(s,r)=γ(s+t,r+t),r,s,tN

是指以索引作为参数的相关函数。γs,r

符合的时间序列称为弱平稳。

您的数据听起来已经符合 2。如果您的数据随着时间的推移没有变得“嘈杂”,那么它也符合 1。

通常,建模时间序列的第一步是在可能的情况下转换数据以大致满足这些假设。满足项目 1,2 的一种简单方法(有时有效)是对数据进行差分(重复),其中您从其前面的元素中减去时间序列的每个元素。其他选项包括将多项式回归拟合到数据或对周期性趋势的串联窗口执行回归。

希望你留下的是一个大致符合这些假设的系列。您的模型仍然有很多趋势可以吞噬。

这是一个计算的函数。γ

import numpy as np
def autocorrelation(x):
    assert(len(x.shape) == 1)
    n = x.shape[0]
    x -= x.mean()
    trans = np.fft.fft(x, n=n * 2)
    acf = np.fft.ifft(trans * np.conjugate(trans))[:n]
    acf /= acf[0]
    return np.real(acf)

现在让我们看看一些固定数据的实现。

import numpy as np
# Make data that isn't autocorrelated
x_not = np.random.normal(0, 1, 1000)

没有趋势

无趋势自相关函数

# Make autocorrelated data
z = np.random.normal(0, 1, 1000)
x_auto = z[1:] - .8 * z[:-1]

有趋势

趋势的自相关

如果你想要一个明确的测试,那么,其中 n 是时间序列的长度,是空自相关的 95% 置信界限。1.96n

您可以使用时间序列建模变得非常疯狂,但这是时间序列的线性回归模拟。这些技巧的集合形成了所谓的 (S)ARIMA。

在时间序列计量经济学中,一项重要任务是确定数据中趋势的最合适形式,而不仅仅是确定趋势是否存在。

有两种常见的趋势消除程序:假设第一个差异并执行时间趋势回归(或非参数替代方案,例如移动平均线)。前者适用于 I(1)(读取一阶积分)时间序列,后者适用于趋势平稳的 I(0) 时间序列。单位根检验可用于确定趋势的性质(随机或确定性),这将建议适当的方法来消除它。

如前所述,您的问题仅限于对趋势平稳过程的确定性分量的非参数估计。在商业和经济等领域,观察到的趋势通常是随机的。单位根检验(和相应的平稳性检验)是用于确定观察到的序列中是否存在随机趋势的工具。像 Phillips-Perron 测试这样的测试可以适应具有拟合漂移和时间趋势的模型,因此它们可用于区分单位根非平稳性(随机趋势)和关于确定性趋势(非平稳过程)的平稳性。

有很多很好的资料可供进一步阅读,但可能先看看这个理论和这个实践