2. 金融数据基础
在机器学习Alpha研究中,模型的上限往往由数据决定,而非算法。理解金融数据的来源、结构与处理要点,是构建可靠交易信号的第一道门槛。本节将系统梳理三类核心数据,并给出频率、复权、对齐、缺失值与异常值的实战处理框架。
一、三类数据的来源与结构
行情数据是量化研究中使用频率最高的数据,来源包括交易所直连、Wind/聚宽/Tushare等数据商、以及券商Level-2行情。其结构通常为时间戳、证券代码、开高低收、成交量、成交额、买卖盘口等字段。行情数据又可细分为日线、分钟线、Tick级三类,频率越高,噪声越大,但对微观结构信号的刻画越精细。
基本面数据来源于上市公司定期报告(年报、季报)、业绩预告、分析师一致预期等。其结构以“报告期+证券代码”为主键,包含营收、净利润、ROE、资产负债率等财务指标。关键难点在于:财报存在披露滞后,使用时必须按“公告日”而非“报告期”对齐,否则会引入未来函数。
另类数据包括新闻舆情、卫星图像、电商销量、招聘信息、供应链关系等。其结构高度异构,可能是文本、图像或图结构。另类数据的价值在于与传统因子低相关,但清洗成本高、覆盖度不稳定,需谨慎评估其可持续性。
二、数据频率、复权与对齐要点
频率选择需与策略持有期匹配。日频因子适合周度调仓,分钟因子适合日内交易。跨频率使用时,必须统一到同一时间轴,通常采用“降频”而非“升频”,避免插值引入虚假信息。
复权处理是行情数据特有的关键步骤。除权除息会导致价格跳空,若不复权,均线、收益率等指标将严重失真。前复权适合回测(保持当前价格真实),后复权适合历史收益计算。实战中建议:用后复权价计算收益率,用前复权价展示K线。
数据对齐的核心是时间戳语义统一。行情数据用交易时间,基本面数据用公告时间,另类数据用采集时间。三者对齐时,必须确保“在决策时刻只能看到已发布的信息”。
# 示例:按公告日对齐基本面数据,避免未来函数
import pandas as pd
# 行情数据:交易日索引
price = pd.read_csv("price.csv", parse_dates=["trade_date"])
# 基本面数据:公告日 + 报告期
fund = pd.read_csv("fundamental.csv", parse_dates=["ann_date", "report_period"])
# 关键:用公告日做 merge_asof,而非报告期
merged = pd.merge_asof(
price.sort_values("trade_date"),
fund.sort_values("ann_date"),
left_on="trade_date",
right_on="ann_date",
by="symbol",
direction="backward" # 只取已公告的数据
)
三、缺失值与异常值处理
金融数据缺失极为常见:停牌、新股上市、财报未披露、另类数据覆盖不全等。处理原则是先判断缺失机制,再选择填充策略。
- 停牌缺失:不应填充价格,应标记为NaN并让模型学习“停牌状态”这一信息。
- 财报缺失:可用前值填充(ffill),但需限制填充窗口,避免使用过期过久的数据。
- 另类数据缺失:若覆盖度低于阈值(如60%),建议直接剔除该因子。
异常值方面,金融数据存在厚尾和极端事件。常用方法包括:MAD中位数绝对偏差、分位数截断(Winsorize)、以及基于波动率的动态阈值。切忌直接用3σ法则,因为收益率分布并非正态。
四、实战案例与复盘清单
假设构建一个“财报超预期+动量”的日频Alpha因子。流程如下:
- 获取日线行情,计算后复权收益率与20日动量。
- 获取财报数据,按公告日对齐,计算净利润同比增速。
- 将财报因子前向填充至下一公告日,限制最长90天。
- 对动量因子做MAD去极值,对财报因子做分位数截断。
- 合并后检查缺失率,剔除缺失率>40%的股票。
| 处理环节 | 推荐做法 | 禁止做法 |
|---|---|---|
| 复权 | 后复权算收益,前复权画图 | 不复权直接算均线 |
| 财报对齐 | 按公告日merge_asof | 按报告期直接合并 |
| 缺失值 | 按机制分类处理,限制填充窗口 | 全样本均值填充 |
| 异常值 | MAD或分位数截断 | 直接删除所有极值 |
| 频率对齐 | 降频,统一到交易日 | 升频插值 |