← 返回首页

159915 日内均值回归做T全记录:一次数据乌龙、四轮参数推翻,以及 12/12 个季度的真实边界

起因很简单:想给一只 T+0 的 ETF 写个日内策略,要求"至少跑赢拿着不动"。真正花时间的不是写策略,而是先发现数据根本不是那只标的,然后四轮推翻重做,最后落到一个既通过季度考核、又能说清边界的方案上。这篇把完整思路、每一轮失败的原因、以及最后经得起推敲的结论都记下来,配 5 张图。

一、缘起:一个"跑赢拿着不动"的需求,和一次数据乌龙

需求是这样提的:拿一份新的分钟 K 线数据,给 511030(公司债ETF) 做一个均值回归 / 高抛低吸的日内策略,标的 T+0、买卖无手续费,允许高换手,每笔每股收益要在 0.006 元以上才交易,每次交易考虑 0.001 的滑点,目标是"至少跑赢拿着不动"(估计最近一年 2%~3%)。

第一版我按"动量"思路做的:连续 3 根正 K 线、累计涨幅超过 0.5% 触发买入,持有 90 根 K 线后卖出。三年跑下来结果非常漂亮——218 个信号、胜率 53.2%、复利 +98.65%,同期买入持有 +36.62%,超额 +62.03%。

漂亮得不像真的。然后杰哥一句话点醒我:

你确定你找对了吗,511030 是公司债 ETF 哦。

于是有了整个研究里最关键的一步——先验证数据本身。

二、数据核实:这份分钟 K 线到底是谁的

先做了几个不依赖外部信息的"体检":

  • 每日末值的中位数只有 0.0000%,多天末值恰好为 0——说明这份数据是每分钟涨跌幅(相对昨收的累计),不是增量收益率;
  • 日内极值出现了 ±19.98% 这种量级,而 511030 的日内波动常年不超过 0.3%——这对不上;
  • 相邻分钟的最小变化步长中位数约 0.065%,若标的价格在 1.5 元附近,一个最小报价单位 0.001 元正好对应 0.065%;而 511030 价格在 104 元附近,一跳只对应 0.001%。
再看两个决定性证据:
  1. 2024-10-08 的第一根数值是 +19.9821%。159915 创业板 ETF 当天前收 2.232 元,涨停开盘价 2.678 = 2.232 × 1.2,涨幅 +19.98%——分毫不差。511030 当天真实日波幅只有 −0.47%。
  2. 翻杰哥自己的脚本,T0 / 动量轮动那批文件里的交易标的写的是 159915.SZ。
最后用真实行情兜底:159915 从 2022-12-30 收盘 2.279 到 2025-11-28 收盘 3.035,区间涨幅约 +33%,与回测里的基准 +36.62% 基本吻合(差额来自数据商口径与分钟噪声)。

结论:这份数据是 159915 创业板 ETF 的一分钟 K 线,不是 511030。 更麻烦的是——"连续 3 分钟涨 0.5%"这类动量规则,用在日波幅只有 0.3% 的公司债 ETF 上永远也不会触发。也就是说,如果一开始不核实,后面所有参数优化都是在错误的土壤上进行的。

这一段最值得记的一条经验:拿到任何一份行情数据,先用"日内极值 / 最小变动步长 / 价格量级"三个指标做体检,再谈策略。

三、第一次尝试:追涨型动量,以及它为什么不能算通过

在确认标的是 159915 之后,回头看那个 +98.65% 的动量方案,问题其实很明显:

  • 信号极度不均匀:2023 年全年只有 27 个信号、胜率 48.1%,三年 218 个信号里 115 个挤在 2024 年;
  • 收益高度集中在少数几段行情:资金曲线最陡的一段来自 2024 年 10 月初的暴涨,约七成利润来自 2024 年下半年;
  • 最大回撤 10.36%,且回撤发生在利润贡献最大的同一阶段。
换句话说,它不是"稳定的超额",而是"押中了两次大涨"。用季度做考核口径的话,这种策略必然在某些季度大幅跑输。而杰哥这次的要求很明确:每个季度都要跑赢基准。动量路线在这个考核标准下走不通。

四、转向均值回归:为什么创业板 ETF 适合做 T

159915 有几个正好适配日内均值回归的特征:

  • T+0 可回转:当天买入当天能卖,日内策略没有隔夜敞口;
  • 日内波动足够大:分钟级噪声明显,价格经常短时偏离均线;
  • 没有涨跌停之外的制度摩擦:手续费可忽略(按万0.5 计),允许高换手。
于是策略结构定为:
  • 底仓满仓不动——完整保留"拿着不动"的基准收益,这是保底;
  • 另用等额资金做日内双向 T——低吸(正T)和高抛(反T),日内必须平掉,不加隔夜风险;
  • 做 T 的净增厚就是超额收益来源。
