2. 回测基础
一、回测的定义与核心原理
回测(Backtesting)是指在历史市场数据上模拟一套交易策略的执行过程,以此评估该策略在过去一段时间内的收益、风险与稳定性。它的本质是“用已知的历史检验未知的逻辑”:策略规则先被固化,再逐笔喂入历史行情,最终得到一条模拟资金曲线和一组绩效指标。
回测的核心原理包含三个要素:策略规则的可执行化、历史数据的时序还原、成交与费用的合理假设。任何一环失真,回测结果都会偏离真实交易。尤其要注意,回测不是预测工具,它只能回答“如果过去这样交易,结果会怎样”,而不能保证未来重复。
回测的价值不在于找到“完美曲线”,而在于快速证伪:一个在历史中都无法稳定盈利的策略,通常不值得投入实盘。
二、回测的主要类型与适用场景
按照实现方式和严谨程度,回测可分为以下几类:
- 向量化回测:用数组或矩阵一次性计算信号与收益,速度快,适合因子筛选和参数扫描,但难以精细模拟逐笔成交、滑点和仓位变化。
- 事件驱动回测:按时间顺序逐条处理行情事件,模拟订单、成交、持仓和资金变化,贴近实盘,适合中高频和复杂订单逻辑。
- 前向滚动回测(Walk-forward):将数据切分为多个训练段与验证段,滚动优化参数,能部分缓解过拟合,但计算成本高。
- 蒙特卡洛回测:对交易序列或收益分布进行随机重排,评估策略在不同路径下的稳健性,常作为辅助验证。
选择类型时,应优先考虑策略频率与订单复杂度。日频选股可用向量化快速迭代;分钟级或涉及撤单、部分成交的策略,必须使用事件驱动框架。
三、常用工具与数据源
工具层面,Python 生态占据主流:Backtrader、vn.py、Zipline、VectorBT、Qlib 等各有侧重。Backtrader 事件驱动、文档完善,适合教学与中低频;VectorBT 向量化极快,适合大规模参数实验;vn.py 面向国内期货与实盘对接。数据源方面,常见选择包括:
| 数据源 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| Yahoo Finance | 免费 | 覆盖广、延迟高、复权处理有限 | 教学与初步验证 |
| Tushare / AkShare | 免费/社区 | 国内行情与基本面较全 | A股策略研究 |
| Wind / 聚宽 | 商业 | 数据质量高、字段规范 | 机构级研究 |
| 交易所 Level-2 | 商业 | 逐笔委托与成交,精度最高 | 高频与微观结构 |
无论使用哪种数据源,都必须确认复权方式、时间戳时区、停牌与退市处理是否一致,否则回测与实盘会产生系统性偏差。
四、典型误区与复盘方法
回测中最常见的误区包括:
- 未来函数:使用了当时无法获得的信息,例如用收盘价决定当天开盘交易。
- 幸存者偏差:只使用当前仍上市的股票,忽略已退市标的,导致收益虚高。
- 过拟合:参数过多、反复调优,使策略只适应历史噪声。
- 忽略交易成本:未计入佣金、印花税、滑点和冲击成本,高频策略尤其致命。
- 流动性假设过强:假设任意数量都能按收盘价成交,实盘却无法成交或价格滑移。
若回测年化收益异常高、回撤极小、胜率接近完美,应首先怀疑数据或逻辑错误,而不是庆祝找到了“圣杯”。
复盘时建议按以下流程排查:先检查信号生成时点是否使用了未来数据;再核对成交价格与成交量是否合理;然后对比加入手续费与滑点前后的绩效差异;最后用样本外数据或滚动窗口验证策略稳定性。只有通过多重检验的策略,才具备进入实盘验证的资格。
# 示例:检查是否存在未来函数的简单思路
signal = data['close'].pct_change().shift(-1) # 错误:使用了未来收益
signal = data['close'].pct_change().shift(1) # 正确:信号基于已实现收益
回测基础打得越扎实,后续实盘一致性诊断才有可靠的参照系。理解定义、选对类型、用对工具与数据、避开常见误区,是每一位策略研究者必须跨过的第一道门槛。