Quant

数据获取与预处理

构造 point-in-time 研究面板,审计价格、财务、另类数据的可用时点、版本和偏差。

数据获取与预处理

本章讨论量化策略的“地基”:数据。常说“Garbage in, garbage out”,如果数据本身质量不佳,后续再精巧的模型和策略也很难可靠。

在后续章节中,我们会频繁用到“标的–时间”二维结构的数据。为方便引用,这里先给出一个简单的记号约定:

0. 一个简单的数据记号体系

  • i=1,,Ni=1,\dots,N 表示资产(例如股票);
  • t=1,,Tt=1,\dots,T 表示离散时间(例如交易日,按照交易所日历排序);
  • Pi,tP_{i,t} 表示第 ii 只资产在日期 tt 的收盘价;
  • Ri,t+1R_{i,t+1} 表示从 ttt+1t+1 的简单收益率:Ri,t+1=Pi,t+1Pi,t+Di,t+1Pi,t,R_{i,t+1} = \frac{P_{i,t+1} - P_{i,t} + D_{i,t+1}}{P_{i,t}},
    其中 Di,t+1D_{i,t+1} 是期间分红(若无则为 0);
  • ri,t+1r_{i,t+1} 表示对应的对数收益率:ri,t+1=ln(1+Ri,t+1),r_{i,t+1} = \ln\big(1 + R_{i,t+1}\big),
    Ri,t+1|R_{i,t+1}| 较小的情况下有近似关系 ri,t+1Ri,t+1r_{i,t+1} \approx R_{i,t+1}
  • Xi,tX_{i,t} 表示第 ii 只资产在 tt 期的某个特征/因子(例如市盈率、动量等),通常通过原始数据计算得到;
  • ZtZ_t 表示与时间相关但与单个资产无关的宏观或市场状态变量(如市场收益、宏观指数等)。

从数据结构角度,可以把量化研究的数据视作一个“面板”(panel):

{(Ri,t+1,Xi,t,Zt)}i=1,,Nt=1,,T.\big\{(R_{i,t+1}, X_{i,t}, Z_t)\big\}_{i=1,\dots,N}^{t=1,\dots,T}.

在后续的因子检验和计量部分,我们会基于这一面板形式做横截面回归、面板回归等分析。

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. 数据清洗的核心目标

数据清洗的目标不是“修正所有问题”,而是:尽量减少系统性偏差和明显错误,使数据适合用来建模和回测。

典型工作包括:

  1. 识别并处理缺失值;
  2. 处理异常值和极端值;
  3. 时间对齐与重采样;
  4. 检查并避免常见偏差(幸存者偏差、前视偏差等)。

下面分别展开。

4. 缺失值处理

在表格化数据中,缺失值几乎是不可避免的,例如:

  • 某些财务指标在部分年份/季度未披露;
  • 某些股票在早期或停牌期间没有价格数据;
  • 新上市公司历史数据较少。

常见处理方式:

  1. 删除含缺失值的样本
    • 适用场景:缺失比例极小,且删除后不会改变样本结构;
    • 风险:如果缺失具有系统性(例如财务状况不佳的公司更易延迟披露),简单删除会引入偏差。
  2. 前值填充(Forward Fill)
    • 对时间序列数据常用:
      • xtx_t 缺失,则令 xt=xt1x_t = x_{t-1}
    • 适用:价格、持仓等连续性质较强的指标;
    • 不适用:变化突发、跳跃明显的指标(如一次性利润)。
  3. 插值(Interpolation)
    • 线性插值、样条插值等;
    • 在金融时间序列中需谨慎使用,避免制造不存在的中间状态
  4. 用分组统计量填充
    • 按行业、市值等分组,用组内均值或中位数替代缺失值;
    • 适合构建截面因子时保持横截面平衡,但会影响因子的真实分布。

在实际量化研究中,经常会结合多种方法:例如先判断缺失原因,对小比例随机缺失使用简单方法,对系统性缺失则单独建模或做样本剔除。

4.1 从缺失机制角度看缺失值

在统计学中(Rubin, 1976),常用以下三类机制刻画缺失数据:

  • 完全随机缺失(MCAR):缺失与观测值和未观测值都无关;
  • 条件随机缺失(MAR):在给定已观测变量的条件下,缺失与未观测值无关;
  • 非随机缺失(MNAR):缺失机制依赖于未观测的真实值本身。

在量化场景中,许多缺失并非 MCAR:

  • 财报延迟披露或不披露,往往与公司经营状况、风险状况有关,更接近 MNAR;
  • 某些市值/行业的股票更易长期停牌,价格和成交量缺失可能与流动性风险高度相关。

