2. 回测基础与数据角色
在量化策略研发中,回测是把“想法”转化为“可验证结论”的第一道工程化关口。很多团队把回测当成一段脚本:读数据、算信号、统计收益。但真正决定回测结论是否可信的,往往不是策略逻辑本身,而是数据在时间轴上的角色与质量。本章聚焦回测流程、数据源类型,以及数据质量如何系统性地影响策略评估。
一、核心原理:回测是一条“时间对齐的因果链”
回测的本质,是在历史时间轴上模拟“当时可知的信息 → 决策 → 成交 → 盈亏”的因果链。任何一环出现时间错位,回测就会从“验证”变成“自我欺骗”。因此,回测的第一原则不是收益最大化,而是信息可见性与时间对齐:在时刻 t 做出的决策,只能使用 t 时刻及之前已经可获得的数据。
这条因果链通常包含五个环节:
- 数据获取:确定标的、频率、字段与时间范围。
- 数据清洗与对齐:处理缺失、复权、时区、交易日历与停牌。
- 信号生成:基于对齐后的数据计算因子或规则。
- 组合与成交模拟:考虑仓位、手续费、滑点、涨跌停与流动性。
- 绩效评估:计算收益、回撤、换手、容量与稳健性。
其中,第 1、2 步是数据角色最集中的地方。数据不是“背景材料”,而是回测系统的时间基准与约束条件。数据源类型不同,时间语义不同;数据质量不同,评估结论的偏差方向也不同。
二、方法流程:从数据源到回测结论的标准化路径
为了让回测可复现、可审计,建议把流程固化为以下步骤,并在每一步记录数据版本与时间戳。
步骤 1:定义回测目标与约束
- 标的池、频率、回测区间、基准、成本模型
步骤 2:选择数据源并确认时间语义
- 行情数据:交易所、供应商、复权方式、时区
- 基本面数据:报告期、公告日、修正日
- 另类数据:采集时间、发布延迟、覆盖范围
步骤 3:数据清洗与时间对齐
- 统一交易日历、去重、缺失填充、复权处理
- 生成 point-in-time(PIT)快照
步骤 4:信号与组合构建
- 严格使用 t 时刻可见数据
- 记录信号生成时间与调仓时间
步骤 5:成交与成本模拟
- 滑点、手续费、冲击成本、涨跌停约束
步骤 6:绩效评估与归因
- 收益、回撤、夏普、换手、容量、敏感性分析
步骤 7:数据版本归档与复盘
- 保存数据快照、参数、日志,支持重跑
这套流程的关键在于第 2、3 步:数据源的时间语义必须显式声明。例如,财报数据如果只记录“报告期”,而不记录“公告日”,就会在回测中提前使用未来信息,形成典型的前视偏差。
三、数据源类型与时间语义对照
不同数据源在回测中的角色差异很大。下表给出常见数据源类型及其时间对齐要点,可作为数据接入时的检查清单。
| 数据源类型 | 典型字段 | 时间语义关键点 | 常见偏差风险 |
|---|---|---|---|
| 行情数据 | 开高低收、成交量、成交额 | 交易日历、时区、复权方式 | 复权未来函数、停牌处理不当 |
| 基本面数据 | 营收、利润、ROE、负债 | 报告期 vs 公告日 vs 修正日 | 前视偏差、幸存者偏差 |
| 分析师数据 | 评级、目标价、盈利预测 | 发布时间、快照时间 | 使用最新汇总值回填历史 |
| 另类数据 | 舆情、卫星、消费、招聘 | 采集时间、发布延迟、覆盖率 | 时间戳缺失、样本选择偏差 |
| 指数与基准 | 指数点位、成分股、权重 | 成分调整日、权重生效日 | 用当前成分回测历史 |
四、案例/场景:一个前视偏差如何放大收益
假设某策略使用“净利润同比增长率”选股,每月调仓。数据表中只有“报告期”字段,没有“公告日”。回测代码直接按报告期对齐到月初,结果在 1 月初就使用了 12 月 31 日的年报数据。实际上,年报公告通常在次年 3 至 4 月。这相当于提前 2 至 3 个月知道业绩,回测收益会被显著高估。
修正方法是引入 PIT 数据:每条财务记录同时保存报告期与公告日,回测时只使用公告日小于等于当前调仓日的最新记录。修正后,策略收益往往下降,但结论更接近实盘。
# 错误做法:按报告期直接对齐
df['signal_date'] = df['report_period']
# 正确做法:按公告日做 PIT 对齐
df = df.sort_values('announce_date')
pit = df[df['announce_date'] <= current_date].groupby('symbol').last()
另一个常见场景是复权处理。若使用“后复权”价格计算历史信号,但用“不复权”价格模拟成交,会导致买卖价格与信号价格不一致,产生虚假收益。正确做法是:信号与成交使用同一套价格体系,并在日志中记录复权因子版本。
五、误区与复盘:数据质量如何系统性影响评估
数据质量对策略评估的影响不是随机的,而是有方向性的。以下误区在实战中反复出现:
- 幸存者偏差:只使用当前仍存续的标的回测,退市、并购标的被剔除,收益被高估。
- 前视偏差:使用未来才发布的数据,或使用最新修正后的历史数据。
- 时间戳缺失:另类数据没有采集时间,无法判断当时是否可见。
- 复权不一致:信号、成交、基准使用不同复权方式。
- 停牌与涨跌停处理不当:在无法成交的价位成交,虚增收益。
- 数据版本漂移:供应商修正历史数据后,回测结果无法复现。
复盘时,建议把回测结论分为三层:数据层结论(数据是否支持该策略)、逻辑层结论(信号是否有经济含义)、执行层结论(成本与容量是否可接受)。只有三层都通过,策略才进入下一阶段。数据层不通过时,任何收益曲线都只是数字幻觉。
总结来看,回测流程是时间对齐的因果链,数据源类型决定时间语义,数据质量决定评估偏差的方向与幅度。把数据角色前置到回测设计的第一位,才能让后续的因子挖掘、组合优化与实盘执行建立在可信基础之上。