Skip to content

时间序列分析

本页介绍时间序列分析(Time Series Analysis)——从按时间排列的历史数据中找规律,预测未来。它是金融、零售、能源、气象等行业的核心技术。从 ARIMA 等经典统计方法到 LSTM、Transformer 等深度学习方法,再到 2024-2025 年的时序基础模型(Time Series Foundation Models),时间序列分析正经历从”每个任务单独训练”到”预训练大模型零样本预测”的范式转变。前置阅读:监督学习、特征工程。

时间序列分析的本质:历史会重演——找到规律,就能预测未来。但”规律”有不同的层次:

  • 趋势 Trend = 大方向:数据整体往上走(如 GDP 增长)、往下走(如人口下降)、还是持平?趋势是最容易识别的长期规律。
  • 季节性 Seasonality = 周期性重复:冰淇淋销量夏天高冬天低,地铁客流工作日多周末少——这些固定周期的波动就是季节性。
  • 残差 Residual = 剩下的随机噪音:去掉趋势和季节性后,剩下的就是不可预测的随机波动——模型的目标是尽量解释前两者,残差越小模型越好。

三类方法的直觉:

  • 经典统计方法(ARIMA)= 让过去的值预测未来:自回归(AR)用历史值的线性组合预测;差分(I)把非平稳序列变平稳;移动平均(MA)用历史预测误差修正。ARIMA = AR + I + MA 三者结合。
  • 机器学习方法 = 特征工程 + 树模型:把时间序列问题转化为表格问题——用滞后值(过去 N 步的值)、滑动窗口统计量(均值/方差/最大值)、时间特征(小时/星期/月份)作为特征,用 XGBoost 等模型预测。详见特征工程和梯度提升树详解。
  • 深度学习方法 = 自动学时序模式:LSTM 通过记忆单元捕捉长短期依赖;Transformer 用注意力机制建模全局关系;TCN(时序卷积网络)用因果卷积保证只用过去信息。深度学习无需手动构造特征,但需要更多数据。

就像 LLM 改变了 NLP 一样,时序基础模型(Time Series Foundation Models)正在改变时间序列领域:

  • TimesFM(Google,2024):一个 200M 参数的 Decoder-Only Transformer,在 1000 亿个真实世界时间序列数据点上预训练。给定一段历史序列,可以直接在从未见过的新数据集上做零样本(Zero-shot)预测——无需任何训练。
  • Chronos(Amazon,2024):把时间序列”分词”为离散 token,然后用标准的语言模型(如 T5)做自回归预测。巧妙地将 LLM 的成熟技术迁移到时序领域。
  • Moirai(Salesforce,2024):大规模时间序列基础模型,支持多变量输入和概率预测(输出预测区间而非点估计)。
  • TimeGPT(Nixtla,2023):商业化时序基础模型 API,声称在多个基准上零样本预测超越传统方法。

范式转变:传统流程是”收集数据 → 手动调参 ARIMA 或训练 LSTM → 预测”;新范式是”拿预训练模型 → 直接零样本预测 → 如有需要则少量微调”。这大幅降低了时间序列预测的工程门槛。

任何时间序列可以被分解为三个组成部分:

yt=Tt+St+Rty_t = T_t + S_t + R_t

其中 TtT_t 是趋势项(Trend),StS_t 是季节项(Seasonality),RtR_t 是残差项(Residual)。这是加法模型;当季节波动幅度随趋势增大而增大时,更适合用乘法模型 yt=Tt×St×Rty_t = T_t \times S_t \times R_t(取对数后变为加法模型)。

两种经典分解方法:

  • 经典分解(Classical Decomposition):用移动平均提取趋势,用月/季度均值提取季节性。简单但对异常值敏感。
  • STL 分解(Seasonal and Trend decomposition using Loess):用局部回归(LOESS)平滑提取趋势和季节性,更灵活、更鲁棒,是当前最常用的分解方法。

平稳性(Stationarity)是时间序列的基石概念:一个平稳序列的统计特性(均值、方差、自相关)不随时间变化。ARIMA 等方法要求输入序列平稳(或经过差分后平稳)。

ADF 检验(Augmented Dickey-Fuller Test)是检验平稳性的标准方法:

  • 原假设 H0H_0:序列有单位根(Unit Root,即非平稳)
  • 备择假设 H1H_1:序列平稳
  • 如果 p 值 < 0.05,拒绝 H0H_0,认为序列平稳

