2. 金融时间序列基础
在构建Transformer交易信号预测模型之前,我们必须先回答一个更底层的问题:模型究竟"吃"进去的是什么数据?金融时间序列不同于自然语言或图像,它带有强烈的时间戳依赖、非平稳性、噪声与结构性缺失。本节将系统梳理从K线到订单簿的数据层级,并给出复权、缺失值处理与数据源选择的工程化方法。
一、核心原理:金融数据的四个层级
金融时间序列按采样粒度与信息密度,可划分为四个层级,它们对应不同的建模目标与Transformer输入设计:
- OHLCV数据:即Open、High、Low、Close、Volume,是最常见的K线聚合数据。它把一段时间内的成交压缩为5个标量,信息损失大但噪声低,适合中低频信号预测。
- tick数据:逐笔成交记录,包含时间戳、价格、成交量、买卖方向。它保留了微观交易行为,是高频特征工程的原料。
- 订单簿数据:Level-1/Level-2/Level-3快照,记录买卖各档位的价格与挂单量。它反映市场深度与流动性,是捕捉短期供需失衡的关键。
- 衍生指标:由上述数据计算出的技术指标、资金流、波动率等,通常作为Transformer的额外通道输入。
关键认知:Transformer并不天然理解"价格",它只理解向量序列。因此数据层级的选择,本质上决定了模型能看到多细的市场结构。
二、方法流程:从原始数据到模型输入
一个可复用的数据流水线通常包含以下步骤:
- 数据采集:从交易所API、数据供应商或本地数据库拉取原始数据。
- 时间对齐:将tick或订单簿按固定窗口(如1分钟)聚合,或对多源数据做时间戳对齐。
- 复权处理:对股票数据消除分红、送股、配股造成的价格跳空。
- 缺失值处理:识别停牌、无成交、数据源断流等情况并合理填充或掩码。
- 特征归一化:对价格、成交量做标准化或对数差分,降低非平稳性。
- 序列切分:按时间顺序构造滑动窗口,避免未来信息泄漏。
下面是一个将tick数据聚合为1分钟OHLCV的示例代码:
import pandas as pd
# 假设ticks包含: timestamp, price, volume
ticks['timestamp'] = pd.to_datetime(ticks['timestamp'])
ticks = ticks.set_index('timestamp')
ohlcv = ticks['price'].resample('1min').ohlc()
ohlcv['volume'] = ticks['volume'].resample('1min').sum()
ohlcv = ohlcv.dropna(subset=['open', 'close'])
print(ohlcv.head())
三、复权处理与缺失值处理
复权是股票数据特有的问题。除权除息会导致价格在某一日出现人为跳空,若直接输入模型,会被误判为真实下跌。常见做法有前复权、后复权和比例复权:
| 复权方式 | 调整基准 | 适用场景 | 注意事项 |
|---|---|---|---|
| 前复权 | 以最新价格为基准向前调整 | 回测、可视化 | 历史价格会随新除权变化 |
| 后复权 | 以上市首日为基准向后调整 | 长期收益计算 | 当前价格被放大 |
| 比例复权 | 按复权因子逐日相乘 | 因子研究 | 需保存复权因子表 |
缺失值在金融数据中极为常见,来源包括停牌、涨跌停无成交、API限流、时区错位等。处理策略需区分"真缺失"与"假缺失":
- 停牌导致的缺失:应保留时间戳并用前值填充,同时增加"是否停牌"掩码通道。
- 无成交导致的缺失:成交量填0,价格用前收盘价填充。
- 数据源断流:优先重新拉取,无法补齐时用插值并标记质量标志。
切忌直接对价格序列做线性插值后送入模型,这会制造出并不存在的"平滑趋势",导致回测虚高。正确做法是填充+掩码,让模型自己学习缺失模式。
四、常见数据源与选型建议
不同数据源在覆盖范围、延迟、成本与字段丰富度上差异明显:
- 股票日线/分钟线:Tushare、AkShare、Yahoo Finance、Wind、聚宽。
- 加密货币tick与订单簿:Binance API、Coinbase Pro、Kaiko、Tardis.dev。
- 期货与期权:CQG、Interactive Brokers、交易所直连。
- 另类数据:新闻情绪、链上数据、卫星数据等,可作为Transformer的辅助模态。
选型原则:先明确预测频率。若做日频信号,OHLCV+复权即可;若做分钟级或高频,必须引入tick或订单簿,并重点评估数据延迟与存储成本。
五、案例与复盘:一次典型的踩坑
某团队用日线OHLCV训练Transformer预测次日涨跌,回测AUC高达0.78,但实盘迅速失效。复盘发现三个问题:一是未做前复权,除权日的价格跳空被模型当成强信号;二是停牌日直接用0填充,制造了极端收益率;三是训练集与验证集按随机切分,造成未来信息泄漏。修正后,AUC回落至0.56,但实盘表现与回测一致。
这个案例说明:数据质量决定模型上限。Transformer再强,也无法从被污染的时间序列中恢复真实的市场结构。在进入模型设计之前,请务必完成复权、缺失值掩码与严格的时间切分。