【Time Series】时间序列基本概念

2020-08-04 14:40:22 浏览数 (1)

最近一直在接触时间序列,所以打算写一些有关时间序列的文章,预测部分会从规则开始、到传统模型、到机器学习、再到深度学习,此外也会介绍一些时间序列的基本概念,包括自相关、平稳性、滞后性、季节性等。

1.基本概念

1.1 时间序列预测

预测是商业中的常见统计任务,它可以为生产、运输和人员安排等决策提供信息,并为长期战略规划提供指导。预测是指在考虑到所有可用信息的前提下,包括历史数据和可以影响预测的任何未来事件的知识,尽可能准确地预言。

而时间序列预测是指按照时间顺序观察事物的变换。通常会利用同一变量的历史值预测未来值,或者也可以加入一些预测因子来预测未来值。前者称为单变量时间序列预测,后者称为多变量时间序列预测。

通常我们指的时间序列预测都是考虑定期观察的时间序列(如每分、每小时、每天、每周等)。比较经典的案例有:降水量预测、销售预测、流量预测等。

1.2 时间序列成分

时间序列包含很多特征中包含诸多成分,有:

  • 趋势:指时间序列在较长一段时间内呈现出来的持续向上或者持续向下的变动;
  • 季节性:指时间序列在一年内重复出现的周期性波动,如气候条件、生产条件、节假日等;
  • 残差:也称为不规则波动,指除去趋势、季节性、周期性外的随机波动。不规则波动通常总是夹杂在时间序列中,致使时间序列产生一种波浪形或震荡式的变动。只含有随机波动的序列也称为平稳序列。

下图展示了一个时间序列被分解的过程,第一张图是所观察的时间序列,第二张图是趋势、第三张图是季节性,第四张图是残差:

(以上序列并不存在周期性,这里只是举个例子)

1.3 平稳性

1.3.1 类别

平稳性分为弱平稳和严平稳,我们分别给出定义:

  • 「弱平稳」:若序列
{X_t }

存在有限二阶矩。且满足 则称序列

{X_t }

为弱平稳序列。

E(x_t)=mu

与 t 无关;

Var(x_t)=gamma_0

与 t 无关;

gamma_k=Cov(X_{t-k}, X_t), k=1,2,...

与 t 无关;

  • 「严平稳」:对于所有可能的 n,所有可能的
(t_1,t_2,...,t_n)

,和所有可能的 k,当

(X_{t_1},X_{t_2},...,X_{t_n})

的联合分布与

(X_{t_1-k},X_{t_2-k},...,X_{t_n-k})

的联合分布相同时,则序列是强平稳。

值得注意的是,「两种平稳过程并没有包含关系」,即弱平稳不一定是严平稳,严平稳也不一定是弱平稳。(感兴趣的可以自己查资料证明,这里不过多介绍)

由于严平稳的要求过于苛刻,所以我们所说的大部分时间序列预测都是弱平稳的时间序列。

1.3.2 为什么需要平稳性

那么我们为什么要关注序列的平稳性呢?

这是因为有些预测统计方法是以平稳序列为假设前提而进行设计的,比如自回归模型。其假设是变量的历史与现状呈现出基本特性,并在未来阶段的一个时间里会维持不变。

更具体的说,自回归预测模型的本质是“利用序列的滞后阶数(lags)作为自变量”的线性回归模型,比如 lags=2 表示使用变量的 t-1 和 t-2 时刻的值作为自变量来预测 t 时刻的值。那么通过在历史序列上训练模型后,得到的这个线性回归模型的各自变量的系数就代表了各滞后时刻的值与下一时刻值的相关性,如果时间序列接近平稳,这些相关性在未来一段时间内都不会有太大的变化,那么预测未来就成为了可能。

1.3.3 非平稳序列如何预测

对于非平稳时间序列的预测,我们需要将其变换为平稳时间序列,常用的方法有:

  • 差分(一阶/n 阶);
  • 取 log;
  • 开根号;
  • 时间序列分解。

一般来说,做个一阶差分就可以得到接近平稳的时间序列了,如果方差随时间变化较大,那么可以先取 log 再做一阶差分。如下图所示:上面两张图为非平稳的时间序列,经过一阶差分后便得到了相对平稳的时间序列。当然,经过二阶差分后,其效果会更好。

1.3.4 如何测试平稳性

判断一个序列是否是平稳的,除了通过肉眼判断和上面提到的定义外,还有两种比较科学的基于单位根检验的方法:

  • Augmented Dickey Fuller test (ADF Test):其零假设为序列有单位根,是非平稳的,P-Value如果小于显著级别(0.05),则可以拒绝零假设;
  • Kwiatkowski-Phillips-Schmidt-Shin – KPSS test (trend stationary):与 ADF 正好相反,零假设为序列是平稳的。另外,在 Python 中,可以通过指定 regression='ct' 参数来让 kps 把“确定性趋势(deterministic trend)”的序列认为是平稳的。