单位根的直觉:随机游走 yt=yt−1+ϵty_t = y_{t-1} + \epsilon_t 是非平稳的——它的方差随时间无限增大。差分一次后 Δyt=yt−yt−1=ϵt\Delta y_t = y_t - y_{t-1} = \epsilon_t 变成了白噪声(平稳)。这就是 ARIMA 中差分阶数 dd 的含义:差分几次能让序列平稳。

ARIMA(p, d, q) 是经典时间序列模型的集大成者,三个参数分别对应三种机制:

当前值是过去 pp 个值的线性组合加上噪声:

yt=ϕ1yt−1+ϕ2yt−2+⋯+ϕpyt−p+ϵty_t = \phi_1 y_{t-1} + \phi_2 y_{t-2} + \cdots + \phi_p y_{t-p} + \epsilon_t

其中 ϕi\phi_i 是自回归系数,ϵt\epsilon_t 是白噪声(White Noise,均值为零、方差恒定的随机序列)。

直觉:今天的气温和昨天有关——如果昨天气温突然升高,今天大概率也会偏高。AR 模型就是在量化这种”惯性”。

对非平稳序列做 dd 次差分使其平稳。一阶差分 Δyt=yt−yt−1\Delta y_t = y_t - y_{t-1} 可以消除线性趋势。ARIMA 中的 I 代表”Integrated”——最终预测需要”反差分”还原到原始尺度。

当前值是过去 qq 个预测误差的线性组合加上当前噪声:

yt=ϵt+θ1ϵt−1+θ2ϵt−2+⋯+θqϵt−qy_t = \epsilon_t + \theta_1 \epsilon_{t-1} + \theta_2 \epsilon_{t-2} + \cdots + \theta_q \epsilon_{t-q}

直觉:如果你的预测昨天偏低了 10 度(误差 +10),今天应该把预测往上调一些——MA 就是在用过去的”失误”来修正今天的预测。

当数据有季节性时,ARIMA 扩展为 SARIMA(p,d,q)(P,D,Q,s),其中大写字母是季节性对应的参数,ss 是季节周期(如月度数据 s=12s=12)。

指数平滑(Exponential Smoothing)是 ARIMA 的有力替代,核心思想是给近期的数据更大的权重:

  • 简单指数平滑(SES):y^t+1=α yt+(1−α)y^t\hat{y}_{t+1} = \alpha \, y_t + (1-\alpha) \hat{y}_t,其中 α∈(0,1)\alpha \in (0,1)。权重呈指数衰减——最近的数据权重最大。
  • Holt 线性趋势法:在 SES 基础上增加趋势项,适合有线性趋势但无季节性的数据。
  • Holt-Winters 三参数法:再加季节项,适合既有趋势又有季节性的数据。三种变体:加法季节、乘法季节、阻尼趋势。

LSTM(Long Short-Term Memory)通过门控机制(遗忘门、输入门、输出门)解决 RNN 的梯度消失问题,适合捕捉长短期依赖:

  • 输入:过去 LL 步的序列 (xt−L,…,xt−1)(x_{t-L}, \ldots, x_{t-1})(滑动窗口)
  • 输出:未来 HH 步的预测 (y^t,…,y^t+H−1)(\hat{y}_t, \ldots, \hat{y}_{t+H-1})
  • 优势:自动学习时间依赖,不需要手动指定 AR 阶数;能处理多变量输入
  • 劣势:需要大量数据训练,容易过拟合,训练慢

2020 年以来,研究者开始用 Transformer 架构处理时间序列,核心优势是注意力机制可以直接建模任意远距离的依赖关系:

  • Informer(Zhou et al., AAAI 2021):用 ProbSparse 自注意力处理长序列,解决了标准注意力 O(n2)O(n^2) 的问题。
  • PatchTST(Nie et al., ICLR 2023):借鉴 ViT 的 patch 思想——把时间序列切分为多个 patch,每个 patch 做一个 token,大幅提升效率和效果。
  • TimesNet(Wu et al., ICLR 2023):发现 1D 时间序列可以通过 FFT 转为 2D 张量——同时捕捉”周期内”和”周期间”两种变化模式。
  • iTransformer(Liu et al., ICLR 2024):反转维度——在变量维度上做注意力而非时间维度,简单有效。

Transformer 在时序上的争议:2023 年 Zeng et al. 的论文 “Are Transformers Effective for Time Series Forecasting?” 用一个简单的线性模型 DLinear 打败了多个 Transformer 变体,引发激烈讨论。核心问题是:很多 Transformer 时序模型在长序列预测中并未真正利用长距离依赖,而是主要靠近期的简单趋势。但 PatchTST 和 iTransformer 等后续工作证明了 Transformer 的潜力。

