← 返回目录
p4.2动手⏱ 约 15 分钟

数据装配与参数

只改成本假设,同一条策略从 +43.57% 变成 -30.45%

🔎 最后验证 2026-07📚 来源:成本网格、基准对比与资金规模实测于 2026-07-31 在 ECS 完成(6 只沪深300 成分股,2010-01-04~2026-07-29),输出见 code/outputs/stdout.txt🧰 Python 3.12.13、qlab.engine(本课自研)
为什么学这个

同一条 5/20 均线策略,同一份数据,同一个引擎。只改成本假设:

佣金\滑点0bp5bp10bp20bp
0 bp+43.57%+27.18%+12.62%-11.51%
2.5 bp+35.32%+19.87%+6.23%-16.52%
10 bp+12.78%+0.05%-11.33%-30.45%

从 +43.57% 到 -30.45%,74 个百分点,全部来自参数假设。

回测里有一堆参数你可能从来没写出来过:初始资金、佣金、印花税、滑点、最低佣金、基准、成交价假设……

它们都有默认值。而默认值,就是未声明的假设。

💡 打个比方

菜谱写"盐少许"。

三个人照做,做出三种咸淡。然后他们争论"这道菜到底好不好吃"——而他们吃的根本不是同一道菜。

回测报告里的"考虑了交易成本"这句话,就是"盐少许"。

一、成本网格:事件驱动版的死亡线

p0.2 我们用向量化算过死亡线。现在用完整引擎重做一遍,把佣金和滑点拆成两个维度:

  • 零成本那一格 +43.57%——这就是你在很多"策略分享"里看到的数字
  • 本课默认(佣金 2.5bp + 滑点 5bp)+19.87%
  • 佣金 10bp + 滑点 20bp:-30.45%

成本假设的选择,比策略本身的参数更能决定结论。

而且注意:滑点比佣金更致命。佣金从 0 到 10bp,收益从 43.57% 掉到 12.78%(-30.8pp);滑点从 0 到 20bp,掉到 -11.51%(-55.1pp)

原因是滑点按成交金额双边收,而且它是唯一一个你无法通过谈判降低的成本

二、基准之争:跑输的幅度差 4.7 倍

同一条净值(+19.87%),换三个基准:

基准基准收益结论
① 标的等权买入持有+68.47%跑输 48.60pp
② 沪深300 指数+30.13%跑输 10.26pp
③ 无风险(年化 2%,16.6 年)+38.82%跑输 18.95pp

三个基准都判它跑输——但跑输的幅度差 4.7 倍,从"略逊 10pp"到"完败 49pp"。

所以"跑赢大盘"这句话,在不说清基准是什么之前,没有意义。

本课默认基准:同标的池的等权买入持有。因为它回答的是最该问的那个问题——你的择时到底有没有加分?

顺带一个诚实的结论:这条 MA5/20 策略在本样本上跑输了全部三个基准。这和 p0.1 的四级阶梯、P3.4 的通缩夏普门槛,指向的是同一件事。

🔧 动手做:让同一条策略"跑输"的幅度差 4.7 倍(5 分钟)

python param_sensitivity.py,看【二】"基准之争"。同一条策略(累计 19.87%),换三个基准:

  • vs 沪深300 指数(30.13%)→ 跑输 10.26pp(略逊)
  • vs 标的等权买入持有(68.47%)→ 跑输 48.60pp(完败)

同一条策略,"跑输"的幅度差 4.7 倍。

想明白:"跑赢大盘"这句话,在你没说清"大盘是哪个基准"之前,毫无意义。买入持有同一批标的,往往是最诚实、也最难跑赢的基准——很多"跑赢沪深300"的策略,一换成"等权买入持有自己选的那批票"就原形毕露。看任何"跑赢"的结论,先问:跑赢的是哪个基准?

三、初始资金:它不只是一个缩放系数

初始资金平均累计%平均成交平均被拒
5,000+39.88%93.2338.7
20,000+13.23%236.80.0
100,000+19.48%262.50.0
1,000,000+19.87%416.80.0
10,000,000+19.81%1229.20.0

在无摩擦的向量化回测里,初始资金只是个缩放系数——所有行会完全一样。

加上整手与最低佣金之后,它们不一样了

