时间序列预测概述
2024年春节前一周,某国内头部生鲜电商的备货会议上,采购总监与算法团队爆发了激烈的争论:采购团队基于过去3年的经验,计划在全国仓储备货1200吨生鲜商品,而算法团队基于时序预测模型的输出,建议备货1050吨。双方各执一词的时候,CEO拍板采用了算法团队的方案,最终春节期间该企业的生鲜损耗率仅为4.2%,远低于去年同期的11.7%,缺货率也控制在3%以内,仅此一项就减少了超过2亿元的损失。这个场景是时序预测技术在工业界落地的典型缩影:当数据量积累到一定程度,基于历史数据规律预测未来的时序预测技术,已经成为企业降本增效的核心工具。
<!-- 标签:章节开篇、引入 --> <!-- 纸书页码:1-1 -->
时间序列预测(Time Series Forecasting)是时间序列分析的核心分支,其核心目标是基于历史观测数据,挖掘时间维度上的演化规律,对未来某个时间点或时间段的目标变量数值进行推断。与普通的回归问题不同,时序预测的核心假设是观测值存在时间依赖性:即当前时刻的数值不仅受当前外部因素影响,还受到过去时刻数值的影响,这种时间依赖性通常通过自相关性(Autocorrelation)来度量。从数学定义来看,若时间序列$\{X_t\}_{t=1}^T$表示T个时间步的观测值,时序预测的目标是学习映射函数$f$,使得$f(X_{t-k},...,X_{t-1}; C_{t-k},...,C_{t-1}) \approx X_t$,其中$C_t$表示t时刻的外部协变量,k为历史窗口长度。
<!-- 公式:自相关系数定义 --> $$ \rho_k = \frac{\text{Cov}(X_t, X_{t-k})}{\sqrt{\text{Var}(X_t)\text{Var}(X_{t-k})}} $$
上述公式中$\rho_k$为滞后k阶的自相关系数,衡量$X_t$与$X_{t-k}$之间的线性相关程度,是传统统计时序方法的核心分析指标。除自相关性外,时间序列通常还包含四个核心组成成分: 1. 趋势(Trend):序列在长期内的整体上升或下降趋势,比如某电商平台过去5年的销量逐年增长; 2. 季节性(Seasonality):以固定周期重复的波动规律,比如生鲜商品的周度销量规律(周末销量高于工作日)、年度销量规律(双11、春节等节点销量激增); 3. 周期性(Cycle):非固定周期的波动,比如宏观经济的繁荣-衰退周期,通常周期长度超过1年; 4. 噪声(Noise):无法被规律解释的随机波动,是时序预测误差的主要来源。
<!-- 侧边栏:电子版提示 --> > 💡 电子版交互:点击此处可查看[时序数据组成成分的可视化示例](https://example.com/ts_components),直观理解趋势、季节性、噪声的表现形式。
1.1 时序预测的核心分类体系
时序预测的分类方式多样,不同分类对应完全不同的技术选型与评估逻辑,是工程实践前必须明确的第一个问题。根据预测目标、输出形式、输入变量的不同,主流分类体系如下:
<!-- 标签:分类体系 --> <!-- 纸书页码:1-2 -->
1.1.1 按预测时间跨度划分:单步预测与多步预测
这是最基础的分类方式,直接决定了模型的架构设计与训练逻辑:
- **单步预测(One-step Prediction)**:仅预测下一个时间步的数值,适合实时性要求高、预测周期短的场景,比如实时路况预测、高频交易信号生成、设备实时故障预警。单步预测的优势是实现简单、实时性高、误差累积小,但无法直接输出长期预测结果,若需要预测未来N步,通常需要递归调用模型,会带来误差累积问题。
- **多步预测(Multi-step Prediction)**:预测未来N个时间步的数值,根据实现方式可分为三类:
1. 递归策略(Recursive Strategy):训练单步预测模型,将前一步的预测结果作为下一步的输入,递归生成未来N步的预测结果。该策略实现简单、训练成本低,但误差会随着预测步长增加而累积,通常仅适合N<7的短期多步预测场景。 2. 直接策略(Direct Strategy):为每个未来时间步单独训练一个预测模型,比如预测未来7天的销量,就训练7个模型,每个模型对应一天的预测。该策略无误差累积,每个时间步的预测精度高,但忽略了时间步之间的相关性,且训练成本随预测步长线性增长。 3. 多输出策略(Multi-output Strategy):训练单个模型同时输出未来N步的预测结果,是当前深度学习时代的主流方案,比如Temporal Fusion Transformer(TFT)、PatchTST等模型均支持多输出多步预测,既可以捕捉时间步之间的相关性,又无需训练多个模型。
| 预测类型 | 定义 | 适用场景 | 优势 | 劣势 | | --- | --- | --- | --- | --- | | 单步预测 | 仅预测下一个时间步的数值 | 实时路况预测、高频交易、实时监控 | 实现简单、实时性高、误差累积小 | 无法直接输出长期预测结果,长期预测误差大 | | 递归多步预测 | 用单步模型递归预测未来N步 | 短期多步预测(N<7) | 实现简单、训练成本低 | 误差累积,长期预测精度低 | | 直接多步预测 | 为每个未来时间步单独训练模型 | 中期预测(7<N<30) | 无误差累积,每个时间步精度高 | 忽略了时间步之间的相关性,训练成本高 | | 多输出多步预测 | 单模型同时输出未来N步的结果 | 中长期预测(N>30) | 捕捉时间步之间的相关性,精度高 | 模型复杂度高,训练成本高 |
1.1.2 按输出形式划分:点预测与概率预测
点预测与概率预测的核心差异在于输出的信息量,直接决定了预测结果的可落地性:
- **点预测(Point Forecasting)**:输出单个最优数值,通常通过最小化MAE(平均绝对误差)、MSE(均方误差)等点损失函数训练模型,仅输出预测值的期望,无法反映预测的不确定性。点预测适合对不确定性要求不高的常规决策场景,比如日常销量备货、常规电网调度。
<!-- 公式:MSE损失函数 --> $$ \text{MSE} = \frac{1}{N}\sum_{t=1}^N (y_t - \hat{y}_t)^2 $$ 其中$y_t$为t时刻的真实值,$\hat{y}_t$为t时刻的预测值。
- **概率预测(Probabilistic Forecasting)**:输出预测值的概率分布,包括分位数预测、密度预测等形式,通过最小化分位数损失、负对数似然等概率损失函数训练模型,可以量化预测的不确定性。概率预测适合风险敏感型决策场景,比如金融风控、医疗预后、极端天气预警。例如,某电网公司通过概率预测模型输出未来24小时的光伏功率分布,得知95%概率下发电量不会低于500MW,即可提前安排火电调峰,避免供电缺口。
<!-- 公式:分位数损失函数 --> $$ \text{Quantile Loss}_\alpha = \frac{1}{N}\sum_{t=1}^N \left[ \alpha \max(y_t - \hat{y}_t, 0) + (1-\alpha)\max(\hat{y}_t - y_t, 0) \right] $$ 其中$\alpha$为分位数水平,当$\alpha=0.9$时,模型预测的是90%分位数,即真实值有90%的概率低于预测值。
| 预测类型 | 输出形式 | 适用场景 | 评估指标 | 代表方法 | |
| 预测类型 | 输出形式 | 适用场景 | 评估指标 | 代表方法 | | --- | --- | --- | --- | --- | | 点预测 | 单个最优数值 | 日常备货、常规电网调度、常规监控 | MAE、MSE、MAPE、SMAPE | ARIMA、ETS、XGBoost、LSTM、TFT | | 概率预测 | 预测值的概率分布/分位数 | 金融风控、极端天气预警、医疗预后、风险调度 | CRPS(连续排序概率分数)、分位数损失、对数似然 | DeepAR、TFT分位数头、贝叶斯神经网络、扩散模型 |
点预测与概率预测的差异本质是信息量的差异:点预测仅输出预测值的期望,无法反映预测的不确定性,在风险敏感型场景下极易导致决策偏差。例如某光伏电站在2023年夏季的一次极端天气中,点预测模型输出次日发电量为600MW,实际发电量最低跌至380MW,导致电网出现120MW的供电缺口,缴纳考核罚款超过200万元;而同期采用概率预测的电站提前预判到5%分位数为420MW,提前安排了火电调峰,避免了损失。这种场景下,概率预测提供的分位数信息比单一的点预测值价值高出一个数量级。
1.1.3 按输入变量划分:单变量、多变量与协变量预测
输入变量的选择直接决定了模型可使用的信息量,是预测精度的核心影响因素之一,主流分为三类:
- **单变量预测(Univariate Forecasting)**:仅使用目标变量自身的历史观测值作为输入,不引入任何外部变量。比如预测某只股票的收盘价,仅使用该股票过去30天的收盘价数据。单变量预测的优势是实现简单、数据需求低,适合目标变量与外部变量相关性弱、历史数据充足且规律稳定的场景,比如正弦波、白噪声等合成时序的预测。
- **多变量预测(Multivariate Forecasting)**:使用多个相关的时间序列作为输入,这些输入变量本身也是随时间变化的时序。比如预测股票收盘价时,同时输入成交量、换手率、大盘指数、行业指数等多个时序变量。多变量预测的核心假设是目标变量与其他输入变量存在时间上的滞后相关性,模型可以自动学习这种相关性提升预测精度。
- **带协变量的预测(Covariate Forecasting)**:在多变量预测的基础上,加入**已知的未来信息**作为输入,这类信息通常是确定性的、非时序的,比如节假日、促销活动、天气预报、政策节点等。比如预测下周一的生鲜销量时,已知下周一有满减促销、气温
比如预测下周一的生鲜销量时,已知下周一有满减促销、气温预计达到35℃、周边有大型演唱会活动,这些提前确定的非时序信息就是已知未来协变量(Known Future Covariates),可以在模型输入阶段直接传入,大幅提升预测精度。根据协变量与预测目标的时间相关性,可进一步将协变量分为三类: 1. 静态协变量(Static Covariates):不随时间变化的固定属性,比如零售场景中店铺的层级(一线城市核心商圈/下沉市场社区店)、所在城市的消费等级,工业场景中设备的型号、投产年份,这些属性在预测周期内不会发生变化,通常通过Embedding层编码后输入模型。 2. 已知未来协变量:预测周期内可提前获知的确定性信息,除了节假日、促销活动、天气预报外,还包括企业已确定的营销计划、政策节点、赛事安排等,是提升预测精度最核心的协变量类型,某头部生鲜电商的实践显示,加入已知未来协变量后,销量预测的MAPE(平均绝对百分比误差)可降低12-18个百分点。 3. 动态协变量(Dynamic Covariates):预测周期内无法提前获知、随时间动态变化的变量,比如实时天气、竞争对手的实时价格、交通流量等,这类变量通常需要先通过其他模型预测得到,再输入时序预测模型,或者通过实时数据流接入模型进行在线预测。
从工程实现角度来看,协变量的处理逻辑在不同技术路线中存在明显差异:传统统计方法(如ARIMA)通常需要人工将协变量作为外生变量(Exogenous Variable)传入模型,仅支持线性关系拟合;树模型(如XGBoost)需要将协变量与滑动窗口构造的时序特征拼接,作为表格特征输入;深度学习方法(如TFT)则可以在模型内部自动学习协变量与目标变量的非线性关系,甚至通过注意力机制输出协变量的重要性权重,实现可解释性。以下是一段基于Pandas构造多类型协变量的代码示例,可直接运行理解协变量的构造逻辑:
```python import pandas as pd import numpy as np
生成2020-2024年的日度时序数据
date_range = pd.date_range(start='2020-01-01', end='2024-12-31', freq='D')
模拟销量:基础销量+周度季节性+年度季节性+噪声
base_sales = 1000 weekly_seasonality = 200 * (date_range.weekday < 5) # 工作日销量更高 yearly_seasonality = 300 * np.sin(2 * np.pi * date_range.dayofyear / 365) # 夏季销量更高 noise = np.random.normal(0, 50, len(date_range)) sales = base_sales + weekly_seasonality + yearly_seasonality + noise
df = pd.DataFrame({'date': date_range, 'sales': sales})
1. 构造时间特征(静态/半静态协变量)
df['dayofweek'] = df['date'].dt.dayofweek df['month'] = df['date'].dt.month df['is_weekend'] = (df['dayofweek'] >= 5).astype(int)
店铺层级为静态协变量,所有时间步相同
df['store_level'] = 1 # 1代表一线城市核心商圈店
2. 构造已知未来协变量
节假日列表
holidays = pd.to_datetime([ '2020-01-01', '2020-01-24', '2020-01-25', '2021-02-11', '2021-02-12', '2022-01-31', '2022-02-01', '2023-01-21', '2023-01-22', '2024-02-09', '2024-02-10' ]) df['is_holiday'] = df['date'].isin(holidays).astype(int)
促销活动:618(6月1-20日)、双11(11月1-11日)
df['is_promotion'] = ((df['date'].dt.month == 6) & (df['date'].dt.day <= 20)) | \ ((df['date'].dt.month == 11) & (df['date'].dt.day <= 11)) df['is_promotion'] = df['is_promotion'].astype(int)
3. 构造动态协变量(模拟气温,实际场景中需接入天气预报数据)
df['temperature'] = 25 + 15 * np.sin(2 * np.pi * date_range.dayofyear / 365) + np.random.normal(0, 3, len(date_range))
查看前5行数据
print(df.head()) ```
1.1.4 按预测时间粒度划分:分钟级到年度级
预测粒度(Forecasting Horizon Granularity)指时间序列的最小时间单位,直接决定了数据的采集方式、模型选型与业务价值,是工程实践中容易被忽视但影响极大的分类维度。根据时间跨度从短到长,主流粒度可分为五类:
- **亚秒级/秒级粒度**:时间步长小于1秒,适合高频交易、服务器性能监控、工业传感器实时监测等场景,这类场景对实时性要求极高,通常采用流式处理框架(如Flink)配合轻量级单步预测模型,延迟要求通常在毫秒级。
- **分钟级/小时级粒度**:时间步长为1分钟到1小时,适合电网调度、交通流量预测、共享单车调度、实时路况预测等场景,通常预测未来1-24小时的结果,需要支持多步预测,模型需要捕捉小时级的周期性规律。
- **日度粒度**:时间步长为1天,是最主流的预测粒度,适合零售销量预测、库存备货、网站流量预测、每日发电量预测等场景,通常预测未来7-30天的结果,需要捕捉周度、年度季节性规律。
- **周度/月度粒度**:时间步长为1周或1个月,适合供应链计划、宏观经济预测、企业营收预测、人力资源规划等场景,通常预测未来3-12个月的结果,需要捕捉年度季节性、长期趋势规律。
- **年度/年级粒度**:时间步长为1年或更长,适合人口预测、长期能源规划、宏观经济周期预测等场景,预测周期通常超过3年,核心是捕捉长期趋势和周期性规律。
不同粒度的预测难度存在显著差异:粒度越细,噪声占比越高,规律性越弱,预测难度越大。某连锁零售企业的实践显示,其小时级销量预测的MAPE为42%,日度粒度降至18%,周度粒度进一步降至9%,因此工程实践中需要根据业务需求选择最合适的粒度,避免“粒度越细越好”的误区。此外,粒度转换也是常见的预处理操作:降采样(如将分钟级数据聚合为小时级)需要注意聚合逻辑的合理性(如销量求和、价格平均);升采样(如将日度数据拆分为小时级)不能简单使用前向填充或线性插值,需要结合业务逻辑(如工作日和休息日的时段销量差异可达3倍以上)。
1.1.5 分类体系的实践选型逻辑
前文提到的四类分类维度并非孤立存在,实际工程中需要结合业务需求交叉选型。为降低读者的选型成本,本书总结了如图1-1所示的决策流程,可根据业务需求快速匹配预测方案:
```mermaid graph TD A[明确业务需求] --> B{是否需要预测未来N步?} B -->|仅需下一时间步| C[单步预测] B -->|需预测未来N步| D[多步预测] D --> E{N<7?} E -->|是| F[递归多步预测] E -->|7≤N≤30| G[直接多步预测] E -->|N>30| H[多输出多步预测] A --> I{是否需要量化风险?} I -->|是| J[概率预测] I -->|否| K[点预测] A --> L{是否存在外部影响因素?} L -->|是| M[带协变量的多变量预测] L -->|否| N[单变量预测] A --> O{预测粒度?} O -->|分钟/小时级| P[轻量级单步/短多步模型] O -->|日度级| Q[中等复杂度多步模型] O -->|周/月/年级| R[长序列预测模型] ```
以本章开篇的生鲜电商备货场景为例,业务需求是预测未来7天