任何时间序列可以分解为趋势 + 季节性 + 残差:

import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import STL
from statsmodels.tsa.stattools import adfuller
# 生成带趋势和季节性的模拟数据(120 个月)
np.random.seed(42)
t = np.arange(120)
data = 10 + 0.5 * t + 5 * np.sin(2 * np.pi * t / 12) + np.random.randn(120) * 2
# STL 分解(比经典分解更灵活、更鲁棒)
stl = STL(data, period=12, robust=True)
result = stl.fit()
fig, axes = plt.subplots(4, 1, figsize=(12, 10), sharex=True)
axes[0].plot(data); axes[0].set_title('原始数据')
axes[1].plot(result.trend); axes[1].set_title('趋势 Trend')
axes[2].plot(result.seasonal); axes[2].set_title('季节性 Seasonal')
axes[3].plot(result.resid); axes[3].set_title('残差 Residual')
plt.tight_layout(); plt.savefig('stl_decomposition.png', dpi=150)
# ADF 检验:检查残差是否平稳(应该平稳)
adf_stat, p_value = adfuller(result.resid)[:2]
print(f"ADF 统计量: {adf_stat:.3f}, p-value: {p_value:.4f}")
print(f"残差{'平稳' if p_value < 0.05 else '非平稳'}")

STL 分解结果:原始数据、趋势、季节性、残差

from statsmodels.tsa.arima.model import ARIMA
# ARIMA(p, d, q): p=自回归阶数, d=差分阶数, q=移动平均阶数
model = ARIMA(data, order=(2, 1, 1))
fitted = model.fit()
print(fitted.summary()) # 查看模型参数和 AIC
# 预测未来 12 个月
forecast = fitted.forecast(steps=12)
print(f"未来 12 个月预测值: {forecast.round(1)}")
# 模型诊断:残差应该是白噪声(无自相关)
residuals = fitted.resid
# pip install pmdarima
from pmdarima import auto_arima
import numpy as np
np.random.seed(42)
t = np.arange(120)
data = 10 + 0.5 * t + 5 * np.sin(2 * np.pi * t / 12) + np.random.randn(120) * 2
# 自动搜索最优 (p,d,q),按 AIC 排序
model = auto_arima(data, seasonal=True, m=12, # m=季节周期
d=None, D=None, # 自动确定差分阶数
trace=True, # 打印搜索过程
error_action='ignore', suppress_warnings=True)
print(f"最优 SARIMA 阶数: {model.order} x {model.seasonal_order}")
# pip install prophet
import pandas as pd
from prophet import Prophet
# Prophet 要求数据框有两列: ds(日期) 和 y(值)
np.random.seed(42)
dates = pd.date_range('2020-01-01', periods=120, freq='M')
y = 10 + 0.5 * np.arange(120) + 5 * np.sin(2 * np.pi * np.arange(120) / 12) + np.random.randn(120) * 2
df = pd.DataFrame({'ds': dates, 'y': y})
# Prophet 自动处理趋势、季节性、节假日
m = Prophet(yearly_seasonality=True, changepoint_prior_scale=0.05)
m.fit(df)
# 预测未来 12 个月
future = m.make_future_dataframe(periods=12, freq='M')
forecast = m.predict(future)
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(12).round(1))
# yhat: 点预测, yhat_lower/upper: 80% 预测区间

XGBoost 时序预测(特征工程方法)

Section titled “XGBoost 时序预测(特征工程方法)”
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
import xgboost as xgb
from sklearn.metrics import mean_squared_error
# 生成数据
np.random.seed(42)
t = np.arange(365)
y = 20 + 0.1 * t + 10 * np.sin(2 * np.pi * t / 365) + np.random.randn(365) * 3
# 构造表格特征:把时序问题转化为表格问题
def make_features(y, lags=[1, 2, 3, 7, 14, 28], window=7):
df = pd.DataFrame({'y': y})
for lag in lags:
df[f'lag_{lag}'] = df['y'].shift(lag) # 滞后特征
df['rolling_mean'] = df['y'].shift(1).rolling(window).mean() # 滑动均值
df['rolling_std'] = df['y'].shift(1).rolling(window).std() # 滑动标准差
return df.dropna()
feat = make_features(y)
X = feat.drop('y', axis=1).values
y_train = feat['y'].values
X_tr, X_te, y_tr, y_te = train_test_split(X, y_train, test_size=0.2, shuffle=False)
model = xgb.XGBRegressor(n_estimators=200, learning_rate=0.05, max_depth=5)
model.fit(X_tr, y_tr)
pred = model.predict(X_te)
rmse = np.sqrt(mean_squared_error(y_te, pred))
print(f"XGBoost RMSE: {rmse:.3f}")