⚠️ 避坑

特别注意 5000 元那一行:它的累计收益看起来最高(+39.88%)。

而它有 338.7 笔被拒

真相是:它大部分时间买不起一手,被迫空仓,因而躲过了这条策略的亏损段。

这不是策略的功劳,是约束的副产品。

如果你只看收益那一列,你会得出"小资金反而更适合这个策略"这种荒谬结论。而只要多看一眼被拒列,真相立刻浮现。

这就是 p4.1 那条纪律的价值:引擎必须把"没做成的事"也记下来。

四、参数清单:和净值曲线一起出现

标的池        6 只(沪深300 成分按代码序取样,非精选)
区间          2010-01-04 ~ 2026-07-29
价格口径      后复权(p1.3)
初始资金      1,000,000
策略          MA5/MA20,多头 0.95 仓位,信号次日开盘执行
佣金(单边)    2.5bp,最低 5.0 元
印花税(卖出)  5.0bp
滑点(单边)    5.0bp
涨跌停        ±10%(主板口径),一字板不成交
T+1           开启(日频单次调仓下不绑定,见 p4.1)
整手          开启,买入按 100 股向下取整
成交价        次日开盘价 + 滑点
基准          同标的池等权买入持有

这张表应该和净值曲线一起出现。缺了它:

  • 别人无法复核你的结论
  • 你自己三个月后也复核不了

这是判据七(可复现)在回测层的落法。成本是一个 print 循环,收益是你三个月后还能相信自己的结果。

❓ 测验
别人分享一条回测曲线:年化 15%、夏普 1.2、代码开源。你把代码跑了一遍,得到年化 6%。最可能的原因是?
✏️ 填空
本节实测:滑点比佣金更致命,因为它按成交金额双边收,而且是唯一一个你无法通过 ___ 降低的成本。

📌 免责:本课为技术教学,标的为沪深300 成分股按代码序取样(非精选),所有回测为历史模拟,不构成投资建议。

✅ 小结

四件事:

  1. 成本网格:零成本 +43.57% → 佣金 10bp+滑点 20bp -30.45%,74pp 全部来自假设;滑点比佣金更致命(-55.1pp vs -30.8pp)
  2. 基准之争:三个基准都判跑输,但幅度差 4.7 倍——"跑赢大盘"不说基准就没有意义
  3. 初始资金不是缩放系数:5000 元那行收益最高(+39.88%),但有 338.7 笔被拒——高收益是"被迫空仓"的副产品,不是策略的功劳
  4. 参数清单必须和净值曲线一起出现,否则三个月后你自己都复核不了

下一节讲信号层:indicators → signals → orders 的职责边界,以及引擎怎么在架构层保证信号拿不到未来数据——不靠调用方记得 shift(1),而是让它结构上不可能。

下一节 → 信号层:职责边界与未来函数的架构级防线
🔎 来源与核验· 3 条,点开核对
本节每个关键论断都对应一个可追溯的来源 —— 这是本课程"靠谱、不过时"的底线。
「成本网格(6 只标的平均累计收益):佣金 0bp/滑点 0bp 为 +43.57%,佣金 2.5bp/滑点 5bp 为 +19.87%,佣金 10bp/滑点 20bp 为 -30.45%」
📚 本节 code/param_sensitivity.py,2026-07-31 于 ECS 实测,输出见 code/outputs/stdout.txt✓ 已核验 2026-07
「基准对比:策略 +19.87%;标的等权买入持有 +68.47%(跑输 48.60pp)、沪深300 指数 +30.13%(跑输 10.26pp)、无风险年化 2% 折合 +38.82%(跑输 18.95pp),跑输幅度相差 4.7 倍」
📚 同上实测✓ 已核验 2026-07
「初始资金实测:5000 元累计 +39.88%(成交 93.2 笔、被拒 338.7 笔),20000 元 +13.23%,100 万 +19.87%,1000 万 +19.81%(后三者被拒均为 0)」
📚 同上实测✓ 已核验 2026-07
无风险利率按年化 2% 简化计算,仅用于说明基准选择的影响,非对实际利率的判断。
智图软件的赞赏码
都看到这了,打个赏呗!
接下来 · p4.3
信号层:职责边界与架构级防线
继续读下一节 →