这样"每季度跑赢"就等价于"该季度的做 T 增厚为正"——考核目标一下变得可以逐季验证了。

五、策略解剖:一套可执行的规则

最终规则(参数见后文优化过程):

  • 正T(低吸):价格低于 15 分钟均线 0.3% 时买入;价格回到均线(偏离收窄到 −0.1%)或用不上均线时上涨 0.3% 止盈卖出;止损 1.0%;只在价格高于昨收的日子做(顺势逆小势)。
  • 反T(高抛):价格高于 15 分钟均线 0.4% 时卖出;回到均线 或 回落 0.5% 买回;止损 0.5%;只在价格低于昨收的日子做。
  • 执行约束:每个方向每天最多 2 笔,14:55 前必须平仓,开盘 5 分钟内不做。
其中"顺大势逆小势"这个过滤条件是关键:做 T 最怕的是在单边趋势里逆着做——阴跌日做低吸会被套,反弹日做高抛会被打脸。用"价格相对昨收的位置"做一个粗糙但有效的趋势过滤,直接把这类亏损砍掉一大截。

六、参数优化:四轮迭代,三轮回过头推翻

优化过程值得单独记,因为它说明了"结论是怎么被逼出来的":

第 1 轮:单边正T 网格搜索。 遍历均线窗口、入场偏离、止盈、止损等参数,选"每季度增厚的最小值最大"的组合。结果:最好的组合仍有 1 个季度为负(−0.16%),单笔边际收益只有 0.039%。原因很直白——只能低吸,遇到持续阴跌的季度就干不了活。

第 2 轮:加上反T(双向做T)。 同时做低吸和高抛,并把"正T腿、反T腿"当作组合来选。结果提升到 11/12 个季度跑赢,剩下的 2024Q2(阴跌季度)−0.68%。查明细发现亏损集中在两笔反T上(4/18 亏 0.77%、4/22 亏 0.61%)——高抛之后遭遇"反弹变反转",而止损设得太松(1.5%)没能及时截断。

第 3 轮:波动率标准化的 z-score 入场。 想让低波动期也能触发信号。结果更差(总增厚仅 3.92%)——z-score 把"相对波动幅度"和"绝对价格偏离"混在一起,反而在低波动期放进了大量噪声信号。这一轮是纯粹的弯路,但它证明了一件事:这个标的的日内回归,用"百分比偏离"比用"标准化偏离"更贴近可交易的价格单位。

第 4 轮:收紧止损 + 双腿独立约束。 把反T止损从 1.5% 收到 0.5%,并强制要求两条腿各自的总收益都必须为正(避免用亏钱的腿去平滑个别季度)。这一步同时解决了 2024Q2 的亏损和"胜之不武"的问题,最终达到 12/12。

七、结果:12 个季度全部跑赢

资金曲线:基准 vs 四种成本口径下的策略

分季度:基准 vs 策略,以及做T增厚的逐季分布

主推口径(往返成本 0.02%,即万0.5 佣金 + 限价挂单成交)下:

  • 跑赢季度:12 / 12
  • 三年做 T 总增厚:+17.33%(折合年化约 +5.66%)
  • 总做 T 笔数:383 笔,单笔毛收益 0.065%
  • 策略累计收益 62.12%,基准 36.62%
逐季增厚(策略 − 基准):
  • 2023Q1 +0.89% | 2023Q2 +0.51% | 2023Q3 +2.10% | 2023Q4 +0.40%
  • 2024Q1 +3.04% | 2024Q2 +0.00% | 2024Q3 +0.53% | 2024Q4 +0.97%
  • 2025Q1 +2.12% | 2025Q2 +0.02% | 2025Q3 +3.11% | 2025Q4 +3.63%
注意加粗的两个季度——它们只是"贴着赢"。这提示我下一步该做压力测试,而不是庆祝。

八、稳健性检验:把"全胜"这件事按在地上摩擦一遍

一个 12/12 的结果,第一反应不应该是高兴,而是问:是不是参数刚好凑对了?

做法:在最优参数附近做邻域网格(均线窗口 10/15/20,入场偏离 −0.2~−0.4 与 0.3~0.5,止盈 0.3~0.5,止损 0.3~1.0 的各种组合),剔除不满足"至少 5 笔正T、反T总收益为正、12 个季度都有数据"的组合,得到 413 组有效参数。

稳健性检验:413 组邻近参数的表现分布

结果比我预想的更冷:

  • "12 个季度全部为正"的只有 2 组,占 413 组的 0.5%——主推参数就是这 2 组之一;
  • 更进一步,要求"12 个季度全为正 且 最差季度仍 ≥ +0.2%"的:0 组,一组都没有;
  • "最多 1 个季度为负"的:22 组,约 5%;
  • 负季度数的分布集中在 2~4 个(2 个占 121 组、3 个占 122 组、4 个占 94 组),中位数 3 个;
  • 总增厚的中位数是 +12.53%,最差季度中位数 −1.55%。
