2. 时间序列基础
在进入交叉验证实战之前,必须先建立对时间序列数据本身的正确认知。很多模型在离线评估中表现优异,上线后却迅速失效,根源往往不是算法选错,而是对数据的组成结构、平稳性和相关性理解不足。本节将围绕时间序列的四个核心概念展开:数据组成、平稳性、自相关与白噪声,以及趋势与季节性的识别与处理。
一、时间序列的组成结构
一条时间序列通常可以分解为若干可解释的成分。经典分解模型将观测值表示为趋势、季节性和残差的组合,常见形式有加法模型与乘法模型:
- 趋势项(Trend):序列在较长时期内的持续上升、下降或平稳方向,反映长期变化。
- 季节项(Seasonality):固定周期内重复出现的波动,如日周期、周周期、年周期。
- 循环项(Cycle):非固定周期的中长期波动,常与经济周期相关,长度不固定。
- 残差项(Residual):去除上述成分后剩余的随机波动,理想情况下应接近白噪声。
加法模型写作 Y = T + S + R,适用于季节波动幅度不随趋势变化的情况;乘法模型写作 Y = T × S × R,适用于波动幅度随水平增大而放大的情况。选择哪种模型,直接影响后续平稳化与建模策略。
二、平稳性:时间序列建模的基石
平稳性是指序列的统计特性不随时间平移而改变。严格平稳要求整个联合分布不变;实践中更常用弱平稳,即均值恒定、方差恒定、自协方差只与时间间隔有关。大多数经典模型(如 ARIMA)都假设或要求序列弱平稳。
判断平稳性的常用方法包括:
- 时序图观察:均值是否漂移、方差是否随时间扩大。
- 滚动统计量:计算滚动均值与滚动标准差,观察是否稳定。
- ADF 检验:原假设为存在单位根(非平稳),p 值小于显著性水平则拒绝原假设。
- KPSS 检验:原假设为平稳,常与 ADF 配合使用,交叉验证结论。
from statsmodels.tsa.stattools import adfuller
result = adfuller(series, autolag='AIC')
print('ADF Statistic:', result[0])
print('p-value:', result[1])
print('Critical Values:', result[4])
# p-value < 0.05 通常认为序列平稳
若序列非平稳,可通过差分、对数变换、Box-Cox 变换或去趋势处理使其平稳。差分的阶数可通过观察差分后序列的 ACF 与 PACF 图辅助确定。
三、自相关、偏自相关与白噪声
自相关函数(ACF)衡量序列与其滞后版本之间的相关性,是识别时间依赖结构的核心工具。偏自相关函数(PACF)则剔除了中间滞后的影响,反映某一滞后阶数的净相关。两者结合可用于初步判断 AR、MA 或 ARMA 模型的阶数。
| 图形特征 | ACF 表现 | PACF 表现 | 可能模型 |
|---|---|---|---|
| AR(p) | 拖尾衰减 | p 阶后截尾 | 自回归模型 |
| MA(q) | q 阶后截尾 | 拖尾衰减 | 移动平均模型 |
| ARMA(p,q) | 拖尾 | 拖尾 | 混合模型 |
| 白噪声 | 几乎全部落在置信带内 | 几乎全部落在置信带内 | 无结构可提取 |
白噪声是时间序列中的“理想残差”:均值为零、方差恒定、各滞后自相关均为零。若模型残差通过 Ljung-Box 检验且 ACF 无显著尖峰,说明模型已充分提取信息。反之,若残差仍存在自相关,说明模型遗漏了结构。
四、趋势与季节性的识别与处理
趋势和季节性是时间序列中最常见的两类结构,也是交叉验证设计时必须特别处理的因素。若忽略季节性,随机划分训练集与验证集会导致验证集包含训练期未来信息,评估结果虚高。
- 趋势识别:时序图长期方向、滚动均值持续上升或下降、ADF 检验不通过。
- 季节性识别:固定周期重复波动、ACF 在周期倍数处出现显著尖峰、季节分解图。
- 趋势处理:一阶差分、去趋势回归、对数变换后差分。
- 季节性处理:季节差分、季节分解后建模残差、引入傅里叶项或周期特征。
from statsmodels.tsa.seasonal import seasonal_decompose
decomp = seasonal_decompose(series, model='additive', period=12)
decomp.trend.plot()
decomp.seasonal.plot()
decomp.resid.plot()
五、案例场景:电商日销量序列
假设我们拿到某电商平台两年的日销量数据。时序图显示:整体销量缓慢上升(趋势),每周周末出现高峰(周季节性),每年双十一出现尖峰(年季节性),同时存在少量促销导致的异常点。若直接使用随机 K 折交叉验证,验证集中可能包含未来促销信息,导致模型评估过于乐观。
正确的处理流程是:先做季节分解,确认周期长度为 7 和 365;对趋势做一阶差分,对周季节性做 7 步季节差分;检查差分后序列的 ADF 与 ACF;确认残差接近白噪声后,再进入时间序列交叉验证设计。这一流程确保训练集始终位于验证集之前,模拟真实预测场景。
六、复盘与常见误区
本节内容看似基础,却直接决定后续交叉验证方案是否成立。以下误区在实战中反复出现:
- 不做平稳性检验直接建模:导致模型系数不稳定,预测区间失真。
- 差分阶数凭感觉:差分不足残留趋势,差分过度引入人为负相关。
- 忽略季节性周期长度:周期设错,季节差分无效,验证集泄漏。
- 把白噪声残差当作模型失败:残差接近白噪声恰恰说明模型已提取有效结构。
- 用随机划分评估时间序列模型:这是最严重的泄漏来源,下一章将专门讨论。