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 滚动切分。若使用交叉验证,应采用扩展窗口或滚动窗口,避免未来数据泄露。
| 环节 | 常见问题 | 推荐做法 |
|---|---|---|
| 数据来源 | 幸存者偏差、复权错误 | 使用全样本含退市股,明确复权方式 |
| 缺失值 | 未来函数回填 | 前向填充+缺失标记,限制填充长度 |
| 异常值 | 直接删除真实极端值 | 先检测再决策,优先截断而非删除 |
| 时间对齐 | 财报按报告期对齐 | 按公告日+滞后天数对齐 |
| 样本划分 | 随机打乱导致泄露 | 按时间顺序切分,滚动验证 |
三、案例场景:多因子策略的数据清洗
假设你构建一个月度调仓的多因子选股策略,数据包括日行情、季度财报与分析师预期。清洗流程如下:
- 行情数据按交易日历对齐,停牌日标记并前向填充收盘价,但限制最多填充5个交易日。
- 财报数据按公告日对齐,若公告日为非交易日,顺延至下一交易日。
- 分析师预期数据按发布日对齐,避免使用修订后的最终值。
- 对因子值做去极值、标准化与中性化处理。
- 样本按时间切分:2018–2021训练,2022验证,2023–2024测试。
实操建议:在清洗管道中保留原始数据快照与清洗日志,每次回测都能复现相同的数据版本。推荐使用数据版本管理工具或带时间戳的中间层表。
四、误区与复盘
常见误区包括:用全样本统计量填充缺失值(引入未来信息)、对异常值一刀切删除(丢失真实风险事件)、随机划分时间序列(严重泄露)、忽略停牌与涨跌停导致的不可交易性。复盘时应检查:
- 每个特征在回测时点是否真实可得?
- 缺失值填充是否使用了未来数据?
- 异常值处理是否改变了收益分布的关键特征?
- 样本划分是否严格按时间顺序?
警告:若在回测中发现样本外表现异常优异,首先排查数据泄露,而非急于上线。数据清洗的每一个疏漏,都会在实盘中以亏损形式暴露。
数据准备与清洗是回测工程中最耗时但最值得投入的环节。建立标准化、可复现、可审计的清洗流程,才能让后续的模型回测与Outcome Analysis结果具备真正的决策参考价值。