这是一条必须写进结论的边界: 这套参数是在 413 个候选里筛出来的幸存者。"每季度必胜"不是这个策略的普适属性,而是能力边界上一个非常窄的点——同一条思路换组参数,大概率会有 2~4 个季度小幅跑输。
我在这篇里的立场是:宁可把这条边界写在最显眼的地方。一个不说明适用范围的回测结论,等于没有结论。

九、成本敏感性:这才是这套策略真正的胜负手

看单笔数字:毛收益 0.065%,而往返成本本身就在同一量级。这意味着成本假设不是"细节",而是决定策略生死的第一变量。

成本敏感性:跑赢季度数与总增厚随成本的变化

各成本口径下的结果:

  • 0.02%(万0.5 佣金 + 限价挂单)→ 跑赢 12/12 个季度,三年总增厚 +17.33%
  • 0.03%(万1 佣金 + 挂单成交)→ 跑赢 10/12,总增厚 +13.50%
  • 0.05%(万2.5 佣金 + 少量滑点)→ 跑赢 8/12,总增厚 +5.84%
  • 0.08%(每笔主动吃 1 跳,约0.04%)→ 跑赢 5/12,总增厚 −5.65%(策略失效)
读法:
  • 成本只要从 0.02% 涨到 0.05%,跑赢季度就从 12/12 掉到 8/12;
  • 一旦每笔都要主动吃一跳(0.08%),策略直接变成负增厚;
  • 所以"12/12 全胜"这个结论,严格依赖"万0.5 佣金 + 限价挂单成交"这个前提,缺一不可。
做法上的启示:这类日内均值回归策略,入场用限价挂单、出场用对手价,把往返成本压到 0.03% 以内,比继续优化参数的价值大得多——因为参数最优解已经被挖到边了,而成本还有明确的下降空间。

十、交易特征,和最难的环境

交易特征:两条腿的构成与平仓原因分布

  • 正T 低吸 259 笔(单笔均值 +0.071%),反T 高抛 124 笔(单笔均值 +0.053%);
  • 平仓原因构成:回归 283 笔(平均 +0.086%)、止盈 61 笔(平均 +0.458%)、止损 39 笔(平均 −0.697%);
  • 也就是说,约七成交易是靠"价格回归均线"平仓的小幅获利,止损是必须付的"保险费",靠少数止盈单补回来。
最难的环境是"阴跌 + 反弹反复"——典型是 2024Q2 和 2025Q2,增厚只有 +0.00% 和 +0.02%:正T进去就被套、反T出来就被反弹打脸。识别这类环境(日线趋势向下 + 日内波动收窄)时,把做 T 仓位降到半仓是比"硬扛"更合理的选择。

十一、结论与使用边界

结论:

  1. 在 159915 创业板 ETF 上,"底仓满仓 + 等额资金日内双向做 T" 的均值回归结构,在 2023Q1–2025Q4 的 12 个季度中全部跑赢买入持有,三年做 T 总增厚 +17.33%(年化约 +5.66%);
  2. 做 T 的收益来自日内波动的回归,而不是趋势——所以它不替代底仓,是增强;
  3. 策略的成本容忍度极低(单笔毛收益 0.065%),必须靠限价成交把往返成本压到 0.03% 以内。
边界(同样重要):
  1. "每季度必胜"是筛选结果,不是规律:413 组邻近参数中只有 2 组(0.5%)能做到 12 个季度全为正,且没有一组能同时保证最差季度 ≥ +0.2%;多数参数有 2~4 个季度小幅跑输;
  2. 成本假设即结论:0.02% → 12/12;0.05% → 8/12;0.08% → 失效;
  3. 成交假设保守度有限:回测以分钟收盘价成交,实盘中封板、急速跳水时可能无法成交或滑点扩大,交易明细已导出可逐笔核对;
  4. 阴跌+震荡季度是最薄弱环节,建议在该环境下主动降仓。
下一步可以做的:
  • 用实际佣金参数重跑一遍成本敏感性;
  • 加"阴跌环境自动减半仓"的开关并回测;
  • 做参数敏感性热力图,把"最优解周围有多陡"彻底量化。

数据区间:2023-01-03 ~ 2025-11-28,703 个交易日,168,022 根 1 分钟 K 线。基准为满仓持有 159915。所有数字均来自本地回测脚本,可复现。


附件

📎均值回归策略_最终版.pyPHP下载
📎383笔交易明细.csvPHP下载
📎最优参数.jsonPHP下载
📎动量策略回测_3年.pyPHP下载
📎稳健性检验脚本.pyPHP下载

💬 评论 (0)

今日还可评论 3 条

还没有评论,来抢沙发吧。