Skip to content

你的回测曲线越漂亮,我越替你担心:因为历史顺序,正在“倒着”给你讲故事

作 者:老余捞鱼

原创不易,转载请标明出处及原作者。

文中示例仅用于技术讨论,不构成任何操作建议。
量化策略开发应以学习和技术交流为目的。
本号不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。

本文约 2900 字 | 预计阅读 5-8 分钟,后有代码下载,建议先收藏。

· · ·

搞过量化策略的人,八成都有过这种体验:随便写个规则,参数用默认的,回测曲线蹭蹭往上蹿。盯着屏幕那一刻,你会觉得这东西肯定能赚钱。

但热血上头之后,总会冷不丁冒出一个问题:这笔收益,到底是策略真有本事,还是纯粹走了狗屎运?说白了,就是行情恰好顺着你的策略走了一遍。换个顺序,可能就完全不是那么回事了。

今天这篇就拿这个说事。我自己先弄了个最简单的RSI策略,拿微软股票的数据从1990年跑到2026年,回测数字看着挺唬人。然后我做了一件大家都知道该做、但十个里有九个会偷懒的事:蒙特卡罗模拟。

结果一出来,原来那点底气全没了。我们继续往下看。

一、设计个简单策略

整条策略,就两条规则。

什么时候买?今天RSI比五天前低,就买。为啥?RSI往下掉,说明势头在弱,按理说应该做空,但我不,我做多,赌它反转。

什么时候卖?RSI从30以下弹上来,穿过超卖线,就走。昨天还在30以下趴着,今天上来了,说明超卖修复了,反弹可能真要来了。

然后,没了。没有趋势过滤,不看波动率,成交量也不管。就这两条。

回测我用vectorbt跑的,特地往前挪了一根K线,免得被”未来数据”忽悠。手续费算0.1%,滑点加0.2%,本金10万美金。标的就一个,微软。

这种策略,但凡会写点Python的人,二十分钟就能搭出来。也正因为简单,才更该往死里测。复杂的策略你会花好几天调参数,反倒警惕。最简单的,回测曲线一拉,你就信了,这才是最危险的事。

二、第一次回测

Walk-forward优化跑完1990到2026年,数据扔出来,每个指标都挑不出刺:

  • 总回报:172415.7%,同期 buy and hold 基准 102435.1%
  • 夏普比率:1.006
  • 索提诺比率:1.539
  • 胜率:51.2%,128 笔交易
  • 盈利因子:2.348
  • 单笔期望值:$1406.51
  • 最大回撤:56.19%

跑赢 buy and hold 近 70 个百分点,夏普过了 1.0,盈利因子 2.3。任何一个角度看都是”好策略”的牌面。

▲ Walk-forward 优化仪表盘:年化收益能看,但回撤期长得让人怀疑人生。

可上面这张水下回撤图一拉出来,滤镜全碎了。

红线几乎整段整段地趴在-10%以下,几十年里有大半时间在亏钱坑里泡着。2008年附近最深跌到-55%。赚钱是赚钱了,但你得扛着腰斩以上的回撤,在水下憋十几年。回撤幅度加时间跨度,那种心理消耗,总回报数字根本说不出来。

更扎心的在后面。逐年拆开看:

1991年,这策略赚了121%,夏普2.58。第二年,1992年,只剩6.77%,夏普0.43。到了2000年,同一个策略、同一套逻辑,只是参数微调:直接亏了39%,夏普-1.06。

同一只微软,同一条RSI规则,放不同年份,判若两样。

这一高一低的节奏本身就说明问题了。36年的回测,只是一条具体的、单向的历史路径:哪年牛市、哪年熊市,顺序是固定的,反转什么时候来,也是固定的。

那172415%的回报里,到底多少是策略真有本事,多少只是因为你恰好站在了微软这条船上,风还刚好往你这边吹?

三、第二次回测

蒙特卡罗做的事其实很朴素,但很要命。

它换了个问题来问这个策略:我不看历史上实际发生了什么,我就问你:如果这128笔交易的盈亏顺序被打乱,你的表现会怎么分布?

具体操作很简单:把128笔交易的实际盈亏序列拿出来,随机重排一千次,每次跑一条新的资金曲线。

如果策略真的有统计优势,这一千条曲线应当大差不差。如果优势全靠在某一段行情上“吃了顿好的”,那这一千条曲线会原形毕露。

