跳转至

第68章 回测系统架构与仿真逼真度

补充章节:Backtesting Architecture & Simulation Realism(原书出版后的市场发展)

在第22章中,Harris 讨论了绩效评估。在第64章中,我们讨论了数据工程。连接这两者的桥梁是回测(Backtesting)

回测是量化交易的"风洞试验"。然而,量化圈有一句名言:"所有的回测都是赚钱的,否则你就不会看到它了。" (All backtests look good, or you wouldn't be looking at them.)

本章将深入探讨回测系统的架构设计(向量化 vs 事件驱动),并揭示导致回测失真(Overfitting/Artifacts)的七宗罪。这对于 Guild 的 Speculum 项目(基于 NautilusTrader)具有直接的指导意义。

68.1 架构之争:向量化 vs 事件驱动

68.1.1 向量化回测(Vectorized Backtesting)

  • 代表工具:Pandas, Polars, VectorBT。
  • 原理:将价格数据视为矩阵,一次性计算所有时间点的信号。
    signals = close > moving_average  # 一行代码计算 10 年信号
    returns = signals.shift(1) * pct_change
    
  • 优势:极快。10 年数据几秒钟跑完。适合早期的想法验证(Idea Generation)
  • 致命缺陷
    • 无法模拟路径依赖:很难处理"如果止损触发了,后面的信号就不执行"这种逻辑。
    • 偷价(Look-ahead Bias):极易在计算 close 时用到未来的数据(如 shift(-1))。

68.1.2 事件驱动回测(Event-Driven Backtesting)

  • 代表工具:NautilusTrader, Zipline, Lean (QuantConnect)。
  • 原理:模拟一个时间轴,按顺序重放每一个 Tick 或 Bar。策略代码只看到当前时刻的数据。
    def on_tick(self, tick):
        if tick.price > self.ma:
            self.buy()
    
  • 优势
    • 零偷价:严格的时间隔离。
    • 逼真:可以模拟延迟、滑点、订单队列、部分成交。
  • 劣势:慢。循环处理每一条数据,Python 的 for 循环是瓶颈(这也是为什么 NautilusTrader 用 Rust 编写核心的原因)。

Guild 建议Philosophers-Stone 使用向量化做初步筛选,Speculum 必须使用事件驱动做最终验证。

68.2 回测的七宗罪(The 7 Sins of Backtesting)

1. 前视偏差(Look-ahead Bias)

在决策时用到了未来才能知道的数据。 * 例子:用当天的 Close 价格计算信号,然后假设自己能在当天的 Open 买入。 * 防御:在事件驱动引擎中,强制延迟一个 Bar 执行。

2. 幸存者偏差(Survivorship Bias)

只回测了现在还活着的股票,忽略了退市的股票。 * 例子:回测"低价股策略",却没包含那些跌到退市的公司。 * 防御:使用包含退市股票的无偏数据集(Delisted Data)。

3. 过拟合(Overfitting)

参数调优过度,记住了历史噪音。 * 特征:参数 (10, 20) 赚钱,(11, 21) 亏钱。 * 防御:参数高原(Parameter Plateau)检验。只有在参数附近的一片区域都盈利,策略才稳健。

4. 市场冲击忽视(Market Impact Ignorance)

假设自己的买单不会推高价格。 * 现实:如果你买入量超过当根 Bar 成交量的 1%,价格肯定会涨。 * 防御:引入冲击模型(如平方根法则),惩罚大额交易的执行价格。

5. 无法成交的流动性(Phantom Liquidity)

在回测中,假设只要价格到了就能成交。 * 现实:在极端行情(如闪崩)中,价格虽然到了,但订单簿是空的,或者你排在队列最后面。 * 防御成交量过滤器(Volume Filter)。每根 Bar 最多允许成交该 Bar 总量的 10%。

6. 交易成本低估(Underestimating Costs)

忽略了佣金、印花税、滑点、借币利息、数据费、服务器费。 * 现实:高频策略的利润通常只有 0.5 bps,而成本可能有 0.3 bps。忽略成本会把亏损策略测成暴利。

7. 信号衰减(Signal Decay)

假设 2010 年的规律在 2024 年还适用。 * 防御滚动回测(Walk-Forward Analysis)。用 2010-2012 训练,测 2013;用 2011-2013 训练,测 2014。

68.3 仿真逼真度:模拟撮合引擎

对于 HFT 和做市策略,普通的回测是不够的。你需要模拟交易所撮合引擎(Matching Engine Simulator)

68.3.1 订单队列模拟(Queue Position)

在限价单簿(LOB)中,遵循"价格优先,时间优先"。 * 模拟:当你挂单时,记录当前队列的长度 \(Q_{ahead}\)。只有当市场上成交了 \(Q_{ahead}\) 数量的单子后,你的单子才算成交。

68.3.2 延迟模拟(Latency Simulation)

策略发出信号 \(t_0\),订单到达交易所 \(t_1\),交易所确认 \(t_2\)。 * 模拟:在回测中引入随机延迟 \(\delta \sim \text{Exp}(\lambda)\)。如果在这 \(\delta\) 时间内价格变了,你的市价单可能会滑点,限价单可能会无法成交。

主要参考资料

  1. Advances in Financial Machine Learning (Marcos Lopez de Prado, 2018) — 系统批判传统回测偏差,提出组合净效应(Combinatorial Purged CV)等改进方法,是回测方法论的重要参考
  2. Systematic Trading (Rob Carver, 2015) — 面向实践者的量化交易体系,包括回测框架、规则设计与风险管理的完整流程
  3. Backtesting (Wojciech Bury, 2022) — 专注于回测方法的学术综述,涵盖各类偏差的数学定义与检测方法
  4. The Evaluation and Optimization of Trading Strategies (Robert Pardo, 2008) — Walk-Forward Analysis 方法的权威来源,是样本外验证的标准参考
  5. NautilusTrader Documentation (Nautech Systems) — 事件驱动回测引擎的官方技术文档,理解仿真逼真度实现细节的直接参考