2. 回测基础

一、回测的定义与核心原理

回测(Backtesting)是指在历史市场数据上模拟一套交易策略的执行过程,以此评估该策略在过去一段时间内的收益、风险与稳定性。它的本质是“用已知的历史检验未知的逻辑”:策略规则先被固化,再逐笔喂入历史行情,最终得到一条模拟资金曲线和一组绩效指标。

回测的核心原理包含三个要素:策略规则的可执行化、历史数据的时序还原、成交与费用的合理假设。任何一环失真,回测结果都会偏离真实交易。尤其要注意,回测不是预测工具,它只能回答“如果过去这样交易,结果会怎样”,而不能保证未来重复。

回测的价值不在于找到“完美曲线”,而在于快速证伪:一个在历史中都无法稳定盈利的策略,通常不值得投入实盘。

二、回测的主要类型与适用场景

按照实现方式和严谨程度,回测可分为以下几类:

  • 向量化回测:用数组或矩阵一次性计算信号与收益,速度快,适合因子筛选和参数扫描,但难以精细模拟逐笔成交、滑点和仓位变化。
  • 事件驱动回测:按时间顺序逐条处理行情事件,模拟订单、成交、持仓和资金变化,贴近实盘,适合中高频和复杂订单逻辑。
  • 前向滚动回测(Walk-forward):将数据切分为多个训练段与验证段,滚动优化参数,能部分缓解过拟合,但计算成本高。
  • 蒙特卡洛回测:对交易序列或收益分布进行随机重排,评估策略在不同路径下的稳健性,常作为辅助验证。

选择类型时,应优先考虑策略频率与订单复杂度。日频选股可用向量化快速迭代;分钟级或涉及撤单、部分成交的策略,必须使用事件驱动框架。

三、常用工具与数据源

工具层面,Python 生态占据主流:Backtrader、vn.py、Zipline、VectorBT、Qlib 等各有侧重。Backtrader 事件驱动、文档完善,适合教学与中低频;VectorBT 向量化极快,适合大规模参数实验;vn.py 面向国内期货与实盘对接。数据源方面,常见选择包括:

数据源类型特点适用场景
Yahoo Finance免费覆盖广、延迟高、复权处理有限教学与初步验证
Tushare / AkShare免费/社区国内行情与基本面较全A股策略研究
Wind / 聚宽商业数据质量高、字段规范机构级研究
交易所 Level-2商业逐笔委托与成交,精度最高高频与微观结构

无论使用哪种数据源,都必须确认复权方式、时间戳时区、停牌与退市处理是否一致,否则回测与实盘会产生系统性偏差。

四、典型误区与复盘方法

回测中最常见的误区包括:

  1. 未来函数:使用了当时无法获得的信息,例如用收盘价决定当天开盘交易。
  2. 幸存者偏差:只使用当前仍上市的股票,忽略已退市标的,导致收益虚高。
  3. 过拟合:参数过多、反复调优,使策略只适应历史噪声。
  4. 忽略交易成本:未计入佣金、印花税、滑点和冲击成本,高频策略尤其致命。
  5. 流动性假设过强:假设任意数量都能按收盘价成交,实盘却无法成交或价格滑移。
若回测年化收益异常高、回撤极小、胜率接近完美,应首先怀疑数据或逻辑错误,而不是庆祝找到了“圣杯”。

复盘时建议按以下流程排查:先检查信号生成时点是否使用了未来数据;再核对成交价格与成交量是否合理;然后对比加入手续费与滑点前后的绩效差异;最后用样本外数据或滚动窗口验证策略稳定性。只有通过多重检验的策略,才具备进入实盘验证的资格。

# 示例:检查是否存在未来函数的简单思路
signal = data['close'].pct_change().shift(-1)  # 错误:使用了未来收益
signal = data['close'].pct_change().shift(1)   # 正确:信号基于已实现收益

回测基础打得越扎实,后续实盘一致性诊断才有可靠的参照系。理解定义、选对类型、用对工具与数据、避开常见误区,是每一位策略研究者必须跨过的第一道门槛。