4、数据基础设施:数据源类型(行情、财务、另类)、数据清洗、对齐、存储与版本管理

量化研究的第一步并非策略逻辑,而是数据。数据基础设施决定了研究的可信度、回测的有效性与实盘的一致性。本章围绕数据源类型、清洗方法、对齐机制、存储方案与版本管理五个核心环节展开,帮助学员建立一套可复用、可审计、可回溯的数据工程框架。

数据基础设施全景链路 数据源类型 行情数据 L1/L2/L3快照·Tick·分钟·日线 财务数据 三大报表·业绩预告·审计意见 另类数据 舆情·卫星·电商·供应链·ESG 参考/元数据 交易日历·成分股·复权因子 数据清洗与预处理 缺失值处理 前向填充·插值·剔除 异常值检测 MAD·分位数·价差逻辑 复权与单位统一 前复权·后复权·涨跌幅 去重与排序 时间戳·代码·来源去重 数据对齐与拼接 时间对齐(交易日/自然日/分钟) 标的对齐(代码映射/退市处理) 频率对齐(高频降频/低频升频) 存储与版本管理 Parquet/Arrow列式存储 HDF5/数据库分区 DVC/Delta Lake版本 数据字典与血缘

4.1 数据源类型:从行情到另类

核心原理:量化研究的数据源可划分为四大类,每类数据在投资决策中扮演不同角色。行情数据是价格发现的基础,财务数据提供基本面锚点,另类数据带来信息增量,参考数据则保证研究框架的完整性。

数据类别 典型字段 更新频率 主要用途 常见供应商
行情数据 OHLCV、买卖盘口、成交明细、复权因子 Tick/秒/分钟/日 策略信号计算、回测撮合、风险监控 Wind、聚宽、米筐、交易所直连
财务数据 资产负债表、利润表、现金流量表、业绩预告 季度/半年/年度 基本面因子、排雷、行业比较 Wind、Choice、CSMAR、巨潮资讯
另类数据 新闻舆情、卫星图像、电商销量、供应链关系 分钟/日/周 Alpha挖掘、事件驱动、风险预警 Refinitiv、RavenPack、第三方数据商
参考/元数据 交易日历、指数成分、行业分类、退市标记 日/不定期 样本筛选、基准构建、数据对齐 交易所官网、中证指数、Wind

操作流程:选择数据源时,建议按以下步骤评估:

  1. 覆盖度验证:检查历史起始时间、标的数量、字段完整性,尤其注意退市股票是否保留。
  2. 质量抽检:随机抽取10个标的、3个时间段,对比不同供应商的数据差异。
  3. 更新时效测试:记录数据落地延迟,判断是否满足策略调仓频率要求。
  4. 成本与授权确认:明确商业使用权限,避免研究合规风险。
经验提醒:另类数据并非越多越好。建议从“信息增量”角度评估——如果该数据与现有因子相关性超过0.8,则边际贡献有限。优先选择能解释独特风险维度的数据源。

4.2 数据清洗:从原始到可用

核心原理:原始数据通常存在缺失、异常、重复、单位不一致等问题。清洗的目标不是“完美”,而是“可分析”——在保留有效信息的同时,消除会扭曲统计结果的噪声。

关键清洗操作:

  • 缺失值处理:对于时间序列,优先使用前向填充(如停牌日价格沿用前值);对于财务数据,可使用行业均值或剔除处理。需记录缺失率,若超过30%则考虑剔除该字段。
  • 异常值检测:采用MAD(中位数偏差)方法,将偏离中位数超过3倍MAD的观测值标记为异常。对于行情数据,还需结合涨跌停限制、价格非负等业务逻辑校验。
  • 复权处理:因子计算通常使用前复权数据(保持最新价格不变),而回测撮合建议使用后复权或原始价格加复权因子,避免未来函数。
  • 去重与排序:按“代码+时间戳”去重,确保每个标的在每个时点只有一条记录。
# 清洗流程伪代码示例
def clean_market_data(df):
    # 1. 去重
    df = df.drop_duplicates(subset=['symbol', 'datetime'])
    # 2. 排序
    df = df.sort_values(['symbol', 'datetime'])
    # 3. 缺失值前向填充(按标的分组)
    df['close'] = df.groupby('symbol')['close'].ffill()
    # 4. 异常值检测(MAD方法)
    med = df['close'].median()
    mad = (df['close'] - med).abs().median()
    df['close'] = df['close'].mask((df['close'] - med).abs() > 3 * 1.4826 * mad)
    # 5. 业务逻辑校验
    df = df[(df['close'] > 0) & (df['volume'] >= 0)]
    return df
