2. 金融时序数据基础

在把 Transformer 用于金融预测之前,必须先回答一个更基础的问题:我们喂给模型的“数据”到底是什么形状、什么频率、什么质量。Transformer 擅长捕捉长距离依赖与跨变量交互,但它对输入的对齐性和数值稳定性同样敏感。本章围绕多变量时序的定义、金融数据类型、频率体系、缺失值、异常值与对齐方法六个方面展开,为后续特征工程与建模打下地基。

一、多变量时序的定义与张量视角

单变量时序是形如 x_1, x_2, ..., x_T 的标量序列;多变量时序则是在每个时间步 t 上同时观测 D 个变量,形成矩阵 X ∈ R^{T×D}。若再考虑批量样本,输入张量就是 [B, T, D],其中 B 为批大小,T 为回看窗口长度,D 为变量维度。Transformer 的注意力机制正是在 T 维(时间)与 D 维(变量)之间建立权重关系。

金融场景中,D 通常包含价格、成交量、技术指标、宏观因子、情绪指标等异构变量。它们量纲不同、频率不同、缺失模式不同,因此“多变量”不仅是维度叠加,更意味着对齐与标准化问题。

核心公式:给定回看窗口 L 与预测步长 H,模型学习映射 f: R^{L×D} → R^{H×K},其中 K 为预测目标变量数(如收盘价、收益率、波动率)。

二、金融数据类型与频率体系

金融数据按来源可分为行情数据(OHLCV)、基本面数据(财报、估值)、衍生指标(MA、RSI、MACD)、另类数据(新闻情绪、搜索指数、卫星数据)与宏观数据(利率、CPI、PMI)。它们的更新频率差异极大,从毫秒级 tick 到季度级财报。

数据类型典型频率常见缺失原因对齐难点
逐笔/tick 行情毫秒~秒无成交时段需重采样到统一 bar
分钟/日线 OHLCV1min~1D停牌、节假日交易日历不一致
技术指标随行情窗口不足前 N 期为空
财报基本面季度/年度披露延迟需按公告日对齐
宏观数据月/季发布滞后前向填充易引入未来信息
新闻情绪事件驱动无新闻日时间戳精度不一

频率选择直接影响模型设计:高频数据样本多但噪声大,低频数据信噪比高但样本少。实践中常采用“低频为骨架、高频做聚合特征”的混合策略。

三、缺失值处理:从删除到插补

金融时序缺失并非随机,停牌、节假日、数据源故障都会造成系统性缺失。处理策略按侵入性递增:

  • 删除:整行删除适合缺失率极低且随机的场景,但会破坏时间连续性。
  • 前向填充(ffill):适合价格、状态类变量,但会制造“零收益”假象。
  • 线性/时间插补:适合缓慢变化的宏观变量,需注意不要跨越公告日。
  • 模型插补:如 KNN、MICE 或基于注意力的插补,适合变量间相关性强的场景。
  • 掩码机制:保留缺失位置并加入 mask 通道,让 Transformer 自行学习缺失模式。
推荐做法:对价格类变量使用 ffill 并附加“是否填充”指示列;对收益率类变量在填充后重新计算,避免用填充价计算收益。

四、异常值识别与稳健处理

金融数据中的异常值可能来自真实极端行情(如闪崩、涨停),也可能是错误数据(如价格多输一个零)。二者处理方式完全不同,前者应保留甚至加权,后者应修正或剔除。

常用识别方法包括:

  1. 基于统计:3σ 法则、IQR 四分位距、MAD 绝对中位差。
  2. 基于时序:滚动 Z-Score、EWMA 残差、STL 分解残差。
  3. 基于业务规则:价格越界、成交量突增、买卖价差异常。

处理时优先使用缩尾(Winsorize)而非直接删除,保留极端行情的信息量。对收益率序列,可先做波动率标准化再检测异常。

常见误区:用全样本均值方差做标准化,导致未来信息泄漏。正确做法是滚动窗口或扩展窗口统计,且只在训练集上拟合参数。

五、对齐方法:时间轴、交易日历与公告日

多源数据对齐的核心是“同一时间点看到同一信息”。对齐分三个层次:

  • 时间戳对齐:统一时区与精度,tick 数据需按 bar 聚合。
  • 交易日历对齐:不同市场节假日不同,需用交易日历取交集或并集。
  • 信息可用性对齐:财报按公告日而非报告期对齐,宏观数据按发布日对齐,避免前视偏差。

对齐后建议做一次“时间轴审计”:检查每个时间步各变量的可用性,输出缺失热力图,确认没有未来信息混入。

# 示例:多源数据按交易日历对齐(pandas)
import pandas as pd

price = pd.read_csv("price.csv", parse_dates=["date"]).set_index("date")
macro = pd.read_csv("macro.csv", parse_dates=["release_date"]).set_index("release_date")

# 以价格为骨架,宏观按发布日前向填充
aligned = price.join(macro, how="left").ffill()

# 标记填充位置
aligned["macro_filled"] = macro.reindex(price.index).isna().astype(int)

# 审计缺失率
print(aligned.isna().mean().sort_values(ascending=False))

六、案例复盘:一次因对齐错误导致的“虚假高收益”

某团队用日频价格与季度财报训练 Transformer,回测夏普高达 3.5。复盘发现:财报数据按“报告期”而非“公告日”对齐,模型在报告期结束时就“看到”了尚未公布的业绩,形成前视偏差。修正为公告日对齐后,夏普回落至 1.1,符合策略真实水平。

该案例说明:对齐不是数据清洗的边角工作,而是决定模型是否可信的关键步骤。建议在流水线中加入“时间旅行测试”——用历史某日的数据快照重跑特征,验证当时是否真的能拿到这些值。

多源金融时序对齐与质量处理流程 行情 OHLCV 技术指标 财报基本面 宏观/情绪 时间轴对齐 统一时区/精度 交易日历取交集 公告日对齐 重采样到统一频率 前视偏差审计 缺失值处理 ffill / 插补 / mask 填充指示列 异常值处理 滚动 Z-Score / MAD 缩尾而非删除 对齐张量 [B, T, D] + mask 通道

小结:多变量时序建模的第一步不是选模型,而是把数据整理成“时间上可信、维度上对齐、质量上可控”的张量。缺失值、异常值与对齐方法三者相互影响,任何一步偷懒都会在回测中被放大成虚假收益。掌握本章内容后,后续的特征工程与 Transformer 建模才有可靠输入。