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 |
| 分钟/日线 OHLCV | 1min~1D | 停牌、节假日 | 交易日历不一致 |
| 技术指标 | 随行情 | 窗口不足 | 前 N 期为空 |
| 财报基本面 | 季度/年度 | 披露延迟 | 需按公告日对齐 |
| 宏观数据 | 月/季 | 发布滞后 | 前向填充易引入未来信息 |
| 新闻情绪 | 事件驱动 | 无新闻日 | 时间戳精度不一 |
频率选择直接影响模型设计:高频数据样本多但噪声大,低频数据信噪比高但样本少。实践中常采用“低频为骨架、高频做聚合特征”的混合策略。
三、缺失值处理:从删除到插补
金融时序缺失并非随机,停牌、节假日、数据源故障都会造成系统性缺失。处理策略按侵入性递增:
- 删除:整行删除适合缺失率极低且随机的场景,但会破坏时间连续性。
- 前向填充(ffill):适合价格、状态类变量,但会制造“零收益”假象。
- 线性/时间插补:适合缓慢变化的宏观变量,需注意不要跨越公告日。
- 模型插补:如 KNN、MICE 或基于注意力的插补,适合变量间相关性强的场景。
- 掩码机制:保留缺失位置并加入 mask 通道,让 Transformer 自行学习缺失模式。
四、异常值识别与稳健处理
金融数据中的异常值可能来自真实极端行情(如闪崩、涨停),也可能是错误数据(如价格多输一个零)。二者处理方式完全不同,前者应保留甚至加权,后者应修正或剔除。
常用识别方法包括:
- 基于统计:3σ 法则、IQR 四分位距、MAD 绝对中位差。
- 基于时序:滚动 Z-Score、EWMA 残差、STL 分解残差。
- 基于业务规则:价格越界、成交量突增、买卖价差异常。
处理时优先使用缩尾(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,符合策略真实水平。
该案例说明:对齐不是数据清洗的边角工作,而是决定模型是否可信的关键步骤。建议在流水线中加入“时间旅行测试”——用历史某日的数据快照重跑特征,验证当时是否真的能拿到这些值。
小结:多变量时序建模的第一步不是选模型,而是把数据整理成“时间上可信、维度上对齐、质量上可控”的张量。缺失值、异常值与对齐方法三者相互影响,任何一步偷懒都会在回测中被放大成虚假收益。掌握本章内容后,后续的特征工程与 Transformer 建模才有可靠输入。