2. 时间序列预测基础回顾

在构建集成模型之前,必须牢固掌握时间序列的核心诊断工具。本章将系统回顾平稳性、自相关函数(ACF)、偏自相关函数(PACF)以及经典分解方法,这些是判断数据特性、选择基模型和设计多样性策略的理论基石。

2.1 平稳性:建模的前提条件

平稳性是大多数统计预测模型(如 ARIMA)的基本假设。一个严格平稳的时间序列,其统计性质(均值、方差、自协方差)不随时间平移而变化。

类型 定义 对预测的影响
严平稳 联合分布对时间平移不变 理论要求高,实际难以验证
弱平稳(宽平稳) 均值恒定、方差有限、自协方差仅与滞后阶数有关 ARIMA 等模型的基本假设
非平稳 均值/方差随时间变化,或存在趋势/季节性 需差分或变换后才能建模
实战要点:在集成学习中,混合平稳基模型(如 ARIMA)与非平稳友好模型(如 XGBoost、LSTM)可以天然增加预测多样性。但必须确保所有输入特征在时间维度上对齐。

2.2 自相关与偏自相关:识别依赖结构

自相关函数(ACF)衡量序列与其自身滞后版本之间的线性相关性。偏自相关函数(PACF)则是在剔除中间滞后项影响后,衡量两个滞后项之间的净相关关系。两者共同决定了 ARIMA 模型的阶数(p, q)。

核心判别规则:
  • AR(p) 过程:PACF 在滞后 p 后截尾,ACF 拖尾(指数衰减或正弦振荡)。
  • MA(q) 过程:ACF 在滞后 q 后截尾,PACF 拖尾。
  • ARMA(p,q) 过程:ACF 和 PACF 均拖尾。
ACF 与 PACF 模式识别图 AR(1) 过程 ACF 指数衰减 (拖尾) PACF 滞后1后 突然截尾 MA(1) 过程 ACF 滞后1后 突然截尾 PACF 指数衰减 (拖尾) 非平稳序列 ACF 缓慢线性 衰减 PACF 滞后1接近1 后续小 说明:ACF 和 PACF 的截尾/拖尾模式是确定 ARIMA(p,d,q) 阶数的核心依据。 实际应用中需结合 AIC/BIC 准则进行模型选择。

2.3 趋势与季节性分解:STL 与经典分解

将时间序列分解为趋势(Trend)、季节性(Seasonal)和残差(Residual)三个分量,是理解数据内在结构和增强模型多样性的关键预处理步骤。常用的方法包括经典加法/乘法分解和 STL(Seasonal-Trend decomposition using LOESS)。

2.3.1 加法模型 vs 乘法模型

模型 公式 适用场景 示例
加法 Y = T + S + R 季节性波动幅度不随趋势变化 月平均气温
乘法 Y = T × S × R 季节性波动幅度与趋势水平成正比 电商月销售额

2.3.2 STL 分解的优势

  • 鲁棒性:使用 LOESS 平滑,对异常值不敏感。
  • 灵活性:可以处理任意季节性周期(如周、月、年),且允许季节性随时间缓慢变化。
  • 可加性:即使原始序列是乘法关系,也可通过对数变换后使用 STL。
时间序列 STL 分解流程 原始时间序列 Y STL 迭代分解(内循环 + 外循环) 趋势分量 T 长期方向 季节分量 S 周期模式 残差分量 R 随机噪声 Y = T + S + R(加法) 内循环:趋势-季节平滑 外循环:鲁棒性权重更新

2.4 实战中的分解应用

在集成预测中,分解后的分量可以分别建模,也可以作为特征输入到复杂模型中。以下是一个使用 Python statsmodels 进行 STL 分解的示例:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import STL

# 生成示例数据:趋势 + 季节 + 噪声
np.random.seed(42)
t = np.arange(0, 365)
trend = 0.05 * t + 10
seasonal = 5 * np.sin(2 * np.pi * t / 30)
noise = np.random.normal(0, 1, len(t))
y = trend + seasonal + noise

# STL 分解
stl = STL(y, period=30, robust=True)
result = stl.fit()

# 提取分量
trend_comp = result.trend
seasonal_comp = result.seasonal
residual_comp = result.resid

print(f"趋势分量范围: {trend_comp.min():.2f} ~ {trend_comp.max():.2f}")
print(f"季节分量范围: {seasonal_comp.min():.2f} ~ {seasonal_comp.max():.2f}")
print(f"残差标准差: {residual_comp.std():.2f}")
常见陷阱:
  • 分解前务必确认周期长度(如日数据周期为7,月数据周期为12)。
  • STL 的 robust=True 参数在数据存在异常点时至关重要,可防止趋势被拉偏。
  • 残差分量若呈现明显模式(如自相关),说明分解不充分或周期选择错误。

2.5 平稳性检验:ADF 与 KPSS

在建模前,必须通过统计检验确认序列是否平稳。最常用的两种检验互为补充:

检验方法 原假设 H₀ 备择假设 H₁ 使用建议
ADF 检验 序列存在单位根(非平稳) 序列平稳 p < 0.05 拒绝 H₀,认为平稳
KPSS 检验 序列平稳 序列存在单位根(非平稳) p < 0.05 拒绝 H₀,认为非平稳
最佳实践:同时使用 ADF 和 KPSS 进行“双重检验”。若 ADF 拒绝 H₀ 且 KPSS 不拒绝 H₀,则序列平稳;若两者均拒绝 H₀,则可能是趋势平稳(需去趋势);若两者均不拒绝,则序列非平稳(需差分)。