数据获取与预处理
数据获取与预处理
本章讨论量化策略的“地基”:数据。常说“Garbage in, garbage out”,如果数据本身质量不佳,后续再精巧的模型和策略也很难可靠。
在后续章节中,我们会频繁用到“标的–时间”二维结构的数据。为方便引用,这里先给出一个简单的记号约定:
0. 一个简单的数据记号体系
- 用 表示资产(例如股票);
- 用 表示离散时间(例如交易日,按照交易所日历排序);
- 表示第 只资产在日期 的收盘价;
- 表示从 到 的简单收益率:
其中 是期间分红(若无则为 0); - 表示对应的对数收益率:
在 较小的情况下有近似关系 ; - 表示第 只资产在 期的某个特征/因子(例如市盈率、动量等),通常通过原始数据计算得到;
- 表示与时间相关但与单个资产无关的宏观或市场状态变量(如市场收益、宏观指数等)。
从数据结构角度,可以把量化研究的数据视作一个“面板”(panel):
在后续的因子检验和计量部分,我们会基于这一面板形式做横截面回归、面板回归等分析。
1. 量化投资中常见的数据类型
从资产类别和来源角度,大致可以分为以下几类:
1.1 市场数据
描述资产在各种市场上的价格和成交特征:
- 日度行情数据:开盘价、最高价、最低价、收盘价(OHLC)、成交量、成交额等。
- 高频/分笔数据:
- 逐笔成交(每一笔成交的时间、价格、成交量、方向等);
- 分钟/秒级 bar(1m、5m 等)。
- 盘口数据(Level 1/Level 2):
- L1:最优买一/卖一价和量;
- L2:多档买卖盘,反映盘口深度与订单簿结构。
用于:
- 价格序列构造收益率、波动率等;
- 分析成交行为、流动性情况;
- 对高频策略尤为重要。
在学术研究中,日度及更高频的市场数据常被用于刻画收益的“风格化事实(stylized facts)”,例如厚尾分布、波动聚集和长记忆等,典型文献包括 Cont (2001) 对金融时间序列经验特征的综述,以及 Tsay (2010) 对金融时间序列模型的系统总结。
1.2 基本面与财务数据
反映公司或资产发行主体的经营状况与财务健康程度,例如:
- 资产负债表、利润表、现金流量表;
- 各类财务指标:ROE、ROA、毛利率、负债率等;
- 分红、回购、再融资等信息。
用于:
- 构建估值因子(PE、PB、EV/EBITDA 等);
- 构建质量因子(盈利能力、稳健性等)。
在资产定价文献中,财务与账面价值类变量经常出现在多因子模型中,例如 Fama and French (1993, 2015) 提出的账面市值比(B/M)、盈利能力和投资风格因子。量化研究中常用这些变量构建价值因子、质量因子,并与经典因子保持口径一致以方便对比。
1.3 衍生品与利率相关数据
- 期货、期权、互换等衍生品的行情和持仓情况;
- 利率曲线、信用利差等。
用于:
- 对冲与套利策略;
- 利率/信用风险建模。
1.4 宏观与另类数据(Alternative Data)
- 宏观指标:GDP、通胀率、失业率、PMI 等;
- 行业高频指标:电力负荷、运量、在线搜索指数等;
- 新闻、公告、舆情相关文本数据。
用于:
- 自上而下宏观/资产配置策略;
- 事件驱动、情绪因子构建等。
2. 数据来源与获取方式
不同机构会有不同的数据获取渠道,一般包括:
- 交易所/官方渠道:
- 直接获取历史和实时行情数据(通常需要付费授权);
- 数据供应商:
- 聚合多家交易所和市场的数据,提供统一接口;
- 公开数据:
- 例如监管机构披露数据、上市公司公告等;
- 自建采集:
- 对新闻网站、企业网站等进行爬取(需遵守相关法律和网站使用条款)。
在教学与研究环境中,更多使用公开或教学用数据集;在生产环境中,一般使用商业数据源,并配合内部数据清洗标准。
注意:本笔记只讨论数据类别与处理方法,不会涉及具体商业数据商的数据结构或接口细节,以避免版权问题。
3. 数据清洗的核心目标
数据清洗的目标不是“修正所有问题”,而是:尽量减少系统性偏差和明显错误,使数据适合用来建模和回测。
典型工作包括:
- 识别并处理缺失值;
- 处理异常值和极端值;
- 时间对齐与重采样;
- 检查并避免常见偏差(幸存者偏差、前视偏差等)。
下面分别展开。
4. 缺失值处理
在表格化数据中,缺失值几乎是不可避免的,例如:
- 某些财务指标在部分年份/季度未披露;
- 某些股票在早期或停牌期间没有价格数据;
- 新上市公司历史数据较少。
常见处理方式:
- 删除含缺失值的样本
- 适用场景:缺失比例极小,且删除后不会改变样本结构;
- 风险:如果缺失具有系统性(例如财务状况不佳的公司更易延迟披露),简单删除会引入偏差。
- 前值填充(Forward Fill)
- 对时间序列数据常用:
- 若 缺失,则令 ;
- 适用:价格、持仓等连续性质较强的指标;
- 不适用:变化突发、跳跃明显的指标(如一次性利润)。
- 对时间序列数据常用:
- 插值(Interpolation)
- 线性插值、样条插值等;
- 在金融时间序列中需谨慎使用,避免制造不存在的中间状态。
- 用分组统计量填充
- 按行业、市值等分组,用组内均值或中位数替代缺失值;
- 适合构建截面因子时保持横截面平衡,但会影响因子的真实分布。
在实际量化研究中,经常会结合多种方法:例如先判断缺失原因,对小比例随机缺失使用简单方法,对系统性缺失则单独建模或做样本剔除。
4.1 从缺失机制角度看缺失值
在统计学中(Rubin, 1976),常用以下三类机制刻画缺失数据:
- 完全随机缺失(MCAR):缺失与观测值和未观测值都无关;
- 条件随机缺失(MAR):在给定已观测变量的条件下,缺失与未观测值无关;
- 非随机缺失(MNAR):缺失机制依赖于未观测的真实值本身。
在量化场景中,许多缺失并非 MCAR:
- 财报延迟披露或不披露,往往与公司经营状况、风险状况有关,更接近 MNAR;
- 某些市值/行业的股票更易长期停牌,价格和成交量缺失可能与流动性风险高度相关。
因此:
- 对于占比极小、近似 MCAR 的缺失,简单删除或用组内统计量填充通常问题不大;
- 对于明显具有结构性的缺失,更合理的做法是:
- 将“可交易性/是否有数据”本身视作一个特征,显式纳入策略设计;
- 或在样本划定时就剔除长期缺失和持续停牌的资产,并在文档中说明这一筛选规则。
5. 异常值与极端值处理
由于录入错误、拆分复权错误、交易异常等原因,数据中可能出现非常大的“尖刺”。
例如:
- 某日价格被记录为 10000,而前后价格均在 10 左右;
- 成交量突然比历史平均高出几百倍。
常见处理方法:
5.1 Winsorization(去极值)
对某个指标 ,在横截面或时间序列上,将极端分位数缩回到阈值,例如:
- 计算 1% 和 99% 分位数,记为 ;
- 对所有样本:
好处:
- 降低极端数据对均值、方差等统计量的影响;
- 对回归、协方差估计更加稳定。
5.2 标准差截断
- 假设某变量近似服从正态分布,若 ,则认为是异常值(典型 或 )。
- 类似于 winsorization,也可以把超出部分缩回到边界,或直接标记为异常。
5.3 稳健统计视角与厚尾分布
大量实证研究表明,金融收益序列往往表现出:
- 厚尾(heavy tails):极端收益出现的频率远高于正态分布预期;
- 非对称性(skewness):收益分布呈显著偏度;
- 波动聚集(volatility clustering):大波动往往伴随后续一段时间的大波动。
这意味着:
- 依赖均值和方差的传统统计量在小样本和极端行情下并不稳健;
- 实务中常配合稳健统计量(如中位数、分位数、MAD)和基于分位数的截断方法;
- 在风险建模中,使用 t 分布、偏态 t 分布或其他厚尾分布来拟合收益的尾部行为会更合理(见 Cont, 2001;Tsay, 2010)。
5.3 业务规则与人工检查
- 某些异常值可以通过业务知识直接判定:
- 如某股票价格低于最小价格单位;
- 某些日期为停牌状态,价格和成交量应为特定模式;
- 对于关键策略往往需要配合人工抽样检查,以避免黑箱处理带来隐患。
6. 时间对齐与重采样
不同数据源的频率和时间戳可能不一致,例如:
- 分钟级价格 vs 日度财务数据;
- 不同市场的交易时间不同;
- 宏观数据按月/季度更新。
处理思路:
- 统一时间频率:
- 将高频数据聚合到低频(例如:分钟 → 日度 OHLC);
- 对日度数据,可按交易所日历对齐,处理非交易日(节假日)。
- 对齐不同来源的数据:
- 按“可获得时点”对齐,避免使用未来信息:
- 财报数据往往在披露日之后才能使用;
- 宏观数据公布有滞后。
- 按“可获得时点”对齐,避免使用未来信息:
- 考虑时区与夏令时问题:
- 对跨市场策略,需统一到 UTC 或某一标准时区。
从计量的角度看,避免前视偏差的关键在于明确信息集 :
- 表示在时刻 决策前,研究者/投资者能够观察到的所有变量;
- 任一在 期使用的因子 ,都应当是 可测的,不能依赖于 之后才会公布的信息。
对于存在公布滞后的数据(如财报、宏观数据等),常用做法包括:
- 为每一条记录引入“可用日期” ,在回测中只允许使用满足 的观测;
- 或者引入固定滞后窗口,例如在 期使用的是上一财年在 或更早已经披露的财务数据。
关于公告日和交易日错配的系统处理方式,可参考 Campbell, Lo and MacKinlay (1997) 中对事件研究(event study)和公告效应的讨论。
7. 常见数据偏差与“坑”
7.1 幸存者偏差(Survivorship Bias)
只使用当前仍在交易的资产(例如当前成分股),忽略已经退市/破产/剔除的历史资产,会导致:
- 对历史收益率估计过于乐观;
- 对风险估计偏低。
解决方向:
- 尽量使用当期成分和历史成分变更记录重构投资标的池;
- 保留已经退市或长期停牌的资产记录。
7.2 前视偏差(Look-ahead Bias)
在回测中不小心使用了未来才会可见的数据:
- 例如用财报公布日之后才知道的数据去构建公布日前的因子;
- 用当日收盘价构建需要在收盘前决策的信号。
避免方法:
- 明确每个数据字段的可用时间(timestamp of availability);
- 回测框架中强制按照“可见信息集”进行计算。
7.3 数据挖掘偏差(Data Snooping)
在同一份数据上尝试大量策略和参数组合,很容易找到“看起来性能很好”的策略,但这些表现很可能只是随机噪声。表现为:
- 样本内夏普极高;
- 样本外迅速失效。
缓解方法包括:
- 严格划分训练、验证、测试集;
- 使用交叉验证、滚动窗口等方法;
- 对策略数量和复杂度保持约束,并使用统计检验(如白检验、SPA 检验等)评估显著性(在本系列后续章节中会提到)。
在更形式化的框架里,White (2000) 提出的 Reality Check 和 Hansen (2005) 提出的 Superior Predictive Ability (SPA) 检验,都试图回答这样一个问题:在同时比较大量候选策略时,样本中表现最好的那个策略,其超额收益是否在统计上显著优于基准,而不是数据挖掘的产物。本系列在“计量方法”章节会给出这些方法更直观的介绍。
8. 自学手册:把原始数据整理成研究面板
8.1 学习目标
学完本章后,你应当能够:
- 区分市场数据、基本面数据、宏观数据和另类数据的用途;
- 说明为什么每个字段都需要记录“数据日期”和“可用日期”;
- 为一个股票多因子研究项目设计最小可用的数据字典;
- 判断缺失值、异常值、幸存者偏差和前视偏差会怎样污染回测;
- 把清洗规则写成可复查、可复现的研究记录。
8.2 研究场景
假设你加入一个股票量化团队,第一项任务是验证“盈利能力改善的股票未来一个月收益更高”。你拿到了日度价格、成交量、行业分类和季度财报数据。研究经理不会先问模型,而会先问:
- 每只股票在每个调仓日是否真实可交易?
- 当天使用的财报字段在当时是否已经披露?
- 缺失财报和停牌股票是被删除、填充,还是单独标记?
- 任何人能否用相同数据版本复现你的研究面板?
这就是本章的核心场景:在研究开始前,先构造一个可信的 asset-date 面板。
8.3 定义与工作流逻辑
| 步骤 | 关键问题 | 典型产出 |
|---|---|---|
| 1. 定义样本宇宙 | 哪些资产在每个日期属于可研究、可交易范围? | 历史股票池 |
| 2. 标准化原始字段 | 价格、成交量、财报字段的单位和口径是否一致? | 数据字典 |
| 3. 标记可用日期 | 信息什么时候真正进入 ? | as_of_date / available_date |
| 4. 清洗缺失与异常 | 缺失是否有业务含义?极端值是真实事件还是错误? | 清洗日志 |
| 5. 构造研究面板 | 收益、特征和宏观状态是否按同一时间轴对齐? | |
| 6. 做偏差审计 | 是否引入幸存者偏差、前视偏差或数据挖掘偏差? | 数据审计清单 |
一个实用原则是:凡是会影响交易决策的字段,都必须能回答“它在当时是否可见”。
8.4 迷你案例:季度 ROE 因子的可用日期
你要在每月末用最新 ROE 构建质量因子。某公司 2023Q4 财报的报告期结束日是 2023-12-31,但披露日是 2024-03-28。正确做法是:
- 在数据表中保留
period_end = 2023-12-31和available_date = 2024-03-28; - 2024-01-31 和 2024-02-29 调仓时不能使用该 ROE;
- 只有当调仓日不早于 2024-03-28,且交易系统在决策前已经收到数据时,才允许纳入 ;
- 若月末调仓发生在 2024-03-29,可使用该 ROE;若调仓发生在披露日前,则只能使用上一期已披露 ROE;
- 在研究记录中说明这一滞后规则,并在回测代码中统一执行。
按 available_date 重建当时可见财报
前两次调仓只能看到 2023Q3 的 12%;3 月 29 日才可使用 2023Q4 的 18%。若直接按 period 合并,前两个月会被未来信息污染。
8.5 常见错误与研究陷阱
- 用报告期替代可用日期:把 2023Q4 财报当作 2023-12-31 已知,会直接产生前视偏差。
- 只保留当前股票池:历史中退市、并购、长期停牌的股票消失,会抬高收益、压低风险。
- 过度填充缺失值:把长期缺失的财务指标用行业中位数填满,可能掩盖“披露质量差”这一风险信号。
- 把异常收益全删掉:极端值既可能是录入错误,也可能是真实危机事件。先标记、抽样核查,再决定处理方式。
- 清洗规则写在临时代码里:没有数据版本和清洗日志,后续因子失效时无法判断是策略问题还是数据问题。
8.6 自测题与答案提示
- 为什么财报数据要同时记录报告期结束日和实际披露日? 答案提示:报告期描述经济归属,披露日决定信息何时进入 ;两者混用会造成前视偏差。
- 如果某股票在样本期后半段退市,回测中应如何处理? 答案提示:应保留退市前历史和退市事件处理规则,不能因为当前不可交易就从历史样本中删除。
- 分位数去极值和删除极端值有什么区别? 答案提示:去极值保留样本但压缩尾部影响;删除会改变样本构成,若极端值具有系统性会引入选择偏差。
- 哪些迹象说明缺失值可能不是 MCAR? 答案提示:缺失集中在小市值、亏损、停牌或特定行业公司;缺失本身与风险和收益有关。
8.7 小结与过渡
数据章节的核心不是“把表填满”,而是建立一个能抵御偏差的研究面板:样本宇宙要按历史还原,字段要按可用日期对齐,清洗规则要可追溯。下一章会在这个面板之上构建因子与交易信号;如果数据地基不稳,后续任何 IC、分组收益和回测指标都会失去可信度。
下一章将基于清洗后的数据,介绍如何从原始数据中构建因子与交易信号,并进行初步有效性检验。