2. 回测基础

在讨论幸存者偏差与 Point-in-Time(PIT)数据之前,必须先建立对“回测”本身的共同语言。很多策略失效并非因为模型不聪明,而是因为回测从一开始就问错了问题、用错了数据、读错了结果。本节把回测拆解为定义、类型、流程与误区四个层次,为后续 PIT 实战打下地基。

一、回测的定义:不是预测未来,而是检验规则

回测(Backtesting)是指把一套明确的交易规则,放到历史市场数据上模拟执行,从而评估其收益、风险和稳定性的过程。它的核心价值不在于“证明策略能赚钱”,而在于回答三个问题:

  • 规则是否可执行:信号是否明确、下单时点是否可落地、仓位与资金约束是否自洽。
  • 收益是否真实:在扣除交易成本、滑点和冲击成本后,是否仍有正期望。
  • 风险是否可控:最大回撤、波动率、尾部损失是否在可承受范围内。
回测的本质是“历史情景下的规则压力测试”,而不是“未来收益的证明”。任何回测结论都只是条件性证据:在给定数据、假设和执行模型下成立。

二、回测的类型:从向量化到事件驱动

不同研究阶段适合不同回测方式。常见类型可按“执行粒度”和“数据使用方式”划分:

类型 核心特征 适用场景 主要风险
向量化回测 用矩阵/数组一次性计算全期信号与收益 因子筛选、快速原型、横截面策略 易忽略交易成本、时序细节和路径依赖
事件驱动回测 按时间逐笔推进,模拟订单、成交与持仓 高频、日内、复杂订单逻辑 实现复杂、计算量大、易过拟合执行细节
组合回测 在多资产上同时分配资金并再平衡 资产配置、多因子组合 再平衡假设、权重漂移与容量问题
Walk-Forward 回测 滚动训练窗口 + 样本外测试窗口 参数稳定性检验、策略衰减分析 窗口选择敏感、计算成本高

选择类型时,应遵循“先粗后细”的原则:先用向量化快速排除明显无效的规则,再用事件驱动验证执行可行性,最后用 Walk-Forward 检验参数稳健性。

三、回测的标准流程:七步闭环

一个可复现的回测流程通常包含以下步骤:

  1. 定义假设:明确策略逻辑、标的池、调仓频率、持有周期和风控规则。
  2. 准备数据:获取价格、成交量、财务、成分股等数据,并做 PIT 对齐与缺失值处理。
  3. 生成信号:把假设转化为可计算的因子或规则,避免使用未来信息。
  4. 模拟执行:按时间推进,处理下单、成交、成本和仓位约束。
  5. 计算绩效:输出收益、回撤、夏普、换手率、胜率等指标。
  6. 稳健性检验:做参数敏感性、样本外测试、子区间分析和压力测试。
  7. 归因与复盘:拆解收益来源,识别偏差与失效条件,形成迭代结论。
# 一个最小回测循环的伪代码结构
for t in trading_days:
    data_t = get_pit_data(t)          # 只使用 t 时刻可见的数据
    signal = strategy(data_t)         # 生成信号
    orders = size_positions(signal)   # 仓位与风控
    fills = execute(orders, t+1)      # 下一期成交,避免前视
    portfolio.update(fills, costs)    # 更新持仓与成本
metrics = evaluate(portfolio)
流程中最容易被跳过的是第 2 步和第 6 步。数据对齐决定回测是否“干净”,稳健性检验决定结论是否“可信”。两者缺一,回测就只是曲线拟合。

四、常见误区:回测中最危险的五个陷阱

回测结果漂亮但实盘亏损,通常不是运气问题,而是以下误区在起作用:

  • 前视偏差(Look-ahead Bias):使用了当时尚不可得的数据,例如用年报发布前的财务数据、用当日收盘价决定当日开盘交易。
  • 幸存者偏差(Survivorship Bias):标的池只包含当前仍存续的股票,退市、被并购或破产的样本被系统性剔除。
  • 过拟合(Overfitting):反复调参直到历史曲线完美,导致样本外迅速失效。
  • 成本与容量忽视:忽略佣金、印花税、滑点、冲击成本,或假设无限流动性。
  • 数据窥探(Data Snooping):在同一份数据上尝试大量策略,只报告表现最好的一个。
最隐蔽的组合是“幸存者偏差 + 前视偏差”:标的池只含存活股票,财务数据又按最新修订值回填。两者叠加会让回测收益被系统性高估,且很难通过简单调参发现。

五、案例场景:同一策略的两种回测结果

假设某策略每月买入“过去 20 日涨幅前 10%”的股票。若使用当前成分股列表回测,年化收益可能显示 18%;但若使用历史 PIT 成分股,并剔除退市样本,年化可能降至 9%。差异主要来自:

  • 退市股票在下跌前往往曾进入涨幅榜,被幸存者偏差剔除后,亏损样本消失。
  • 财务因子若使用修订后数据,等于提前知道了未来修正,虚增了信号质量。
  • 未计入调仓成本时,高换手策略的收益被进一步高估。

这个案例说明:回测的差距往往不在模型,而在数据边界与执行假设。PIT 数据的作用,正是把“当时真正能看到的信息”还原到回测中。

六、复盘清单:提交回测前的自检

在把回测结果交给团队或用于实盘之前,建议逐项核对:

  1. 标的池是否按历史时点构建,是否包含退市与停牌样本?
  2. 所有因子是否只使用决策时点之前已发布的数据?
  3. 成交价格是否使用下一期可成交价,而非信号当日收盘价?
  4. 是否计入佣金、税费、滑点和最小交易单位?
  5. 参数是否在样本外或滚动窗口中验证过稳定性?
  6. 收益归因是否拆分了市场、行业、风格和选股贡献?
  7. 是否报告了最大回撤、换手率和容量约束下的表现?

回测基础打得越扎实,后续引入 PIT 数据和幸存者偏差修正时,越能看清哪些收益是真实的、哪些只是数据幻觉。把回测当作一门“证伪”的工程,而不是“证明”的表演,才是长期研究中最可靠的起点。