3. 策略回测核心概念:回测目的、过拟合、前视偏差、幸存者偏差、回测与实盘差异
做高频策略回测,说白了就是一场「模拟考试」。你拿着历史数据当试卷,看看自己的策略能不能赚钱。但这里有个坑——很多人把回测当成了「开卷考试」,结果一到实盘就崩了。
我个人习惯把回测看作「风险探测器」,而不是「印钞机模拟器」。你想想看,如果回测曲线漂亮得像一条直线,那大概率是哪里出问题了。嗯,咱们今天就把回测里最核心的几个概念掰开揉碎了讲清楚。
3.1 回测的目的到底是什么?
很多人以为回测就是为了看「赚了多少」。其实不然。我做了这么多年回测,总结下来核心目的就三个:
- 验证逻辑有效性:你的策略逻辑在历史上是否站得住脚?比如「突破前高就买入」,历史上真的有效吗?
- 评估风险特征:最大回撤多少?夏普比率如何?极端行情下会不会爆仓?
- 发现隐藏问题:数据有没有坑?代码有没有bug?逻辑有没有漏洞?
核心观点:回测不是为了证明策略能赚钱,而是为了证明策略「还没发现致命问题」。
我在项目中遇到过一位朋友,他的回测年化收益300%,回撤不到5%。我当时就觉得不对劲。后来一查,他把手续费设成了0,还用了未来数据。嗯,这种回测,说白了就是自欺欺人。
3.2 过拟合:回测里的「死胡同」
过拟合是什么?我打个比方:你让一个学生背下所有考试题的答案,结果考试时题目稍微变一下,他就不会了。策略过拟合也是这个道理——它把历史数据里的「噪音」当成了「信号」。
为什么会过拟合?常见原因有:
- 参数太多:一个策略里塞了十几个参数,每个参数都去优化,最后拟合了历史数据里的随机波动
- 过度优化:反复调整参数,直到回测曲线完美,但实盘时这些参数就失效了
- 样本内测试:只用同一段数据来回测和优化,没有留出样本外数据做验证
避坑指南:我曾经见过一个策略,参数从1优化到100,每个参数都跑一遍,最后选了一个回测收益最高的。结果实盘第一周就亏了15%。这就是典型的过拟合——你把历史数据里的「运气」当成了「能力」。
怎么避免过拟合?我个人习惯用这几招:
- 留出样本外数据:比如用前80%的数据做优化,后20%的数据做验证
- 限制参数数量:一个策略的参数最好不超过3-5个
- 做蒙特卡洛模拟:随机打乱交易顺序,看看策略是否还能赚钱
- 跨品种验证:在螺纹钢上有效的策略,在铁矿石上是否也有效?
3.3 前视偏差:回测里的「时间旅行」
前视偏差,说白了就是「用未来的信息做今天的决策」。这在回测里是个非常隐蔽的坑。
举个例子:你在回测时用当天的收盘价作为买入信号,但实际交易中,你只能在收盘后才能知道收盘价。如果你在回测里用收盘价作为「盘中」的买入条件,那就是前视偏差。
常见的几种前视偏差:
| 类型 | 说明 | 例子 |
|---|---|---|
| 价格前视 | 用未来价格做当前决策 | 用当日收盘价作为盘中买入条件 |
| 数据前视 | 用未来数据做当前计算 | 用未来复权因子计算历史收益率 |
| 事件前视 | 用未来事件做当前判断 | 用财报发布后的数据做发布前的交易 |
小技巧:我建议在回测代码里加一个「时间戳检查」——确保每个交易信号只用到当前时刻之前的数据。你可以用shift函数把数据往后移一格,模拟「实时数据流」。
3.4 幸存者偏差:回测里的「幸存者游戏」
幸存者偏差,这个词最早来自二战时的飞机弹孔研究。简单说就是:你只看到了活下来的,没看到已经死掉的。
在期货回测里,幸存者偏差表现为:
- 只用了当前还在交易的合约:那些已经退市、交割的合约被忽略了
- 只用了主力合约:非主力合约的流动性问题被忽略了
- 只用了活跃品种:那些已经没人交易的品种被忽略了
你想想看,如果只回测那些「活下来」的合约,你的策略可能只是运气好——刚好选到了没被淘汰的品种。一旦遇到退市或流动性枯竭,策略就失效了。
核心观点:回测时一定要包含「已退市」的合约数据。虽然找这些数据很麻烦,但这是避免幸存者偏差的唯一办法。
我记得有一次,一个策略在回测里表现很好,但实盘时发现很多交易信号对应的合约已经退市了。嗯,这就是典型的幸存者偏差——回测时只用了「活着的」合约,实盘时才发现「死掉的」合约才是常态。
3.5 回测与实盘的差异:理想很丰满,现实很骨感
回测和实盘之间的差异,说白了就是「理想世界」和「现实世界」的差距。我总结下来,主要有这几个方面:
| 差异项 | 回测假设 | 实盘现实 |
|---|---|---|
| 成交价格 | 以收盘价或指定价成交 | 可能滑点、无法成交 |
| 交易成本 | 固定手续费 | 实际手续费可能更高,还有冲击成本 |
| 流动性 | 无限流动性 | 大单可能吃不完,小单可能买不到 |
| 延迟 | 零延迟 | 网络延迟、交易所延迟 |
| 数据质量 | 完美数据 | 可能有缺失、错误、延迟 |
怎么缩小这个差距?我个人习惯的做法是:
- 加滑点:回测时主动加1-2个tick的滑点,模拟实盘成交
- 加手续费:按实际手续费的两倍计算,留出安全边际
- 限制仓位:回测时限制单笔交易量,模拟流动性不足的情况
- 做压力测试:在极端行情下测试策略表现,比如2015年股灾、2020年原油暴跌
避坑指南:我曾经有一个策略,回测时年化收益50%,实盘时只有15%。后来一查,问题出在滑点上——回测时我假设以收盘价成交,但实盘时高频交易根本抢不到那个价格。从那以后,我回测时都会加至少2个tick的滑点。
3.6 知识体系总览
下面这张图,我把本章的核心概念串起来了。你可以把它当作回测的「检查清单」——每次做回测前,对照着看一遍,能帮你避开大部分坑。
这张图把五个核心概念串成了一个整体。你每次做回测时,可以对照着检查一遍:回测目的是否明确?有没有过拟合?有没有前视偏差?数据是否包含退市合约?实盘和回测的差距是否考虑到了?
嗯,把这些都检查一遍,你的回测结果才真正有参考价值。否则,你只是在「自嗨」而已。