logo

时间序列概率预测

wangzf / 2025-07-17


目录

概率预测简介

一般做时间序列预测都是做点预测(point forecasting),很少会去考虑区间预测(interval forecasting), 或者概率预测(probabilistic forecasting),但实际上区间预测也是很重要的,具体来说有这三方面的作用:

目前关于时间序列区间预测的方法似乎还没有一个系统性的总结,这里把调研看到的几种方法整理出来, 区间预测具体可以分为两类方法:

  1. 统计学方法,使用统计学上的一些方法来估计区间
  2. 损失函数法,通过定义特定的损失函数来输出区间

统计学方法

区间估计法

学过统计学的都会知道区间估计,要估计一个值的区间,首先会假设它服从正态分布, 进一步再计算出这个值的估计标准差,然后给定某个置信度,比如 95%,查表就可以得到Z值为 1.96, 那么就可以把 Z 值乘上标准差,再用均值加减一下,就可以得到区间的左端和右端。

区间预测也用到的同样的思路,但是在区间预测里,我们并不会假设预测值服从正态分布, 而是假设误差服从正态分布,然后估计出误差的上下限,再把他加到预测值里面, 就可以得到预测值的上下限了,具体来说,步骤如下:

  1. 假设预测误差服从均值为0的正态分布,估计预测误差的标准差
  2. 给定置信度,查表得到Z值
  3. 计算预测误差的上限和下限
  4. 将上下限加到预测值里面,得到一个预测区间

y^T+h|T±kσ^h

但是,怎么得到预测误差的标准差呢?很多传统统计学的预测方法都是直接用训练误差的标准差, 也有很多成熟的估计方法,但是由于训练数据上是过拟合的,会导致这个标准差比较小, 就导致最后出来的预测区间也比较小,所以,比较合理的做法是在训练数据集上先划分出一个验证集, 然后使用验证集上的预测误差来估计标准差。

Bootstrap

Bootstrap,也就是自助采样法,这个方法的思路也是先估计出一个误差的上下限, 然后把这个上下限加到原来的预测值中,进而得到预测区间。 不过,Bootstrap 不需要假定误差服从正态分布,而是通过采样 N 次的预测误差, 然后取这 N 次的误差的分位数作为上下限,比如抽样了三次误差,分别为 [50,0,50], 则 5 分位数为 4595 分位数为 45, 把这个分位数误差加到预测值上就得到了预测区间。

损失函数法

最近几年,基于深度的时序预测方法也很多,所以也衍生出了一些区间预测的方法, 但具体来说都是从损失函数层面来实现的。

分位数损失

分位数的损失函数形式如下所示:

Lq(y,y^)=q(yy^)++(1q)(y^y)+

其中 ()+=max(0,),加号左边那项代表的就是预测值小于真实值的 loss, 右边那项代表的是预测值大于真实值时的 loss,我们通过取不同的 q 来理解下这个函数:

在实操时,我们一般会指定三个分位数,如 (0.1,0.5,0.9),把这三个分位数损失加起来作为最终的损失函数, 在预测时就可以输出三个值,分别对应:10 的区间预测,点预测以及 90 的区间预测, 目前很多基于深度学习的时序预测算法都用到了这个损失函数,比如 MQRNN/CNN, TFT 等,GBDT 也可以使用这个损失, 像 LightGBM 和 XGBoost 的 objective 里面也都有 quantile 这个选项,也都可以输出区间预测。

负对数似然损失

这个思路最早是在 DeepAR 那看到的,大概思路是:

  1. 首先指定一个预测值服从的概率分布,如正态分布
  2. 然后,使用神经网络模型分别预测这个概率分布的参数,比如正态分布就是预测他的均值和方差
  3. 接着构造负对数似然函数作为损失函数,优化这个损失函数就可以到得到概率分布的参数,
  4. 最后就可以得到预测时每一步的概率分布,知道了概率分布, 那么就可以通过蒙特卡洛采样的方式来生成预测值和区间预测了, 比如对这个概率分布采样 100 次,那这 100 次的均值就是点预测的结果, 95% 分位数和 5% 分位数就可以对应区间预测的结果。

开源实现

资料