时序基础模型零样本预测(概念示例)

Section titled “时序基础模型零样本预测(概念示例)”
"""
使用 Google TimesFM 进行零样本时间序列预测的概念示例。
TimesFM 是在 1000 亿个时间序列点上预训练的 Decoder-Only Transformer。
"""
# pip install timesfm (需要 Python 3.10+, 较新版本 PyTorch)
# import timesfm
# 初始化预训练模型
# tfm = timesfm.TimesFm(
# hparams=timesfm.TimesFmHparams(
# backend="gpu",
# per_core_batch_size=32,
# horizon_len=128, # 预测未来 128 步
# ),
# checkpoint=timesfm.TimesFmCheckpoint(
# huggingface_repo_id="google/timesfm-1.0-200m-pytorch"
# ),
# )
# 零样本预测:无需任何训练,直接输入历史序列
# context = [your_time_series_data] # 一段历史数据
# forecast = tfm.forecast(context)
# forecast_point = forecast[0].mean # 点预测
# forecast_interval = forecast[0].quantiles # 预测区间
# 对比:传统 ARIMA 需要为每个序列单独拟合,
# 而 TimesFM 可以对任意新序列直接零样本预测——
# 这是时序领域从"每个任务从头训练"到"预训练+零样本"的范式转变
  • 先检查平稳性:ARIMA 要求时间序列平稳(均值和方差不随时间变化)。用 ADF 检验判断是否平稳,不平稳就做差分(d 参数)使其平稳。
  • ARIMA 参数选择:p(AR 阶数)和 q(MA 阶数)可以通过 ACF/PACF 图辅助选择(截尾处即为阶数),也可以用 auto_arima(pmdarima 库)自动搜索最优参数。
  • 不要忘了基线模型:在尝试复杂模型前,先跑一个朴素基线(Naive Baseline)——“明天的值等于今天的值”或”下个月的值等于去年同月的值”。如果你的复杂模型还不如基线,说明方向错了。这是时间序列实践中最常见的错误。
  • 深度学习不一定更好:在很多时间序列任务上,精心调参的 ARIMA 或 XGBoost 可以打败 LSTM。2023 年的研究(Zeng et al.)甚至表明简单线性模型在某些基准上超越了 Transformer 变体。深度学习的优势在多变量、非线性复杂关系和大规模数据场景。
  • 注意数据泄露:时间序列的特征工程中,不能用未来信息预测过去——所有滞后特征必须严格使用 t−kt-k(k>0k>0)的数据。交叉验证要用 TimeSeriesSplit,不能用普通随机划分。
  • 评估指标:时间序列常用 MAE(平均绝对误差)、MAPE(平均绝对百分比误差,便于理解但 y=0 时不可用)、RMSE(均方根误差,对大误差敏感)和 MASE(平均绝对缩放误差,相对于朴素基线的改进比例,MASE < 1 表示比基线好)。
  • 概率预测优于点预测:输出预测区间(如 80%/95% 置信区间)比单一点预测更有业务价值——你可以知道”最坏情况是什么”。Prophet 和 Chronos 都支持概率预测。
  • 多变量 vs 单变量:如果外部变量(天气、促销)对目标有显著影响,多变量模型通常更好;但如果外部变量本身就难以预测,简单的单变量模型反而更稳健。
  • 2025 年实践建议:
    • 先跑朴素基线和 SARIMA/XGBoost 建立基线
    • 然后尝试时序基础模型(TimesFM、Chronos)的零样本预测
    • 如果零样本不够好,做少量微调(Few-shot Fine-tuning)
    • 只有在上述都不够时,才考虑从头训练 Transformer 或 LSTM
  • 销量预测 → 零售/电商:预测未来一周/月各商品销量,指导备货和库存管理——沃尔玛、京东用销量预测优化供应链,减少缺货和积压,直接转化为利润。
  • 电力负荷预测 → 能源:预测未来 24 小时各区域用电量,电网据此调度发电机组——电力不可大规模存储,负荷预测准确度直接关系电网安全和成本。
  • 金融预测 → 量化交易/风险管理:股价、汇率、利率的走势预测是量化交易的基础(虽然有效市场假说认为长期不可预测,但短期波动模式可挖掘);VaR(风险价值)计算依赖波动率预测。
  • 交通流量预测 → 智慧交通:预测各路段未来时段的车流量,导航软件(高德/百度地图)据此推荐最优路线,交管部门据此优化信号灯配时。
  • 天气预测 → 气象:气温、降水、风速的时间序列预测——从数值天气预报到深度学习辅助预测,天气预报是人类最重要的预测任务之一。
  • 服务器负载预测 → 云计算运维:预测 CPU/内存/带宽需求,指导弹性扩容——Netflix、AWS 用时间序列预测实现自动伸缩(Auto-scaling),节省成本。
