2. 量化回测基础

在进入 LEAN 引擎的具体编码之前,必须先建立一套关于“回测到底是什么”的共识。回测不是预测未来的水晶球,而是一次受控的历史实验:你给定策略规则、给定历史数据、给定撮合假设,让引擎按时间顺序重放市场,最后得到一条资金曲线。它的价值不在于“赚了多少”,而在于能否证伪一个想法。本节围绕基本概念、常见术语、绩效指标、过拟合与未来函数四条主线展开,为后续在 LEAN 中写第一行策略代码打下判断基础。

一、核心原理:回测是一次带假设的重放

任何回测系统都由四个要素构成:数据、时钟、撮合、账本。数据提供每个时间点的价格与成交量;时钟决定“现在能看到什么”,是回测区别于静态统计的关键;撮合把信号翻译成成交价与成交量;账本记录现金、持仓与权益。四者缺一不可,而绝大多数回测错误都源于时钟与撮合被悄悄放宽。

回测的基本流程可以概括为:

  1. 确定标的池与时间区间,明确数据频率(日线、分钟、Tick)。
  2. 定义信号规则:入场、出场、仓位、止损止盈。
  3. 设定撮合假设:手续费、滑点、成交价(开盘/收盘/均价)、成交量上限。
  4. 按时间推进,逐根 K 线或逐个 Tick 更新指标、生成订单、撮合成交。
  5. 记录权益曲线与每笔交易,计算绩效指标。
  6. 做稳健性检验:参数敏感性、样本外、不同市场阶段。
回测的本质是“用历史数据检验规则”,而不是“用规则去拟合历史数据”。前者是科学实验,后者是曲线拟合。判断标准很简单:如果换一段没见过的数据,策略逻辑是否仍然成立?

二、常见术语与绩效指标

回测报告里会出现大量术语,初学者容易被“高收益”迷惑。下面这张清单覆盖了最需要先掌握的指标及其含义与陷阱。

指标含义常见陷阱
总收益 / 年化收益区间累计收益与折算到年度的收益短区间年化会被放大,需看区间长度
最大回撤(MDD)权益从峰值到谷底的最大跌幅只看幅度不看持续时间会低估痛苦
夏普比率单位波动带来的超额收益假设收益正态,对尾部风险不敏感
索提诺比率只惩罚下行波动的夏普变体样本少时不稳定
胜率盈利交易占比高胜率可能伴随极低盈亏比
盈亏比平均盈利 / 平均亏损需与胜率联合看期望值
换手率 / 交易次数交易频率与资金周转高频会放大手续费与滑点影响
Alpha / Beta超额收益与市场暴露Beta 高时收益可能只是市场上涨

期望值公式是理解胜率与盈亏比关系的钥匙:

期望值 = 胜率 × 平均盈利 − (1 − 胜率) × 平均亏损

例:胜率 40%,平均盈利 300,平均亏损 100
期望值 = 0.4 × 300 − 0.6 × 100 = 120 − 60 = 60(每笔正期望)

在 LEAN 中,回测结束后会输出统计报告,核心字段包括 TotalReturn、MaxDrawdown、SharpeRatio、WinRate、ProfitLossRatio 等。建议先看回撤与夏普,再看收益,最后看交易次数是否足够支撑统计显著性。

三、过拟合与未来函数:两个最致命的错误

过拟合指策略在历史数据上表现极好,但在新数据上迅速失效。典型症状是参数被调到小数点后多位、交易次数极少却收益极高、逻辑无法用一句话解释。过拟合的根源是在噪声上做优化。防范手段包括:保留样本外区间、做参数敏感性分析(参数微调不应导致绩效断崖)、限制参数数量、用滚动窗口验证。

未来函数指在决策时使用了当时还不可能知道的信息。它比过拟合更隐蔽,因为回测曲线会“漂亮得不真实”。常见形式有:用当日收盘价决定当日开盘买入、用整段数据的均值做标准化、用未来数据计算指标再回填。在 LEAN 中,OnData 每次只应访问当前及历史已到达的数据,任何对 Slice 未来值的引用都是危险信号。

一个快速自检:把策略信号在时间轴上整体后移一根 K 线,如果绩效大幅下降,说明原策略很可能偷看了未来。另一个自检:把回测区间切成前后两段,若前段极好、后段极差,需警惕过拟合。

四、案例与复盘:一次“完美策略”的崩塌

假设某策略在 2018–2020 年沪深 300 日线上回测,年化 45%,最大回撤 8%,夏普 2.8。看起来非常优秀。复盘时发现三个问题:

  • 信号使用了当日收盘价,但下单价也设为当日收盘价,属于典型未来函数。
  • 参数(均线周期、止损阈值)在 2018–2020 上反复优化,共尝试了 200 组组合。
  • 交易次数仅 18 次,统计上不足以支撑结论。

修正后:信号在收盘后生成,次日开盘成交;参数只保留 3 组并做敏感性检验;扩展到 2015–2023 年。结果年化降至 12%,最大回撤 22%,夏普 0.9。这个结果虽然不惊艳,但更接近真实可交易水平。这个案例说明:回测的第一目标不是好看,而是可信。

建议在 LEAN 项目中固定一套“回测检查清单”:数据是否含未来信息、成交价是否可实现、手续费与滑点是否合理、参数是否过多、样本外是否验证、交易次数是否足够。每次回测前过一遍,能避免大部分低级错误。

五、方法流程:从想法到可信回测

把上述内容整合为可执行流程:

  1. 提出假设:用一句话描述策略逻辑,例如“趋势跟随在中期动量上有效”。
  2. 数据准备:确认频率、复权方式、停牌与退市处理。
  3. 实现策略:在 LEAN 中只使用当前及历史数据,明确下单时点。
  4. 设定成本:手续费、滑点、最小变动价位、成交量限制。
  5. 样本内回测:观察绩效与交易明细,检查是否有异常成交。
  6. 样本外与滚动验证:用未参与调参的数据检验。
  7. 敏感性分析:参数小幅变动,绩效不应剧烈变化。
  8. 记录与复盘:保存配置、日志与结论,形成可复现实验。

在 LEAN 中,回测配置通常通过 config.json 或启动参数指定,例如:

{
  "algorithm-type-name": "MomentumStrategy",
  "start-date": "2018-01-01",
  "end-date": "2023-12-31",
  "cash-amount": 100000,
  "data-folder": "Data",
  "resolution": "Daily"
}

回测日志中应重点关注订单成交价与信号时点是否一致。若发现“信号在 10:00,成交价却是 09:30”,说明撮合假设与时钟不匹配,需要立即修正。

六、常见误区速查

  • 把回测收益当作未来收益预期。
  • 忽略手续费与滑点,尤其在高换手策略中。
  • 用全样本统计量做标准化,造成未来函数。
  • 参数越多越好,导致过拟合。
  • 只看总收益,不看回撤、夏普与交易次数。
  • 不做样本外验证,直接上线。

掌握这些基础后,后续在 LEAN 中编写策略时,你会更清楚每一个 API 调用背后对应的是“当时能看到什么”和“当时能成交什么”。这两点,决定了回测结果是否值得信任。