4. 数据准备与清洗

模型回测与Outcome Analysis的可信度,首先取决于输入数据的质量。无论策略模型多精巧,只要数据存在幸存者偏差、前视偏差、缺失值填充不当或时间轴错位,回测结果就会系统性失真。本章聚焦数据准备与清洗的五个关键环节:数据来源、缺失值处理、异常值检测、时间序列对齐与样本划分,帮助你在进入建模与回测之前,把数据地基打牢。

一、核心原理:数据质量决定回测上限

回测本质上是在历史数据上模拟决策过程。若数据本身包含未来信息,或样本区间划分不合理,模型在样本外表现会急剧衰减。数据清洗的目标不是让数据“好看”,而是让数据真实反映当时可获取的信息集。核心原则有三条:

  • 时点一致性:任何特征在时刻 t 的取值,只能使用 t 时刻及之前可获得的信息,避免前视偏差。
  • 可追溯性:每个清洗步骤都应记录来源、规则与影响范围,便于复盘与审计。
  • 分布稳定性:训练集、验证集与测试集的分布应尽量一致,避免因时间切分导致概念漂移被误判为模型失效。

关键认知:数据清洗不是一次性任务,而是与回测目标、模型类型、交易频率强耦合的工程决策。高频策略对时间戳精度要求到毫秒,而月度调仓策略更关注财报发布日与复权处理。

二、方法流程:从数据源到样本划分

1. 数据来源与采集

常见数据来源包括行情数据(OHLCV)、基本面数据、另类数据与宏观数据。采集时需关注:数据频率、复权方式、交易日历、停牌与退市处理。建议建立数据字典,明确每个字段的含义、单位与更新频率。

# 示例:数据源配置清单
data_sources:
  - name: equity_daily
    type: market
    frequency: 1d
    adjust: qfq          # 前复权
    fields: [open, high, low, close, volume, amount]
  - name: financial_report
    type: fundamental
    frequency: quarterly
    lag_days: 1          # 财报发布后次日可用

2. 缺失值处理

缺失值分为随机缺失与非随机缺失。随机缺失可用均值、中位数或插值填充;非随机缺失(如停牌、未披露)需结合业务逻辑处理,避免用未来数据回填。常用策略:

  • 删除:缺失比例过高且无业务含义的字段或样本。
  • 填充:前向填充(ffill)适用于状态型变量,但需限制最大填充长度。
  • 标记:新增缺失指示列,保留缺失信息供模型学习。

3. 异常值检测

异常值可能来自数据错误,也可能是真实极端事件。检测方法包括:3σ原则、IQR四分位距、MAD中位数绝对偏差、分位数截断。处理方式有截断(Winsorize)、替换、或保留但加入鲁棒模型。

import numpy as np
import pandas as pd

def detect_outliers_iqr(series, k=1.5):
    q1, q3 = series.quantile([0.25, 0.75])
    iqr = q3 - q1
    lower, upper = q1 - k * iqr, q3 + k * iqr
    return (series < lower) | (series > upper)

# 对收益率做Winsorize截断
returns = df['ret']
mask = detect_outliers_iqr(returns)
df['ret_clean'] = returns.clip(returns.quantile(0.01), returns.quantile(0.99))

4. 时间序列对齐

多源数据频率不同,需统一到同一时间轴。关键操作包括:重采样(resample)、前向填充、交易日历对齐、时区统一。特别注意财报数据需按“实际可获取日”对齐,而非报告期。

5. 样本划分

时间序列不能随机划分,必须按时间顺序切分。常见方案:训练集、验证集、测试集按 6:2:2 或 7:1.5:1.5 滚动切分。若使用交叉验证,应采用扩展窗口或滚动窗口,避免未来数据泄露。

环节 常见问题 推荐做法
数据来源 幸存者偏差、复权错误 使用全样本含退市股,明确复权方式
缺失值 未来函数回填 前向填充+缺失标记,限制填充长度
异常值 直接删除真实极端值 先检测再决策,优先截断而非删除
时间对齐 财报按报告期对齐 按公告日+滞后天数对齐
样本划分 随机打乱导致泄露 按时间顺序切分,滚动验证

三、案例场景:多因子策略的数据清洗

假设你构建一个月度调仓的多因子选股策略,数据包括日行情、季度财报与分析师预期。清洗流程如下:

  1. 行情数据按交易日历对齐,停牌日标记并前向填充收盘价,但限制最多填充5个交易日。
  2. 财报数据按公告日对齐,若公告日为非交易日,顺延至下一交易日。
  3. 分析师预期数据按发布日对齐,避免使用修订后的最终值。
  4. 对因子值做去极值、标准化与中性化处理。
  5. 样本按时间切分:2018–2021训练,2022验证,2023–2024测试。

实操建议:在清洗管道中保留原始数据快照与清洗日志,每次回测都能复现相同的数据版本。推荐使用数据版本管理工具或带时间戳的中间层表。

四、误区与复盘

常见误区包括:用全样本统计量填充缺失值(引入未来信息)、对异常值一刀切删除(丢失真实风险事件)、随机划分时间序列(严重泄露)、忽略停牌与涨跌停导致的不可交易性。复盘时应检查:

  • 每个特征在回测时点是否真实可得?
  • 缺失值填充是否使用了未来数据?
  • 异常值处理是否改变了收益分布的关键特征?
  • 样本划分是否严格按时间顺序?

警告:若在回测中发现样本外表现异常优异,首先排查数据泄露,而非急于上线。数据清洗的每一个疏漏,都会在实盘中以亏损形式暴露。

数据准备与清洗是回测工程中最耗时但最值得投入的环节。建立标准化、可复现、可审计的清洗流程,才能让后续的模型回测与Outcome Analysis结果具备真正的决策参考价值。