类库语言说明
statsmodelsPython经典统计时序库,提供 ARIMA、SARIMAX、指数平滑、STL 分解、ADF 检验等
pmdarimaPythonARIMA 自动参数搜索库,类似 R 的 auto.arima
ProphetPython/RFacebook 开源,擅长处理节假日和季节性的业务预测,简单易用
dartsPython统一接口的时序库,覆盖从 ARIMA 到 Transformer 的全谱方法
sktimePython基于 scikit-learn API 的机器学习时序工具库
NeuralProphetPythonProphet 的神经网络增强版,融合可解释性与深度学习
TimesFMPythonGoogle 时序基础模型,零样本预测
ChronosPythonAmazon 基于语言模型的时序预测
术语英文解释
平稳性Stationarity时间序列的统计特性(均值/方差/自相关)不随时间变化
差分Differencing用相邻观测值之差使非平稳序列变平稳的操作
自回归AutoRegressive (AR)用历史值的线性组合预测当前值的模型
移动平均Moving Average (MA)用历史预测误差的线性组合修正预测的模型
ACF / PACFAuto/Partial Auto-Correlation Function自相关/偏自相关函数,用于选择 ARIMA 参数
季节性Seasonality时间序列中以固定周期重复的规律性波动
滞后特征Lag Feature用过去若干步的值作为预测当前值的特征
时序交叉验证TimeSeriesSplit保证训练数据在时间上早于测试数据的交叉验证方式
STL 分解STL Decomposition基于 LOESS 回归的时间序列分解方法,提取趋势和季节性
单位根Unit Root使时间序列非平稳的特征,ADF 检验的目标
时序基础模型Time Series Foundation Model在海量时序数据上预训练的通用模型,支持零样本预测
零样本预测Zero-shot Forecasting无需任何训练,直接在未见过的时序数据上做预测
概率预测Probabilistic Forecasting输出预测分布(区间)而非单一点估计
  • 经典方法谱系:ARIMA(Box & Jenkins 1970,时间序列分析的”圣经”级框架)→ SARIMA(加入季节项)→ 指数平滑(Holt 1957 / Winters 1960,Holt-Winters 三参数法)→ State Space 模型 / Kalman 滤波。这些方法至今仍是时间序列分析的基石。推荐教材:Hyndman & Athanasopoulos,《Forecasting: Principles and Practice》(3rd ed., 2021,免费在线),时序预测的最佳入门书。
  • Prophet:Taylor & Letham 2018 “Forecasting at Scale”(PeerJ),Facebook 的业务预测工具,擅长处理节假日效应和变点检测。
  • 机器学习方法谱系:特征工程(滞后值 + 滑动窗口 + 时间编码)+ 树模型(XGBoost / LightGBM)是 M4 等时序竞赛中的强力方案。集成方法见集成学习与随机森林。
  • 深度学习方法谱系:LSTM(Hochreiter & Schmidhuber 1997,解决 RNN 长依赖问题)→ TCN(时序卷积网络,Bai et al. 2018)→ Informer(Zhou et al. 2021,稀疏注意力处理长序列)→ PatchTST(Nie et al. ICLR 2023,把 Transformer 的 patch 思路引入时序)→ TimesNet(Wu et al. ICLR 2023,将一维时序转为二维以同时捕捉周期内和周期间变化)→ iTransformer(Liu et al. ICLR 2024,反转维度做注意力)。Transformer 架构见Transformer 架构。
  • 时序基础模型:TimesFM(Das et al., Google, ICML 2024)、Chronos(Ansari et al., Amazon, 2024)、Moirai(Woo et al., Salesforce, ICML 2024)——代表时序领域的”Foundation Model”路线,用海量时序数据预训练实现零样本预测。
  • 争议与反思:Zeng et al. 2023 “Are Transformers Effective for Time Series Forecasting?”(AAAI 2023)用简单线性模型 DLinear 质疑 Transformer 在时序上的有效性,引发重要讨论。