跑完之后,结果把单次回测的那个数字收在了一个区间里:

指标5%分位(最差)50%分位(中位)95%分位(最好)
总回报11760%158775%2619293%
最大回撤-71.56%-52.68%-40.62%
夏普比率0.590.831.07

▲ 回报、回撤、夏普:三条分布直方图,中位数是真实预期

跑完蒙特卡罗,三件事让我印象很深。

第一刀:夏普虚高,中位数夏普是0.83,不是单次回测的那个1.006。 

也就是说,你预期这个策略能拿到1.0的夏普,但更可能拿到的是0.83。0.83当然不差,正期望,能用。但问题是,单次回测给你的那个数,不是“承诺”,只是“一次抽签的结果”。你恰好抽到了一张好签,而不是这个策略真的值1.0。

第二刀:腰斩躲不掉,回撤的中位数在52%-55%之间。 

这不是“运气不好才碰到的”,是大概率要经历的。也就是说,用这个策略,你有一半以上的概率要面对账户腰斩。单次回测其实已经显示过56%的最大回撤,但看到表格里的一个数字,和看到直方图上密密麻麻的柱子全挤在-50%附近,那个视觉冲击力,完全两个级别。

第三刀:运气差200倍,分布的尾巴跨度大到离谱。 

表现最差的那5%,总回报只有11760%。表现最好的那5%,2619293%。差了200多倍。

同一个策略,同一套规则,只是交易顺序换了一下,结果从“勉强保本”到“财务自由”,跨度差了两个数量级。

这三点放在一起,结论已经很明显了:单次回测那个漂亮的数字,不是策略的“真实水平”,只是它在某一条特定历史路径上的“表现”。换一条路,结局可能完全不一样。

四、直方图比单个数值得看

输出的表格里的数字看再多,不如这三张蒙特卡罗直方图来得直接。

第一张,收益分布。左边密密麻麻堆了一大片,右边拖了一条细长的尾巴。形状说明白了一件事:你大概率拿到的回报远低于那个漂亮的172415%,只有极少数幸运的模拟能冲到右边那个长尾巴里去。你的预期不应该是”我能赚那么多”,而是”我大概率赚不了那么多,但小概率可能暴富”。

第二张,回撤分布。 最粗的那一坨,正正落在-55%到-60%之间。这比单次回测里的56%更残忍:它告诉你腰斩不是”可能发生”,是”基本跑不掉”。看到这张图之前,你还可以安慰自己那是极端情况;看到之后,你连侥幸的余地都没了。

第三张,夏普分布。 大多数模拟落在0.6到1.1之间,0.83是中间那个数,1.006偏上。这就很诚实了:一条只有两条规则的RSI策略,单吊一只微软,长期夏普的合理预期就是0.8上下。不算惊艳,但正期望,能用。

三张图拼在一起,那个曾让你心动的单次回测数字,终于被还原成它真实的样子。

五、核心教训

核心教训就两句话,放在一起看:

第一句:这个策略在微软上跑了36年,赚了17万倍,夏普1.0。

这句话每个字都是真的,但单独拿出来,几乎等于什么都没说。

第二句:这个策略的夏普,中位数大概在0.83,回撤大概率要扛50%到70%。

这话远不如第一句好听,但你在实盘里真正需要的,是这一句。

这两句话之间的差距,就是为什么我要费劲做walk-forward和蒙特卡罗。

单次回测告诉你的是”历史上发生了什么”。蒙特卡罗告诉你的是”什么才是合理的预期”。

写策略的人、买策略的人,都需要第二个答案,它比第一个重要一百倍。

六、实操注意点

三个实操要点:

🔹 单次回测是起点,不是终点。跑完洗牌重来一千次,中位数才是你的预期,分布宽度才是你的风险。

🔹 盯着回撤分布,别光看收益。中位收益再正,回撤扛不住,策略就不属于你。别跟自己的心理底线较劲。

🔹 一个品种说明不了问题。这文章只测了微软,换一个标的,分布天差地别。你自己的策略,多品种蒙特卡罗是必经之路。

代码下载

下面是完整代码的免费下载:

https://www.laoyulaoyu.com/code/sisg.zip


#蒙特卡罗 #回测 #RSI策略 #夏普比率 #压力测试 #量化交易 #walk-forward #过拟合 #策略验证 #MSFT

Published inAI&Invest专栏

Be First to Comment

    发表回复