2. 回测基础回顾
在进入成交撮合、交易成本与公司行动的仿真实战之前,有必要把回测的“地基”重新夯实一遍。很多看似复杂的回测偏差,其实都源于对基础流程、数据频率、信号生成和绩效评估的理解不够精确。本节将回测拆解为可检查的工程环节,帮助你建立一套可复用的回测心智模型。
一、核心原理:回测是一条时间对齐的流水线
回测的本质,是在历史时间轴上模拟“信息 → 决策 → 执行 → 结算 → 评估”的闭环。它的核心约束只有一条:任何时刻只能使用该时刻之前已知的信息。违反这条约束,回测结果就会失真。
一条标准的回测流水线包含五个阶段:
- 数据准备:行情、财务、分红送转、停复牌、指数成分等,按时间戳对齐。
- 信号生成:基于历史窗口计算因子或规则,输出目标仓位或买卖方向。
- 组合构建:将信号转换为权重,处理约束(行业中性、个股权重上限、现金比例)。
- 执行与成本:按撮合规则成交,扣除佣金、印花税、滑点、冲击成本。
- 绩效评估:计算收益、风险、换手、归因,并与基准比较。
关键原则:信号的时间戳决定“何时可知”,成交的时间戳决定“何时可交易”。两者之间必须留出合理的执行延迟,否则会引入前视偏差。
二、方法流程:数据频率与信号生成的匹配
数据频率不是越高越好,而是要与策略逻辑、交易成本和执行能力匹配。低频策略用高频数据回测,往往只是增加了噪声和计算量;高频策略用低频数据回测,则会丢失关键的成交机会。
| 频率 | 典型数据 | 适用策略 | 主要风险 |
|---|---|---|---|
| 日频 | 日线 OHLCV、每日财务快照 | 中低频选股、趋势跟踪 | 开盘/收盘价选择影响大,滑点估计粗糙 |
| 分钟频 | 1/5/15 分钟 K 线、盘口快照 | 日内择时、短周期反转 | 数据量大,撮合假设敏感,成本占比高 |
| Tick 级 | 逐笔成交、委托队列 | 做市、高频套利 | 对延迟和队列建模要求极高,回测易过拟合 |
| 事件驱动 | 财报、公告、分红、停复牌 | 事件套利、基本面量化 | 事件时间戳对齐困难,易引入未来信息 |
信号生成阶段最常见的错误,是把“计算窗口”和“交易窗口”混为一谈。例如用当日收盘价计算因子,却在当日开盘成交,这就是典型的前视偏差。正确的做法是:因子在 T 日收盘后可知,最早在 T+1 日开盘或收盘执行。
# 错误示例:用当日收盘因子在当日开盘交易
signal = close.pct_change(20) # T 日收盘后才知道
trade_price = open # T 日开盘价,时间倒流
# 正确示例:信号滞后一个周期
signal = close.pct_change(20).shift(1) # T-1 日收盘可知
trade_price = open # T 日开盘执行
三、绩效评估:别只看年化收益
绩效评估指标需要覆盖收益、风险、成本和稳定性四个维度。单一指标极易被操纵或误读,例如高年化收益可能来自极高的换手和杠杆。
- 收益类:累计收益、年化收益、超额收益(相对基准)。
- 风险类:年化波动率、最大回撤、下行波动率、VaR。
- 风险调整类:夏普比率、索提诺比率、卡玛比率(年化收益/最大回撤)。
- 交易类:换手率、持仓集中度、胜率、盈亏比。
- 稳定性类:滚动夏普、分年度收益、回撤恢复时间。
实用建议:在回测报告中同时展示“扣费前”和“扣费后”的绩效。如果扣费后收益大幅缩水,说明策略对交易成本极度敏感,实盘很难复制。
四、常见回测陷阱与复盘清单
回测陷阱大多不是代码 bug,而是认知偏差在工程中的体现。以下清单可作为每次回测上线前的自检项:
- 前视偏差:是否使用了未来才可知的数据?财务数据是否按公告日而非报告期对齐?
- 幸存者偏差:股票池是否只包含当前仍在上市的股票?退市、ST 是否被剔除?
- 复权处理:是否混用了前复权与后复权价格?分红送转是否在正确日期调整?
- 成交假设:是否假设以收盘价无限量成交?涨跌停、停牌是否被忽略?
- 成本低估:佣金、印花税、滑点、冲击成本是否全部计入?
- 过拟合:参数是否在样本内反复调优?是否做了样本外和滚动窗口验证?
- 数据质量:缺失值、异常值、时间戳错位是否被清洗?
高频陷阱:用日线数据回测日内策略,或用不复权价格计算收益率,都会让回测结果严重偏离实盘。公司行动(分红、送转、拆股)若未正确处理,会在除权日产生虚假的巨额收益或亏损。
把上述流程和清单固化到回测框架中,你就能在进入成交撮合与成本仿真时,把精力集中在真正影响实盘表现的细节上,而不是反复修补基础性偏差。回测的可信度,永远取决于最薄弱的那一环。