2. 因子数据源:行情数据(Tick/分钟/日线)、财务数据、舆情数据、数据清洗与对齐
因子计算的质量直接取决于底层数据的完整性、准确性与时效性。量化系统通常需要融合多类异构数据源,并在统一的时序框架下完成清洗与对齐。本章将系统梳理行情、财务、舆情三大类数据源的特征、采集要点与预处理方法。
2.1 行情数据:Tick / 分钟 / 日线
行情数据是因子计算最核心的输入,按时间粒度可分为以下三层:
| 粒度 | 典型字段 | 数据量级(单标的/日) | 主要用途 |
|---|---|---|---|
| Tick | 最新价、成交量、委买/委卖、成交明细 | 数千~数万条 | 高频因子、微观结构分析、订单流特征 |
| 分钟线 | 开/高/低/收、成交量、成交额 | 240~480 条 | 日内动量、波动率、资金流因子 |
| 日线 | 开/高/低/收、成交量、换手率 | 1 条 | 传统多因子、截面回归、风险模型 |
数据源选择建议: 低延迟评分系统通常以分钟线作为主力数据源,Tick 数据用于高频信号触发,日线用于低频因子校验与回测基准。
2.2 财务数据:结构化与非结构化
财务数据是基本面因子的基础,主要包含以下维度:
- 资产负债表:总资产、净资产、负债率、应收账款
- 利润表:营业收入、净利润、毛利率、扣非净利润
- 现金流量表:经营活动现金流、自由现金流
- 衍生指标:ROE、ROA、PE、PB、股息率
财务数据发布具有明显的周期性(季报、中报、年报),且存在 发布时滞 与 修正回溯 问题。在因子计算中必须使用 实际可获取日期 而非财报截止日期,避免未来函数。
常见陷阱: 直接使用财报截止日作为因子时间戳会导致严重的向前窥视偏差。正确的做法是使用财报实际披露日期(或至少使用行业公认的滞后窗口,如 A 股季报滞后 1 个月)。
2.3 舆情数据:文本因子与另类数据
舆情数据近年来成为量化因子的重要补充,主要包括:
- 新闻情绪:财经新闻标题/正文的情感得分、热度指数
- 社交媒体:股吧、雪球、微博的讨论量与情绪极性
- 研报摘要:券商研报的评级变动、目标价调整
- 另类数据:招聘数据、卫星图像、供应链数据(需合规授权)
舆情数据通常为非结构化文本,需要经过 NLP 预处理(分词、去停用词、实体识别)和 情感打分(基于词典或预训练模型)才能转化为数值因子。
2.4 数据清洗与对齐:低延迟系统的关键环节
多源数据在进入因子计算引擎前,必须经过统一的清洗与对齐流水线。下图展示了典型的数据处理架构:
2.5 数据对齐的核心规则
在低延迟评分系统中,数据对齐必须遵循以下硬性规则:
- 时间戳统一:所有数据源统一转换为 UTC 时间戳(或交易所本地时间),精度至少到毫秒。
- 频率转换:Tick 数据按分钟聚合为分钟线,分钟线按日聚合为日线,聚合规则需一致(如:最后一条 Tick 价为收盘价)。
- 滞后对齐:财务数据使用披露日期,舆情数据使用发布时间,行情数据使用实际交易时间。因子计算时,T 日的财务因子只能使用 T-1 日及之前已披露的数据。
- 截面快照:每个时间点生成一张包含所有标的当前可用数据的截面表,用于因子计算。
低延迟优化要点: 数据对齐流水线应使用内存数据库(如 Redis / Aerospike)缓存中间结果,避免每次因子计算都重新读取原始数据。对齐后的宽表采用列式存储(如 Apache Arrow),减少序列化开销。
2.6 清洗与对齐的常见问题
| 问题类型 | 典型场景 | 处理方案 |
|---|---|---|
| 缺失值 | 停牌日无行情、财报未发布 | 前向填充(ffill)、行业均值替代、标记缺失 |
| 异常值 | Tick 数据中的错误报价 | 基于中位数绝对偏差(MAD)过滤、价格涨跌停限制 |
| 复权处理 | 除权除息导致价格跳空 | 使用后复权或前复权统一处理,因子计算中保持一致 |
| 时间戳错位 | 不同数据源时钟不同步 | 使用 NTP 同步,或基于交易所撮合时间对齐 |
| 文本噪声 | 舆情数据中的广告、重复内容 | 去重、正则过滤、基于相似度聚类 |
下图展示了数据对齐前后因子值的对比效果:
2.7 实战:分钟线因子数据对齐示例
以下代码展示了使用 Python 对分钟线行情与财务数据进行对齐的简化实现:
import pandas as pd
import numpy as np
# 模拟分钟线行情数据
market_data = pd.DataFrame({
'timestamp': pd.date_range('2024-01-01 09:30', periods=240, freq='1min'),
'close': np.random.randn(240).cumsum() + 100,
'volume': np.random.randint(1000, 10000, 240)
})
# 模拟财务数据(使用披露日期)
financial_data = pd.DataFrame({
'disclosure_date': pd.to_datetime(['2024-01-05', '2024-01-20']),
'pe_ratio': [15.2, 14.8],
'roe': [0.12, 0.13]
})
# 对齐:将财务数据按披露日期前向填充到分钟线
market_data['date'] = market_data['timestamp'].dt.date
financial_data['date'] = financial_data['disclosure_date'].dt.date
# 使用 merge_asof 实现滞后对齐
aligned = pd.merge_asof(
market_data.sort_values('timestamp'),
financial_data.sort_values('disclosure_date'),
left_on='timestamp',
right_on='disclosure_date',
direction='backward' # 只使用已披露的数据
)
print(aligned[['timestamp', 'close', 'pe_ratio', 'roe']].head())
性能提示: 在生产环境中,应使用 C++ 或 Rust 实现数据对齐逻辑,或利用 NumPy 的向量化操作避免逐行循环。对于全市场 5000+ 标的,分钟线对齐应在 50ms 内完成。
2.8 本章小结
因子数据源的质量决定了量化系统的上限。行情数据提供高频价格与成交量信息,财务数据贡献基本面维度,舆情数据补充市场情绪信号。三者经过统一的清洗与对齐流水线后,才能生成可靠的因子值。在低延迟场景下,数据对齐的时效性要求达到毫秒级,需要从存储结构、算法实现和硬件加速三个层面进行优化。