风险提示:前复权数据在新增除权事件时,历史价格会被整体调整,导致已保存的因子值失效。建议在数据库中同时保存“原始价格”和“复权因子”,按需动态计算。

4.3 数据对齐:时间、标的与频率

核心原理:多源数据必须对齐到统一的分析框架,否则会产生“未来函数”或“幸存者偏差”。对齐包含三个维度:时间对齐、标的对齐、频率对齐。

对齐操作流程:

  1. 时间对齐:以交易日历为基准,将非交易日数据剔除或前向填充。对于分钟数据,需明确时区(北京时间)和集合竞价时段处理规则。
  2. 标的对齐:建立统一的证券代码映射表(如Wind代码转ISIN),处理退市、更名、暂停上市等情况。回测时需使用“当时可得”的标的池,避免引入未来信息。
  3. 频率对齐:高频数据降频时,使用“最后价格”作为该周期收盘价,使用“成交量之和”作为周期总量;低频数据升频时,通常使用前向填充或插值,但需注意插值会引入平滑偏差。
实战场景:某多因子策略需要将日频财务数据与分钟行情数据结合。正确做法是:在T日收盘后,使用T-1日已披露的财务数据(避免使用当日财报,防止未来函数),与T日分钟数据对齐。若财报披露日为T日盘后,则最早在T+1日才能使用。

4.4 存储与版本管理:可回溯的数据资产

核心原理:数据存储需兼顾读写性能、压缩比与版本可追溯性。推荐使用列式存储格式(Parquet/Arrow)配合分层目录结构,同时引入数据版本控制工具(如DVC、Delta Lake)管理数据快照。

推荐存储架构:

层级 存储格式 更新策略 用途
原始层(Raw) Parquet + gzip压缩 追加写入,不可变 保留供应商原始数据,用于审计
清洗层(Clean) Parquet + Snappy压缩 每日全量覆盖 标准化后的数据,供因子计算
特征层(Feature) Parquet + 分区(按日期) 增量更新 因子值、标签,直接供模型读取

版本管理要点:

  • 数据快照:每次清洗逻辑变更时,生成新的数据版本,并记录清洗规则、代码版本、运行时间。
  • 血缘追踪:记录每个特征字段的来源表、清洗函数、参数,确保可回溯。
  • 回滚机制:当发现清洗逻辑错误时,可快速回滚到上一版本,避免重新全量计算。
实践建议:使用DVC(Data Version Control)管理数据目录,将数据版本与代码版本绑定。每次策略回测时,记录使用的数据版本号,确保实验结果可复现。

4.5 案例拆解:数据错误导致的策略失效复盘

背景:某中频Alpha策略在实盘运行3个月后,绩效显著低于回测。回测年化收益18%,实盘仅6%,且回撤加大。

排查过程:

  1. 初步检查:确认策略代码、参数与回测一致,排除逻辑变更。
  2. 数据对比:对比回测时使用的数据快照与实盘数据源,发现财务数据更新延迟——回测使用了“修正后”的财报数据,而实盘使用的是“初值”财报数据。
  3. 根因定位:财务数据供应商会在财报发布后数日内进行修正(如会计调整、数据录入错误修正)。回测时误用了修正后的数据,导致因子值虚高。
  4. 影响量化:约23%的因子值存在显著差异,其中盈利质量因子受影响最大。

解决方案:

  • 在数据清洗层增加“财报版本标记”,区分初值、修正值、终值。
  • 回测时强制使用“财报发布日可得版本”,模拟真实信息环境。
  • 建立数据质量监控看板,每日对比不同版本数据差异,超过阈值自动告警。

复盘经验:数据版本管理不仅是存储问题,更是策略逻辑的一部分。任何数据修正都可能影响因子有效性,必须建立“数据版本-策略版本”的联合追踪机制。

核心教训:永远不要假设数据是“最终版”。在数据基础设施中,将“数据版本”作为与“代码版本”同等重要的资产进行管理,是避免策略失效的关键防线。