2. 时间序列基础

在进入交叉验证实战之前,必须先建立对时间序列数据本身的正确认知。很多模型在离线评估中表现优异,上线后却迅速失效,根源往往不是算法选错,而是对数据的组成结构、平稳性和相关性理解不足。本节将围绕时间序列的四个核心概念展开:数据组成、平稳性、自相关与白噪声,以及趋势与季节性的识别与处理。

一、时间序列的组成结构

一条时间序列通常可以分解为若干可解释的成分。经典分解模型将观测值表示为趋势、季节性和残差的组合,常见形式有加法模型与乘法模型:

  • 趋势项(Trend):序列在较长时期内的持续上升、下降或平稳方向,反映长期变化。
  • 季节项(Seasonality):固定周期内重复出现的波动,如日周期、周周期、年周期。
  • 循环项(Cycle):非固定周期的中长期波动,常与经济周期相关,长度不固定。
  • 残差项(Residual):去除上述成分后剩余的随机波动,理想情况下应接近白噪声。

加法模型写作 Y = T + S + R,适用于季节波动幅度不随趋势变化的情况;乘法模型写作 Y = T × S × R,适用于波动幅度随水平增大而放大的情况。选择哪种模型,直接影响后续平稳化与建模策略。

核心判断:先画图,再分解。图形能直观暴露趋势方向、季节周期长度、异常点和方差变化,是任何时间序列分析的第一步。

二、平稳性:时间序列建模的基石

平稳性是指序列的统计特性不随时间平移而改变。严格平稳要求整个联合分布不变;实践中更常用弱平稳,即均值恒定、方差恒定、自协方差只与时间间隔有关。大多数经典模型(如 ARIMA)都假设或要求序列弱平稳。

判断平稳性的常用方法包括:

  1. 时序图观察:均值是否漂移、方差是否随时间扩大。
  2. 滚动统计量:计算滚动均值与滚动标准差,观察是否稳定。
  3. ADF 检验:原假设为存在单位根(非平稳),p 值小于显著性水平则拒绝原假设。
  4. 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 无显著尖峰,说明模型已充分提取信息。反之,若残差仍存在自相关,说明模型遗漏了结构。

实战提示:ACF 与 PACF 的截尾/拖尾判断在有限样本下并不总是清晰,建议结合信息准则(AIC/BIC)和交叉验证共同确定阶数,不要仅凭图形下结论。

四、趋势与季节性的识别与处理

趋势和季节性是时间序列中最常见的两类结构,也是交叉验证设计时必须特别处理的因素。若忽略季节性,随机划分训练集与验证集会导致验证集包含训练期未来信息,评估结果虚高。

  • 趋势识别:时序图长期方向、滚动均值持续上升或下降、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;确认残差接近白噪声后,再进入时间序列交叉验证设计。这一流程确保训练集始终位于验证集之前,模拟真实预测场景。

时间序列组成分解与平稳化路径 原始序列 Y 趋势 + 季节 + 残差 趋势项 T 长期方向 季节项 S 固定周期波动 残差项 R 随机波动 平稳性检验 ADF / KPSS / 滚动统计 均值、方差是否恒定 平稳化处理 差分 / 对数 / Box-Cox 去趋势 / 季节差分 白噪声检验 ACF / PACF / Ljung-Box 残差是否无结构 平稳残差 → 进入时间序列交叉验证 训练集始终位于验证集之前,模拟真实预测

六、复盘与常见误区

本节内容看似基础,却直接决定后续交叉验证方案是否成立。以下误区在实战中反复出现:

  1. 不做平稳性检验直接建模:导致模型系数不稳定,预测区间失真。
  2. 差分阶数凭感觉:差分不足残留趋势,差分过度引入人为负相关。
  3. 忽略季节性周期长度:周期设错,季节差分无效,验证集泄漏。
  4. 把白噪声残差当作模型失败:残差接近白噪声恰恰说明模型已提取有效结构。
  5. 用随机划分评估时间序列模型:这是最严重的泄漏来源,下一章将专门讨论。
本节小结:时间序列建模的第一步不是选模型,而是理解数据。分解组成、检验平稳、识别自相关、确认白噪声、处理趋势与季节性,这五步构成后续所有交叉验证与建模工作的前提。只有残差接近白噪声,交叉验证的结果才具备可信度。