2. 金融时间序列基础
在进入 TFT(Temporal Fusion Transformer)多变量金融预测之前,必须先建立对金融时间序列“数据底座”的清晰认知。TFT 的优势在于同时处理静态协变量、已知未来输入与观测到的历史输入,但如果对数据类型、频率、缺失、异常与平稳性缺乏判断,模型再强也只是在噪声上做拟合。本节围绕这五个基础概念展开,帮助你在建模前完成一次系统性的数据体检。
一、核心原理:多变量金融数据的五个基本维度
金融时间序列可以理解为按时间索引的一组观测值。单变量序列只有一个观测通道,而多变量序列在每个时间点上同时记录多个变量,例如某只股票的收盘价、成交量、换手率、市盈率,以及宏观层面的利率、汇率、CPI 等。TFT 建模时,这些变量会被区分为三类角色:静态协变量(如行业、上市板块)、已知未来输入(如日历、已公布的财报日期)和观测输入(如历史价格与成交量)。理解这一分类,是后续特征工程与模型配置的前提。
数据类型上,金融数据可分为数值型(价格、收益率、成交量)、类别型(行业、评级、交易状态)和布尔型(是否停牌、是否分红)。频率则决定了样本的时间间隔,常见有日频、周频、月频,以及高频的分钟级与 tick 级。缺失值在金融数据中极为普遍,可能来自非交易日、停牌、数据源断档或字段本身不披露。异常值则常由错单、闪崩、拆股未复权或数据录入错误引起。平稳性描述的是序列的统计特性是否随时间保持不变,它直接关系到模型能否学到可泛化的规律。
二、方法流程:从原始数据到可建模序列
面对一份多变量金融数据,建议按以下流程处理。第一步是频率对齐:将不同来源的数据统一到同一时间索引上,例如把月频宏观数据向前填充到日频,或把日频价格降采样为周频。第二步是缺失值处理:区分“真实缺失”与“非交易日缺失”,前者可用前向填充、插值或缺失指示变量,后者应直接剔除或按交易日历对齐。第三步是异常值检测:常用方法包括基于分位数的截断、Z-Score、IQR 以及滚动窗口的 MAD。第四步是平稳性检验:通过 ADF、KPSS 等检验判断序列是否需要差分或取对数。第五步是角色划分:明确哪些变量属于静态、已知未来和观测输入。
import pandas as pd
import numpy as np
from statsmodels.tsa.stattools import adfuller
# 1. 频率对齐:将日频数据重采样为周频
df_weekly = df.resample('W-FRI').last()
# 2. 缺失值标记:保留缺失指示变量
df_weekly['volume_missing'] = df_weekly['volume'].isna().astype(int)
# 3. 异常值检测:滚动 MAD 截断
rolling_median = df_weekly['close'].rolling(20).median()
rolling_mad = (df_weekly['close'] - rolling_median).abs().rolling(20).median()
df_weekly['close_clipped'] = np.where(
(df_weekly['close'] - rolling_median).abs() > 5 * rolling_mad,
rolling_median, df_weekly['close']
)
# 4. 平稳性检验:ADF
adf_result = adfuller(df_weekly['close_clipped'].dropna())
print(f"ADF Statistic: {adf_result[0]:.4f}, p-value: {adf_result[1]:.4f}")
三、案例场景:一只股票的多变量数据体检
假设我们要预测某只 A 股未来 5 日的收益率,原始数据包含日频收盘价、成交量、换手率,以及月频的 CPI 和利率。首先发现 CPI 和利率是月频,需要向前填充到日频,但要注意填充后的值在当月内不变,不能引入未来信息。其次发现该股票在春节前后有多个交易日缺失,这属于非交易日缺失,应按交易日历剔除而非填充。再次发现某日成交量异常放大 20 倍,经核查是拆股未复权导致,应使用复权价格重新计算。最后对收盘价做 ADF 检验,p 值为 0.92,说明不平稳,需转为对数收益率后再检验,p 值降至 0.01,满足平稳性要求。
| 检查项 | 常见问题 | 推荐处理 | TFT 中的角色 |
|---|---|---|---|
| 数据类型 | 类别型未编码 | 独热或嵌入编码 | 静态协变量 |
| 频率 | 月频与日频混用 | 统一重采样并对齐 | 时间索引 |
| 缺失值 | 停牌被误填充 | 缺失指示变量 + 前向填充 | 观测输入掩码 |
| 异常值 | 未复权导致跳变 | 复权 + 滚动 MAD 截断 | 观测输入 |
| 平稳性 | 价格序列不平稳 | 对数差分或收益率 | 目标变量 |
四、误区与复盘
误区一:把缺失值一律填充为 0。在金融数据中,0 可能代表真实值(如收益率为 0),也可能代表缺失。静默填 0 会让模型误以为当天发生了极端事件。正确做法是保留缺失指示变量,让 TFT 的掩码机制自行学习。
误区二:忽略平稳性直接建模。价格序列通常不平稳,直接输入 TFT 会导致模型学到时间趋势而非可泛化规律。应先转为收益率或对数差分,再检验平稳性。
误区三:异常值直接删除。金融数据中的异常值有时包含重要信息,如闪崩可能预示风险。建议先标记、再截断,而非直接删除。
复盘建议:每次建模前,用一张“数据体检表”记录频率、缺失率、异常比例和 ADF 检验结果。这份记录不仅能帮助你定位问题,还能在模型效果不佳时快速回溯是数据问题还是模型问题。TFT 虽然强大,但它对输入数据的质量依然敏感,基础工作做得越扎实,后续的可解释性分析才越可靠。
掌握数据类型、频率、缺失值、异常值与平稳性这五个基础概念,是构建可信多变量金融预测系统的第一步。它们决定了你输入 TFT 的数据是否干净、对齐、可解释,也决定了模型输出的特征重要性和注意力权重是否值得信任。