1.4 滞后算子

先给出定义:如果算子运算是将一个时间序列的前一期值转化为当期值,则称此算子为滞后算子,记做 L。即对任意时间序列

x_t

,滞后算子满足:

L(x_t) equiv x_{t-1}

类似也可以定义高阶滞后算子,例如二阶滞后算子为

L^2(x_t) = L[L(x_t)]=x_{t-2}

高阶滞后算子有:

L^k(x_t) = x_{t-k}

1.5 自相关函数

首先,我们先来介绍下相关系数,公式:

large rho_{xy} = frac{Cov(X,Y)}{sqrt{Var(X)Var(Y)}}

根据样本的估计得到公式:

large rho_{xy} = frac{sum_{t=1}^{T}(x_t- bar x)(y_t-bar y)}{sqrt{ sum_{t=1}^{T}(x_t- bar x)^{2}sum_{t=1}^{T}(y_t- bar y)^{2}}} = frac{overrightarrow{(X- bar x)} cdot overrightarrow{(Y- bar y)}}{lvert overrightarrow{(X- bar x)} rvert lvert overrightarrow{(Y- bar y)} rvert}

可以看到,相关系数其实就是计算了向量空间中两个向量的夹角,而协方差是去均值后两个向量的内积。

如果两个向量平行,相关系数等于 1 或者 -1,垂直则为 0。

相关系数度量了两个向量的线性相关性,而在平稳时间序列

{r_t}

中,我们有时候很想知道,

r_t

与它的过去值

r_{t−i}

的线性相关性。这时候我们便把相关系数的概念推广到自相关系数。

r_t

r_{t−l}

的相关系数称为

r_t

的间隔为 l 的自相关系数,通常记为

rho_l

。具体的:

large rho_l = frac{Cov(r_t,r_{t-l})} {sqrt{Var(r_t)Var(r_{t-l})}} = frac{Cov(r_t,r_{t-l})} {Var(r_t)}

这里用到了弱平稳序列的性质:

large Var(r_t)=Var(r_{t-l}) \

对一个平稳的时间序列的样本

{r_t}

,1≤t≤T,则间隔为 l 的样本自相关系数的估计为:

large hat rho_l = frac{sum_{t=l 1}^{T}(r_t- bar r)(r_{t-l}-bar r)}{ sum_{t=1}^{T}(r_t- bar r)^{2}}, 0 leqslant l leqslant T-1

则函数

large hat rho_1,hat rho_2 ,hat rho_3…

称为

r_t

的样本自相关函数(ACF)。

假设现在有这样一个时间序列:

其自相关图为:

  • 自相关系数值随着滞后阶数增加而缓慢降低,是因为原时间序列中具有趋势变化;
  • 图中的“圆齿状”形状是来源于原时间序列中的季节性变化;
  • 蓝色虚线之内的区域自相关性可近似看做0。

1.6 白噪声

如果弱平稳序列额

{X_t}

满足

rho_k = 0,k=1,2,...

{X_t}

为白噪声序列。

如果随机变量序列

{X_t}

独立且期望和方差不随时间而变,则称

{X_t}

为独立白噪声。

如果独立白噪声还是同分布的,称为独立同分布白噪声。

简单来说“白噪声”是一个对所有时间其自相关系数为零的随机过程。下图展示了白噪声的例子:

其自相关系数为:

对于白噪声而言,我们期望它的自相关值接近 0。但是由于随机扰动的存在,自相关值并不会精确地等于 0。对于一个长度为 T 的白噪声序列而言,我们期望在 0.95 的置信度下,它的自相关值处于

±2/sqrt{T}

之间。我们可以很容易的画出 ACF 的边界值(图中蓝色虚线)。如果一个序列中有较多的自相关值处于边界之外,那么该序列很可能不是白噪声序列。

在上例中,序列长度 T=50,边界为

±2/sqrt{50}=±0.28

。所有的自相关值均落在边界之内,证明序列是白噪声。

2.规则

在介绍模型之前,我们可以先简单了解一些时间序列的规则,一来可以快速上手作为 baseline,二来规则本身也可以作为模型的特征使用。

2.1 简单预测方法

  • 均值法:均值法很简单,即字面意思,利用历史的均值作为未来的预测值;
  • 季节性均值法:利用历史同期均值作为未来的预测值,一般效果会比均值法好很多;
  • 朴素法:即将最后一次观测值作为未来的预测值;
  • 季节性朴素法:利用同期最后一次观测值作为未来同期的预测值;
  • 漂移法:在起始观测值和最后一次观测值之间画一条连接线,延伸到预测时间点,作为预测值。

2.2 变换和调整

  • 「日历调整」:季节性数据中的某些变化可能是来自简单的日历效应。这种情况下,在拟合预测模型之前消除这些变化因素往往会使预测更简单。如每个月的牛奶产量,产量会随着季节性进行变化,但也会随着天数发生变化:

