A股量化研究平台 · QUANT LAB · 研究报告

+505%的ETF轮动策略被质疑过拟合:15组对照实验后,我拿到了终审答案

生成日期: 2026-09-01 | 数据与代码全本地 | autoquant.com.cn/intro/

一句话结论:四轮针对性实验全部通过——这套七年半 +505%、年化 28.7% 的 ETF 动量轮动策略,没有过拟合,也没有未来函数。但过程远比结论精彩:第一刀下去,我自己先抓到了一个真问题。

---

一、一个俗套的开局:神策略 + 四连质疑

事情是这样的。我手里有一套打磨定稿的 ETF 动量轮动策略(加权对数回归动量打分 × R² 过滤,每日 14:30 调仓取前二持有,走弱期切防御)。全窗 2019-2026 年 6 月回测:+505.0% / 年化 28.7% / 最大回撤 20.4% / 夏普 1.21

然后我把代码给了一位做审查的朋友,他回了四条意见:

  1. K=2 极度集中——满仓 2 只 ETF,两只同时黑天鹅,实盘回撤会远超回测;
  2. 买卖流动性处理不对称——买入有分钟级容量限制,卖出全量无限制。"回测中卖出无冲击、买入有冲击,会人为拉高收益,这属于过度优化回测曲线";
  3. 取价时点有灰区——14:30 执行取的是当根分钟 bar 的价格,严格说含 59 秒未来信息嫌疑;
  4. 过拟合证据链不能只读代码收口——要跑四个实验:灰区对比、池子扰动、参数扰动细网格、样本外切分。

说实话,看完我后背有点凉。尤其是第 2 条,因为他说的那个不对称,是我自己在代码里亲手写下的

二、第一刀就见血:买卖不对称,意见成立

我的纪律是:凡是能用实验回答的,绝不用嘴回答。

做了一个消融变体:卖出侧加上和买入完全同款的分钟级容量限制(按当时 5 分钟分钟量能的 25% × 0.9 封顶),其余代码一个字不动,同台架同成本(万 0.5 佣金 + 2.5bps 滑点)全窗重跑:

买卖不对称消融

意见②成立:不对称处理确实抬高了回测收益,幅度 -26.8pp。 但把数字拆开看:折合年化只差 0.8 个点、夏普差 0.03,且差异集中在趋势大年——说它"人为造假"是冤枉,说它"让回测偏乐观"是事实。修复版我已存档,后续口径一律按对称版汇报。

这里有个更深的教训:回测里的每一个"为了方便"的不对称,最后都会变成别人质疑你时的呈堂证供。

三、灰区实验:把取价往前挪一根 bar

第 3 条意见的验证最直接:把 14:30 执行时的取价从当根 bar(closes[-1])改成前一根 bar(closes[-2]),如果策略真在偷那 59 秒的未来信息,收益结构应该会系统性崩掉。

灰区实验

结果:+488.9% vs +505.0%,差 -16.1pp(相对 -3.2%),夏普 1.18 vs 1.21,回撤纹丝不动。摊到七年半,年化差 0.5 个点——这是分钟级价格的正常抖动量级,不是未来函数套利的特征。真偷未来信息的策略,取价基础挪一根 bar 会当场现形。

四、池子扰动:随机删五分之一的标的,还成立吗

这是最狠的一刀。策略池 112 只 ETF,我用 6 个固定种子分别随机删掉 15%(17 只)和 20%(22 只)——如果收益是靠某几只"幸运标的"撑起来的(幸存者偏差),删到它们就会当场崩塌。

池子扰动

六个种子全部正收益:+369% ~ +534%。最狠的是删 20% 的 s6,+533.7% 反超基线;最弱的 s2 也有 +369.2%。没有任何一个随机子池崩塌——收益不依赖特定标的。

如实说两点:收益对池构成有中等敏感度(均值 -13pp,机会集缩小的正常代价);个别种子回撤放大到 34%,值得留意。

五、参数细网格:高原还是尖峰

过拟合策略的典型指纹是"参数尖峰"——默认参数是天选之子,邻居全死。我把三个核心参数各做两个邻居扰动(LOOKBACK 25→20/30,R² 阈值 0.4→0.3/0.5,调仓 14:30→14:00/14:45):

参数细网格

六个邻居全部同量级正收益(-15.5% ~ +7.3%),LOOKBACK=20 甚至 +541.7% 反超基线。这是教科书式的参数高原,不是尖峰。

六、样本外切分:冻结参数,扔进没见过的年份

终审最后一关。参数一个不动,直接切窗:2019-2023 作为样本内参照,2024 年到 2026 年 6 月作为纯样本外。

样本外切分

过拟合策略的特征是"样本内光鲜、样本外现形",这套策略恰好倒过来——没见过的数据上反而大幅跑赢。这是反过拟合最有力的单条证据。

但我必须把另一面也写清楚:收益高度集中在 2024 后的 ETF 趋势大年,这是行情风格(regime)依赖,不是过拟合——可前向预期如果按 86% 年化线性外推,那就真是在骗自己了。

七、一个差点被冤枉的守卫:借来的优化,否决

审查意见①(K=2 假分散:可能同时持有两只近同质 ETF)还有个延伸动作。我借用了聚宽五福 V3 的"运行时相关性守卫"(持仓间 60 日相关 ≥0.8 就顺延下一名),做了第七个消融:

相关性守卫消融

守卫在七年半里实际触发了 327 次顺延(301 个交易日,占比约 17%)——代价是 +430.9% vs +505.0%,-74pp,回撤毫无改善。被顺延的不是"黄金对黄金",而是沪深300 对创业板(corr 0.89)这类主流宽基高相关对。

动量策略的收益引擎,本来就是"强者同族聚集"。强行拆掉同族,等于拆引擎。守卫否决,定稿一行不动。

八、终审结论

实验判定
买卖不对称消融意见②成立,-26.8pp,修复版已存档
灰区取价实验无未来函数套利特征
池子扰动 ×6无幸存者偏差,不依赖特定标的
参数细网格高原非尖峰
样本外切分样本外大幅走强,反过拟合形态
相关性守卫消融否决,定稿维持原样

"这套策略有没有过拟合和未来函数"——到此数值收口:没有。

---

写在最后:这些实验是怎么跑出来的

可能有读者会问:16 个全窗分钟级回测,每个都要跑 112 只 ETF 七年半的 1 分钟数据,你怎么几天就弄完了?

全部实验都是在我自己的量化研究平台上完成的:全品种全频率(日线/5分钟/1分钟)本地数据、按 A 股真实规则撮合的回测引擎(涨跌停/T+1/流动性上限/真实成本分档)、以及一条"想法→回测→终审→对账→交付实盘代码"的全自动流水线。文里每个变体从改代码到出指标,就是一次提交的事。

这个平台最近刚开放公测,新用户 1 元就能体验一次完整的 AI 全自动策略研究(同样规格的分钟级回测+四约束终审+交付 Ptrade/QMT 实盘代码):https://autoquant.com.cn 。你有任何策略想法——哪怕是"我觉得某个策略是过拟合"——都可以扔给它验一验。毕竟,能被实验验证的质疑才是好质疑,能被数据接住的策略才值得上实盘。

*(风险提示:本文仅为量化研究方法交流,不构成任何投资建议。历史回测业绩不代表未来表现。)*

免责声明:本报告仅为量化技术研究成果展示,不构成任何投资建议;历史回测业绩不代表未来表现,市场有风险,投资需谨慎。
本报告由 tools/make_pdf_report.py 自动生成 | 策略代码/回测日志/过程数据全部本地存档可复现