← 返回首页

我把同一个策略跑了100遍随机数据,回测年化还有18%——那一刻我明白自己的回测全是抽卡

💤 小Q · 2026-10-05 · 量化策略
做量化这两年,我经历过最恐怖的时刻,不是实盘亏损,是一个凌晨两点的实验。 那天我把一个回测年化26%、最大回撤11%、夏普2.1的策略——对,就是那种截图发群里能收获一排'大佬'的策略——扔进了一个荒谬的实验里:我不让它跑真实行情,让它跑随机数据。 结果它年化还有18%。 一个在纯随机生成的价格序列上都能年化18%的策略,意味着它压根没捕捉到任何市场规律——它捕捉到的是数据本身的随机波动,然后把这些波动误认成了信号。我调了三个月的参数,本质上是进行了一场为期三个月的抽卡游戏,还以为自己在搞科研。

这个实验的原理:给回测做个'随机对照'

方法说出来特别简单,简单到我不明白为什么十年前没人告诉我: 1. 把你的历史行情数据(比如10年日线)保留,但打乱顺序——或者更严谨一点,用随机游走生成N组'假行情'(波动率和真实数据接近,但没有任何可预测结构); 2. 用完全相同的回测逻辑和参数,在这100组假数据上各跑一遍; 3. 看结果分布。 判断标准:如果你的策略在真实数据上年化15%,但在随机数据上平均也能跑出10%,那你的15%里只有5%是真信号,剩下10%是你'参数调得好'调出来的幻觉。极端情况就像我那次——随机数据都能18%,恭喜你,你的策略是玄学。 统计学上这叫置换检验,精神内核一句话:真策略在随机世界里的表现应该接近零;离零越远,说明你抓到的东西越真。

我给自己的7个策略都做了这个测试,结果惨烈

当晚我把实盘的7个策略挨个过了一遍随机对照,结果如下(随机数据上年化收益的中位数):
  • 动量策略A:真实+14.2% / 随机+9.8% —— 半真半假,含金量存疑
  • 轮动策略B:真实+11.5% / 随机+8.7% —— 同上,虚胖
  • 网格策略C:真实+9.3% / 随机-0.4% —— ✅ 有真东西(赚的是波动率回归,逻辑自洽)
  • 低波策略D:真实+8.1% / 随机+7.6% —— 基本是幻觉
  • 那个夏普2.1的'明星策略':真实+26% / 随机+18% —— 已下线
  • 7个策略,4个的'超额收益'和抽卡没本质区别。最讽刺的是,随机数据上表现越好的策略,往往过拟合越严重——因为它对数据形态的'适配度'太高了,高到连没有规律的数据都能适配出收益。

    为什么会这样?因为回测是一场你可以反复重考的考试

    过拟合的机制很朴素:你每根据回测结果调整一次参数,就相当于'偷看了一次答案'。调10次参数,你的策略就已经对这段历史数据'背答案'背了10遍。历史数据是有限的,参数是无限的,只要你肯调,总能调出一条漂亮曲线——只是那条曲线描述的是过去,不是未来。 我的明星策略就是典型:26个参数。26个啊朋友们,用26个旋钮去拟合一段历史,拟合出花来都不奇怪。

    三个土办法,治过拟合

    1. 参数少一条命。 我现在给自己定规矩:策略参数超过5个,先砍再说。每个参数都是一次偷看答案的机会。双均线为什么我还能接受?两个参数,能偷看的东西有限。 2. 随机对照跑一遍再谈感情。 就像今天这篇讲的,任何策略上线前先在假数据上跑100遍。随机数据上年化还能到正的,直接毙——不管曲线多美。这一条规矩上线后,我的新策略立项通过率从70%掉到20%,但实盘稳定多了。 3. 留出'从没碰过'的验证段。 把最近2年数据锁进保险柜,回测和调参只允许用前8年。全部调完,最后拿锁着的2年跑一次,只跑一次。那一次的成绩,才接近真实预期。注意是'只跑一次'——跑完不满意又回头调,保险柜就白锁了,你只是在偷看答案的循环里多绕了一圈。

    结语

    那天凌晨我看着那个随机数据上年化18%的'明星策略',删掉它花了3秒,接受'我过去三个月在抽卡'这个事实花了三个星期。 量化最残忍也最诚实的地方就在这:它可以随时用一个实验告诉你,你以为的能力,有多少其实是运气。早点知道,比晚点知道便宜。 (以上为个人实验记录,不构成投资建议。随机对照方法有更严谨的变体,本文是土法版本, quant 老哥轻喷。)
    量化策略过拟合回测Python实战随机对照统计检验小Q风格2026年10月