可以看到,日均产量图的季节性模式比月均产量图更简洁明了。日均产量图有效消除了不同月份天数不同造成的影响。简单的模式往往更易于建立模型并得出更精确的预测结果。对于交易天数随着月份改变的销售数据,我们可以做相似的调整。在这种情况下,可以用每个交易日的销量而非每月的总销量来建立模型。

  • 「人口调整」:任何受人口数量影响的数据都可以调整为人均数据,换句话说,考虑每人(或每千人,或每百万人)而非所有人。比如说研究医院的床位数随时间的变化,通过采用人均数据来消除人口数量变化的情况;
  • 「通膨调整」:受货币价值影响的数据在建立模型之前经过最好经过通胀调整;
  • 「数学变换」:数据波动范围会随着数据数值范围的变换而变大或者变小,此时可以进行些数学变换。一个比较经典方法是取对数。对数变换之所以有用,是因为其数值的变化与原始值的变化成正比,且幅度更小;此外也可以用幂变换。Box-Cox 变换既包含对数变换,又包含幂变换的依赖于参数
lambda

的变换族,定义如下:

w_t = begin{cases} log(y_t) & text{if $lambda=0$}; \ (y_t^lambda-1)/lambda & text{otherwise}. end{cases}

Box-cox 变换中的对数变换通常以自然对数 e 为底,因此如果 λ=0,则进行自然对数变换,否则会进行幂变换,然后简单缩放。下图为某一事件序列:

lambda = 0.3

时,整个时间序列范围内的周期性变化大小差不多相同,因此会让预测更加简单:

选择好变换后,我们还需要利用逆变换得到原始测度上的预测值,逆 Box-Cox 变换如下表示:

begin{equation} y_{t} = begin{cases} exp(w_{t}) & text{if $lambda=0$};\ (lambda w_t 1)^{1/lambda} & text{otherwise}. end{cases} end{equation}
  • 「偏差调整」:使用 Box-Cox 变换来调整数据分布,其问题在于逆变换后得到的预测值不是预测分布的平均值,而是预测分布的中位数。很多情况下这可以接受,但有时的的确确需要预测均值。此时,就需要调整一下逆变换,以得到逆变换的均值:
begin{equation} y_t = begin{cases} exp(w_t)left[1 frac{sigma_h^2}{2}right] & mbox{if }; lambda=0 mbox{;}\ (lambda w_t 1)^{1/lambda}left[1 frac{sigma_h^2(1-lambda)}{2(lambda w_t 1)^{2}}right] & mbox{otherwise;} end{cases} end{equation}
sigma_h^2

是 h 步预测方差,预测方差越大,均值和中位数之间的差异越大。

简单逆变换和逆变换的均值之间的差异,我们称之为偏差(Bias)。当我们需要用均值而非中位数时,称预测点是经过“偏差调整”(Bias-adjusted)的。下图展示了两者的区别:

其中,蓝线表示预测值中位数,红色线表示预测值均值,

2.3 周期因子法

这里主要想着重介绍一下周期因子法。

周期因子法很简单,我们先来看一段数据:

可以看到起明显具有周期性。而预测的核心任务便是尽可能准确的提取这种周期性。所以我们:

  • 首先除以周均值得到一个比值;
  • 然后按列去中位数,得到一组鲁棒的周期因子。

做预测时只需要将周期因子乘以一个 base,便可作为下一周的预测。比如我们取最后一周的平均客流量 100 作为 base,那么我们直接乘上周期因子,就得到下一周的预测:

这里只拿了三周来举例。实际应用当然要取更长的时段啦。具体取几周以测试集的效果来确定。

按列提取中位数是一种简单而有效的提取周期因子的方法。中位数十分鲁棒,不受极端值的影响。但中位数损失了很多信息。实践中,可以在此基础上进一步优化。比如可以提取一个均值和一个中位数,然后将均值和中位数融合。融合的比例按照测试集的表现来确定。也可以根据与预测周的时间距离来赋予不同的权重。

除了对周期因子进行优化外,我们还可以针对 Base 进行优化。

直接用最后一周的平均客流量作为base并不一定是最好的方法。也许最后三天或最后五天的均值能更好的反映最新的情况。但是,我们不能直接对最后三天客流量取均值(最后三天是周末,这样取的base就偏大了)。需要去掉周期性因素后,再取平均。具体做法,就是用客流量除以周期因子。

这样我们就可以取最后三天的平均,(108 91.4 120)/3=106.5,作为 base。具体取多少天的,也要通过测试集的表现来确定。当然也可以按某些函数形式来给每天赋予不同的权重。

3.Reference

  1. 用python做时间序列预测四:平稳/非平稳时间序列
  2. 如何深入理解时间序列分析中的平稳性?
  3. 金融时间序列分析入门(一)
  4. 如何理解自相关和偏自相关图
  5. 时间序列规则法快速入门

0 人点赞