对于时序预测,首先要看的就是数据是否符合平稳性要求,再去做模型,最后评估。其实就是要对数据的特性首先分析,很多算法(如ARMA)对数据平稳是有一定要求。在对时序预测的时候,数据不符合平稳性,一般可以通过log变换,差分等方法将不平稳的数据转化成平稳数据(如ARIMA)。

数据平稳性定义

直观的理解,时序数据平稳就是说数据随着时间的变化保持着“一如既往”的平稳,也就是任何时间点上观测的数据应该是如同常数。也就是并不存在周期性,趋势这些性质。
一般满足如下条件的时序数据为平稳数据:

  • 均值是与时间无关的常数, 时序数据平稳性 - 图1
  • 方差是与时间无关的常数, 时序数据平稳性 - 图2
  • 协方差只是与时间间隔相关,与时间无关, 时序数据平稳性 - 图3

最常见的平稳数据就是白噪音,但是随机行走就不是平稳数据了。

数据平稳性检验

对于数据是否符合平稳性,可以进行检测的方法包括ADF test和KPSS test。
检测的核心其实是证明是否可以拒绝原假设:时序数据存在单位根。以AR(1)为例
时序数据平稳性 - 图4
时序数据平稳性 - 图5时,说明unit root(单位根)存在,就说明假设成立,存在单位根,数据不平稳
其实本质上,检测时序数据是否平稳,就相当于检测数据是否属于白噪音

数据平稳检测python

可以使用python的statsmodels的库进行平稳检验,样例代码如下:

  1. from statsmodels.tsa.stattools import adfuller
  2. import pandas as pd
  3. df = pd.util.testing.makeTimeDataFrame(50)
  4. result = adfuller(df['A'])
  5. print(result)
  6. > (-3.758511987497101, 0.0033614856672170494, 1, 48, {'1%': -3.5745892596209488, '5%': -2.9239543084490744, '10%': -2.6000391840277777}, 112.0080075068739)

可以看到检测值p value=0.00336低于0.05,可以拒绝源假设。当然也可以观测ADF Statistics:-3.758,小于Critical Values的1%的值。
PS: 平稳性检验:如果检验统计量小于临界值,我们可以拒绝原假设(也就是序列是平稳的)。当检验统计量大于临界值时,不能拒绝原假设(这意味着序列不是平稳的)。
如下是kpss的方法

  1. from statsmodels.tsa.stattools import kpss
  2. result = kpss(df['A'])
  3. print(result)
  4. > (0.4872808164250648, 0.04453134765201243, 3, {'10%': 0.347, '5%': 0.463, '2.5%': 0.574, '1%': 0.739})

平稳性的种类

  • 严格平稳:严格平稳序列满足平稳过程的数学定义。严格平稳序列的均值、方差和协方差均不是时间的函数。我们的目标是将一个非平稳序列转化为一个严格平稳序列,然后对它进行预测。
  • 趋势平稳:没有单位根但显示出趋势的序列被称为趋势平稳序列。一旦去除趋势之后,产生的序列将是严格平稳的。在没有单位根的情况下,KPSS检测将该序列归类为平稳。这意味着序列可以是严格平稳的,也可以是趋势平稳的。
  • 差分平稳:通过差分可以使时间序列成为严格平稳的时间序列。ADF检验也称为差分平稳性检验。

所以:KPSS =平稳 and ADF =非平稳->趋势平稳,去除趋势后序列严格平稳; KPSS =非平稳 and ADF =平稳->差分平稳,利用差分可使序列平稳。如果都平稳,那么就是平稳

平稳化方法

  • 差分法:时序数据平稳性 - 图6
  • 季节差分法:时序数据平稳性 - 图7,

参考

手把手教你用Python处理非平稳时间序列 https://blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/84207895