2. 金融时间序列基础

在进入 PatchTST 之前,必须先回答一个更基础的问题:我们喂给模型的,究竟是什么样的数据?金融时间序列并不是一条“干净曲线”,它同时叠加了趋势、周期、噪声、跳跃与制度切换。若跳过本节直接建模,模型往往会把噪声当规律、把偶然当因果。本节围绕四个核心问题展开:时间序列由什么组成、什么叫平稳、自相关告诉我们什么、以及常见金融数据如何预处理。

一、时间序列的四个组成成分

经典分解把观测序列 y_t 视为若干成分的叠加或乘积:

  • 趋势项 T:长期方向,如利率下行周期、指数长期上行。
  • 季节项 S:固定周期波动,如日内成交量 U 型、月度宏观数据发布效应。
  • 循环项 C:非固定周期的经济周期,长度常大于一年。
  • 随机项 R:不可预测的残差,也是模型真正要压缩的部分。

加法模型为 y_t = T_t + S_t + C_t + R_t,乘法模型为 y_t = T_t × S_t × C_t × R_t。价格类数据因波动随水平放大,更接近乘法结构,通常先取对数再分解。

关键认知:分解不是为了“去掉”成分,而是为了判断哪些成分可建模、哪些应差分消除、哪些只能作为特征输入。

二、平稳性:建模的入场券

平稳性分严平稳与弱平稳。实践中使用弱平稳:均值恒定、方差恒定、自协方差只与时间间隔有关。金融价格几乎从不平稳,但收益率通常近似平稳。这也是为什么建模对象常是收益率而非价格。

检验与处理流程如下:

  1. 画时序图与滚动均值/滚动标准差,肉眼判断趋势与方差漂移。
  2. 用 ADF 或 KPSS 检验:ADF 原假设为存在单位根,p 值小才拒绝。
  3. 不平稳则差分,价格取一阶差分即收益率;必要时对波动率取对数差分。
  4. 差分后再次检验,并检查是否过度差分导致自相关被破坏。
from statsmodels.tsa.stattools import adfuller
import numpy as np

ret = np.diff(np.log(price))          # 对数收益率
stat, p, lags, nobs, crit, _ = adfuller(ret, autolag="AIC")
print(f"ADF={stat:.4f}, p={p:.4f}, lags={lags}")
# p < 0.05 视为拒绝单位根,可继续建模

三、自相关:序列记忆的度量

自相关函数 ACF 衡量 y_t 与 y_{t-k} 的线性相关,偏自相关 PACF 则剔除中间滞后影响。它们决定 ARIMA 的阶数,也决定 PatchTST 的 patch 长度与回看窗口是否合理。

  • ACF 缓慢衰减:存在趋势或单位根,需差分。
  • ACF 截尾、PACF 拖尾:倾向 MA 结构。
  • ACF 拖尾、PACF 截尾:倾向 AR 结构。
  • 收益率 ACF 常接近零,但平方收益率的 ACF 显著,说明波动率有记忆。
对 PatchTST 的启示:若原始序列自相关极弱,直接预测点位收益很难;可改为预测波动率、方向或使用多变量协变量提供额外信息。

四、常见金融数据与预处理清单

数据类型典型字段主要问题预处理方法
价格OHLC、收盘价非平稳、量纲大对数收益率、差分、标准化
成交量volume、turnover右偏、量级跨度大对数变换、滚动分位归一
宏观指标CPI、PMI、利率发布频率低、滞后、修订对齐时间戳、前向填充、同比/环比
高频数据tick、盘口缺失、非同步、噪声重采样、去极值、时间对齐

通用预处理顺序建议:

  1. 时间对齐:统一时区与频率,低频指标前向填充但需标记“填充位”。
  2. 缺失处理:优先插值,其次前向填充,禁止用未来值回填。
  3. 异常值:用滚动中位数与 MAD 识别,缩尾而非直接删除。
  4. 平稳化:差分或取对数收益率。
  5. 标准化:按训练集统计量做 z-score,避免验证/测试集信息泄漏。
# 防泄漏的滚动标准化
train_mean = train.mean()
train_std  = train.std()
train_norm = (train - train_mean) / train_std
valid_norm = (valid - train_mean) / train_std
test_norm  = (test  - train_mean) / train_std
常见误区:用全量数据计算均值方差再切分,会造成未来信息泄漏,离线指标虚高、上线即失效。另一个误区是对价格直接标准化而不做平稳化,模型会学到趋势而非规律。

五、案例复盘:一条价格序列的完整处理

假设某股票 2018–2023 日线收盘价。第一步画图,发现明显上行趋势且波动随价格放大;第二步 ADF 检验 p=0.92,确认非平稳;第三步取对数收益率,ADF p<0.01,通过;第四步检查收益率 ACF 近似白噪声,但平方收益率 ACF 显著,说明应引入波动率特征;第五步按时间切分,用训练集统计量标准化,并构造滚动窗口样本。至此,数据才真正成为 PatchTST 可消费的对象。

价格序列分解与预处理链路 原始价格(非平稳) 趋势 + 波动放大 成分分解 趋势 T 季节 S 循环 C 随机 R 判断可建模成分 价格→对数收益率 平稳化与检验 ADF / KPSS 检验 差分 / 对数收益率 ACF / PACF 诊断 p<0.05 通过 预处理五步清单 1 时间对齐 统一时区/频率 低频前向填充 2 缺失处理 插值优先 禁止未来回填 3 异常值 滚动中位数+MAD 缩尾不删除 4 平稳化 差分/对数收益 再次检验 5 标准化 训练集统计量 防信息泄漏

把上述流程固化后,数据才具备可复现性。下一阶段进入 PatchTST 时,你会看到 patch 划分、通道独立与长回看窗口的设计,正是建立在“平稳化后的多变量序列 + 合理自相关结构”这一基础之上。基础不牢,模型再新也只是在噪声上过拟合。