# 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)拟合之后的**残差序列**进行检验, 如果残差序列能够通过检测, 说明残差序列是白噪声序列, 模型拟合的效果很好.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blessbingo.gitbook.io/garnet/shi-jian-xu-lie/0x05-shi-jian-xu-lie-zhong-de-jian-yan.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
