> For the complete documentation index, see [llms.txt](https://kerasnoone.gitbook.io/garnet/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kerasnoone.gitbook.io/garnet/xi-fen-ling-yu/shi-jian-xu-lie/0x05-shi-jian-xu-lie-zhong-de-jian-yan.md).

# 0x05 时间序列中的检验

这里介绍时间序列中的各种统计检验的方法, 主要是检验原理和应用场景.

## Augmented Dickey-Fuller unit root test

**单位根检验**, **ADF检验**, 作用是检验时间序列的**平稳性**.

检验一个**单变量自回归模型**(AR模型)是否存在单位根. 单变量自回归模型指的是**AR(1)**, 即:

$$X\_t=\rho X\_{t-1} + \varepsilon\_t$$

单位根存在时有以下的表现和性质:

* $$\rho \lt 1$$时, 单位根不存在, $$\rho=1$$时, 单位根存在
* 单位根不存在时, 时间序列是平稳的, 即$$\rho \lt 1$$时, $$X\_t$$是平稳序列

之所以$$\rho \lt 1$$时, 时间序列是平稳的, 原理在于:

* 当$$\rho \lt 1$$时:

  $$\begin{aligned} Var(X\_t) &= Var(\rho X\_{t-1} + \varepsilon\_t) \ &= Var(\rho(\rho X\_{t-2} + \varepsilon\_{t-1}) + \varepsilon\_t) \ &= Var(\rho^2X\_{t-1} + \rho \varepsilon\_{t-1} + \varepsilon\_t) \ &= \cdots \ &= Var(\rho^tX\_0 + \rho^{t-1}\varepsilon\_{1} + \rho^{t-2}\varepsilon\_{2} + \cdots + \rho\varepsilon\_{t-1} + \varepsilon\_t) \ &= Var(\rho^{t-1}\varepsilon\_{1} + \rho^{t-2}\varepsilon\_{2} + \cdots + \rho\varepsilon\_{t-1} + \varepsilon\_t) \ &=\rho^{2(t-1)}Var(\varepsilon\_{1}) + \rho^{2(t-2)}Var(\varepsilon\_{2}) + \cdots + Var(\varepsilon\_t) \ &= \sigma^2(1+\rho^2 + \rho^4 + \cdots + \rho^{2(t-1)}) \ &= \sigma^2\frac{1}{1-\rho^2} \end{aligned}$$

  上面的推到过程中使用到了:

  * 第二行: AR模型的迭代
  * 第五行: $$\rho^t X\_0$$项的消失是因为$$X\_0$$是常数项, 其方差为0
  * 第七行: 所有误差项的方差是相同的, 都是$$\sigma^2$$
  * 第八行: 等比数列的求和公式

  因此可以得到时间序列$$X\_t$$的方差是一个**常数**, 即$$\frac{1}{1-\rho^2}$$. 这满足平稳序列的方差是个常数的性质.
* 当$$\rho=1$$时:

  $$\begin{aligned} Var(X\_t) &= Var(X\_{t-1} + \varepsilon\_t) \ &= Var(X\_{t-2} + \varepsilon\_{t-1} + \varepsilon\_t) \ &= Var(X\_0 + \varepsilon\_{1} + \varepsilon\_{2} + \cdots + \varepsilon\_{t-1} + \varepsilon\_t) \ &=Var(\varepsilon\_{1}) + Var(\varepsilon\_{2}) + \cdots + Var(\varepsilon\_t) \ &= t\sigma^2 \end{aligned}$$

  因此, 此时时间序列的方差是一个与时间有关的函数, 肯定是非平稳的.

以上是单位根与平稳性关系的原理. 整个平稳性检验的过程为:

* 原假设为$$\rho=1$$, 即时间序列是不平稳的
* 通过**线性回归方法**拟合出**自回归模型**.
  * 需要注意的是, 这里假设的自回归模型不是AR(1), 而是包含若干个`lag`的**AR(p)**
  * 这里**p**参数的选择, 在`statsmodels.tsa.stattools.adfuller`中都有体现
    * 根据$$12\*(n/100)^{1/4}$$公式自动得出
    * 使用AIC或BIC评价线性模型拟合的结果, 选取最好的
    * 使用$$t$$统计量, 从$$12\*(n/100)^{1/4}$$开始, 逐步自减1, 直到$$t$$统计量低于5%显著性水平. 这里的检验是对回归系数进行的检验
  * 根据拟合好的模型, 只选取`p[0]`即$$X\_{t-1}$$项的**相关系数**进行检验, 检验的方法是`MacKinnon`, 得到对应**p值**, 进行判断, 并返回结果

在`Python`中的使用方法为:

```python
from statsmodels.tsa.stattools import adfuller
```

使用方法参考[statsmodels.tsa.stattools.adfuller](http://www.statsmodels.org/devel/generated/statsmodels.tsa.stattools.adfuller.html?highlight=adfuller#statsmodels.tsa.stattools.adfuller).

## Kwiatkowski-Phillips-Schmidt-Shin test

**KPSS检验**也是用来检验时间序列平稳性的方法.

KPSS检验的**原假设**等价于时间序列是**平稳的**, 因此, 只要得到的**p值**不小于显著性水平即可说明时间序列是平稳的.

KPSS检验中构建了一个比较复杂的**统计量**, 且这个统计量服从的分布也不是常用的几种分布. 通过论文作者给出的不同显著性水平对应的**临界统计值表**和**线性插值**的方法, 对计算得到的统计量, 计算得到其**p值**, 做出判断.

在`Python`中的使用方法为:

```python
from statsmodels.tsa.stattools import kpss
```

使用方法参考[statsmodels.tsa.stattools.kpss](http://www.statsmodels.org/devel/generated/statsmodels.tsa.stattools.kpss.html).

## Ljung-Box test

* **目标**: 检验时间序列是否具有**自相关性**, 换句话说是对序列的**随机性**进行的检测. 白噪声序列可以通过检测, 具有自相关性的序列(如可以使用`AR`模型进行建模的序列)则不能通过检测.
* **检验方法**: 通过序列本身的**自相关系数**$$\rho$$的值, 判断指定`lag`范围内的自相关系数集合$$\rho\_1, \rho\_2, \cdots, \rho\_m$$是否都为0, 其中$$m$$是人为指定的判断范围.

因此, **Ljung-Box test**假设时间序列是完全随机的, **各个值之间没有相关性, 完全独立**, 因此原假设$$H\_0$$为:

$$H\_0: \rho\_1=\rho\_2=\cdots=\rho\_m=0$$

如果所有的自相关系数中有一个显著不为0, 则认为时间序列是有相关性的, 就要拒绝原假设, 因此备择假设为:

$$H\_1: \exists{}i\in{{1,\cdots,m}}, \quad \rho\_i \neq 0$$

构造检测需要使用的统计量:

$$Q(m)=n(n+2)\sum\limits\_{k=1}^m\frac{\rho\_k^2}{n-k}$$

其中$$n$$是时间序列的长度. 这个统计量服从**自由度为**$$m$$**的**$$\chi^2$$**分布**. 因此对于显著性水平$$\alpha$$, 当$$Q \gt \chi^2\_{1-\alpha,m}$$时, 拒绝原假设, 否则接受原假设.

注意, 接受原假设意味着接受时间序列是相互独立的, 即为**白噪声序列**.

* **用途**: Ljung-Box test常用在对模型(如ARIMA)拟合之后的**残差序列**进行检验, 如果残差序列能够通过检测, 说明残差序列是白噪声序列, 模型拟合的效果很好.
