数据装配与参数
只改成本假设,同一条策略从 +43.57% 变成 -30.45%
同一条 5/20 均线策略,同一份数据,同一个引擎。只改成本假设:
| 佣金\滑点 | 0bp | 5bp | 10bp | 20bp |
|---|---|---|---|---|
| 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.2 | 338.7 |
| 20,000 | +13.23% | 236.8 | 0.0 |
| 100,000 | +19.48% | 262.5 | 0.0 |
| 1,000,000 | +19.87% | 416.8 | 0.0 |
| 10,000,000 | +19.81% | 1229.2 | 0.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 循环,收益是你三个月后还能相信自己的结果。
📌 免责:本课为技术教学,标的为沪深300 成分股按代码序取样(非精选),所有回测为历史模拟,不构成投资建议。
四件事:
- 成本网格:零成本 +43.57% → 佣金 10bp+滑点 20bp -30.45%,74pp 全部来自假设;滑点比佣金更致命(-55.1pp vs -30.8pp)
- 基准之争:三个基准都判跑输,但幅度差 4.7 倍——"跑赢大盘"不说基准就没有意义
- 初始资金不是缩放系数:5000 元那行收益最高(+39.88%),但有 338.7 笔被拒——高收益是"被迫空仓"的副产品,不是策略的功劳
- 参数清单必须和净值曲线一起出现,否则三个月后你自己都复核不了
下一节讲信号层:indicators → signals → orders 的职责边界,以及引擎怎么在架构层保证信号拿不到未来数据——不靠调用方记得 shift(1),而是让它结构上不可能。
🔎 来源与核验· 3 条,点开核对