因此:

  • 对于占比极小、近似 MCAR 的缺失,简单删除或用组内统计量填充通常问题不大;
  • 对于明显具有结构性的缺失,更合理的做法是:
    • 将“可交易性/是否有数据”本身视作一个特征,显式纳入策略设计;
    • 或在样本划定时就剔除长期缺失和持续停牌的资产,并在文档中说明这一筛选规则。

5. 异常值与极端值处理

由于录入错误、拆分复权错误、交易异常等原因,数据中可能出现非常大的“尖刺”。

例如:

  • 某日价格被记录为 10000,而前后价格均在 10 左右;
  • 成交量突然比历史平均高出几百倍。

常见处理方法:

5.1 Winsorization(去极值)

对某个指标 xx,在横截面或时间序列上,将极端分位数缩回到阈值,例如:

  • 计算 1% 和 99% 分位数,记为 q1%,q99%q_{1\%}, q_{99\%}
  • 对所有样本: xi={q1%,xi<q1%q99%,xi>q99%xi,otherwisex'_i = \begin{cases} q_{1\%}, & x_i < q_{1\%} \\ q_{99\%}, & x_i > q_{99\%} \\ x_i, & \text{otherwise} \end{cases}

好处:

  • 降低极端数据对均值、方差等统计量的影响;
  • 对回归、协方差估计更加稳定。

5.2 标准差截断

  • 假设某变量近似服从正态分布,若 zi=xiμσ>k|z_i| = \left|\frac{x_i-\mu}{\sigma}\right| > k,则认为是异常值(典型 k=3k=344)。
  • 类似于 winsorization,也可以把超出部分缩回到边界,或直接标记为异常。

5.3 稳健统计视角与厚尾分布

大量实证研究表明,金融收益序列往往表现出:

  • 厚尾(heavy tails):极端收益出现的频率远高于正态分布预期;
  • 非对称性(skewness):收益分布呈显著偏度;
  • 波动聚集(volatility clustering):大波动往往伴随后续一段时间的大波动。

这意味着:

  • 依赖均值和方差的传统统计量在小样本和极端行情下并不稳健;
  • 实务中常配合稳健统计量(如中位数、分位数、MAD)和基于分位数的截断方法;
  • 在风险建模中,使用 t 分布、偏态 t 分布或其他厚尾分布来拟合收益的尾部行为会更合理(见 Cont, 2001;Tsay, 2010)。

5.3 业务规则与人工检查

  • 某些异常值可以通过业务知识直接判定:
    • 如某股票价格低于最小价格单位;
    • 某些日期为停牌状态,价格和成交量应为特定模式;
  • 对于关键策略往往需要配合人工抽样检查,以避免黑箱处理带来隐患。

6. 时间对齐与重采样

不同数据源的频率和时间戳可能不一致,例如:

  • 分钟级价格 vs 日度财务数据;
  • 不同市场的交易时间不同;
  • 宏观数据按月/季度更新。

处理思路:

  1. 统一时间频率
    • 将高频数据聚合到低频(例如:分钟 → 日度 OHLC);
    • 对日度数据,可按交易所日历对齐,处理非交易日(节假日)。
  2. 对齐不同来源的数据
    • 按“可获得时点”对齐,避免使用未来信息:
      • 财报数据往往在披露日之后才能使用;
      • 宏观数据公布有滞后。
  3. 考虑时区与夏令时问题
    • 对跨市场策略,需统一到 UTC 或某一标准时区。

从计量的角度看,避免前视偏差的关键在于明确信息集 Ft\mathcal{F}_t

  • Ft\mathcal{F}_t 表示在时刻 tt 决策前,研究者/投资者能够观察到的所有变量;
  • 任一在 tt 期使用的因子 Xi,tX_{i,t},都应当是 Ft\mathcal{F}_t 可测的,不能依赖于 tt 之后才会公布的信息。

对于存在公布滞后的数据(如财报、宏观数据等),常用做法包括:

  • 为每一条记录引入“可用日期” tavailt^{\text{avail}},在回测中只允许使用满足 tavailtt^{\text{avail}} \le t 的观测;
  • 或者引入固定滞后窗口,例如在 tt 期使用的是上一财年在 t1t-1 或更早已经披露的财务数据。

关于公告日和交易日错配的系统处理方式,可参考 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 学习目标

学完本章后,你应当能够:

  1. 区分市场数据、基本面数据、宏观数据和另类数据的用途;
  2. 说明为什么每个字段都需要记录“数据日期”和“可用日期”;
  3. 为一个股票多因子研究项目设计最小可用的数据字典;
  4. 判断缺失值、异常值、幸存者偏差和前视偏差会怎样污染回测;
  5. 把清洗规则写成可复查、可复现的研究记录。

8.2 研究场景

假设你加入一个股票量化团队,第一项任务是验证“盈利能力改善的股票未来一个月收益更高”。你拿到了日度价格、成交量、行业分类和季度财报数据。研究经理不会先问模型,而会先问:

  • 每只股票在每个调仓日是否真实可交易?
  • 当天使用的财报字段在当时是否已经披露?
  • 缺失财报和停牌股票是被删除、填充,还是单独标记?
  • 任何人能否用相同数据版本复现你的研究面板?

这就是本章的核心场景:在研究开始前,先构造一个可信的 asset-date 面板。

8.3 定义与工作流逻辑

步骤关键问题典型产出
1. 定义样本宇宙哪些资产在每个日期属于可研究、可交易范围?历史股票池 Ut\mathcal{U}_t
2. 标准化原始字段价格、成交量、财报字段的单位和口径是否一致?数据字典
3. 标记可用日期信息什么时候真正进入 Ft\mathcal{F}_tas_of_date / available_date
4. 清洗缺失与异常缺失是否有业务含义?极端值是真实事件还是错误?清洗日志
5. 构造研究面板收益、特征和宏观状态是否按同一时间轴对齐?{(Ri,t+1,Xi,t,Zt)}\{(R_{i,t+1},X_{i,t},Z_t)\}
6. 做偏差审计是否引入幸存者偏差、前视偏差或数据挖掘偏差?数据审计清单

一个实用原则是:凡是会影响交易决策的字段,都必须能回答“它在当时是否可见”。

8.4 迷你案例:季度 ROE 因子的可用日期

你要在每月末用最新 ROE 构建质量因子。某公司 2023Q4 财报的报告期结束日是 2023-12-31,但披露日是 2024-03-28。正确做法是:

  1. 在数据表中保留 period_end = 2023-12-31available_date = 2024-03-28
  2. 2024-01-31 和 2024-02-29 调仓时不能使用该 ROE;
  3. 只有当调仓日不早于 2024-03-28,且交易系统在决策前已经收到数据时,才允许纳入 Ft\mathcal{F}_t
  4. 若月末调仓发生在 2024-03-29,可使用该 ROE;若调仓发生在披露日前,则只能使用上一期已披露 ROE;
  5. 在研究记录中说明这一滞后规则,并在回测代码中统一执行。
Py

按 available_date 重建当时可见财报

Idle

前两次调仓只能看到 2023Q3 的 12%;3 月 29 日才可使用 2023Q4 的 18%。若直接按 period 合并,前两个月会被未来信息污染。

8.5 常见错误与研究陷阱

  • 用报告期替代可用日期:把 2023Q4 财报当作 2023-12-31 已知,会直接产生前视偏差。
  • 只保留当前股票池:历史中退市、并购、长期停牌的股票消失,会抬高收益、压低风险。
  • 过度填充缺失值:把长期缺失的财务指标用行业中位数填满,可能掩盖“披露质量差”这一风险信号。
  • 把异常收益全删掉:极端值既可能是录入错误,也可能是真实危机事件。先标记、抽样核查,再决定处理方式。
  • 清洗规则写在临时代码里:没有数据版本和清洗日志,后续因子失效时无法判断是策略问题还是数据问题。

8.6 自测题与答案提示

  1. 为什么财报数据要同时记录报告期结束日和实际披露日? 答案提示:报告期描述经济归属,披露日决定信息何时进入 Ft\mathcal{F}_t;两者混用会造成前视偏差。
  2. 如果某股票在样本期后半段退市,回测中应如何处理? 答案提示:应保留退市前历史和退市事件处理规则,不能因为当前不可交易就从历史样本中删除。
  3. 分位数去极值和删除极端值有什么区别? 答案提示:去极值保留样本但压缩尾部影响;删除会改变样本构成,若极端值具有系统性会引入选择偏差。
  4. 哪些迹象说明缺失值可能不是 MCAR? 答案提示:缺失集中在小市值、亏损、停牌或特定行业公司;缺失本身与风险和收益有关。

8.7 小结与过渡

数据章节的核心不是“把表填满”,而是建立一个能抵御偏差的研究面板:样本宇宙要按历史还原,字段要按可用日期对齐,清洗规则要可追溯。下一章会在这个面板之上构建因子与交易信号;如果数据地基不稳,后续任何 IC、分组收益和回测指标都会失去可信度。


下一章将基于清洗后的数据,介绍如何从原始数据中构建因子与交易信号,并进行初步有效性检验。

Copyright © 2026