费率参数 · No.036
回测里手续费和滑点填多少才不骗自己
回测的成本参数怎么填:先说清单边还是往返这一处,再按标的流动性分档给滑点的填法,补上永续资金费、限价单默认成交、单笔最低收费三个常漏项,最后用翻倍测试自检。
同一条策略,同一段数据,只改成本参数:
下面这组数字全部是为了演示随手取的假设值——策略毛年化 30%、一年 200 次往返、每次动用全部资金,都是为了让算术能一眼看懂而设的,不代表任何真实策略、任何平台的费率,也不是对任何收益的预期。
| 参数组 | 单边手续费 | 单边滑点 | 往返合计 | 年成本 | 净年化 |
|---|---|---|---|---|---|
| 乐观 | 0.02% | 不填 | 0.04% | 8% | +22% |
| 中性 | 0.05% | 0.02% | 0.14% | 28% | +2% |
| 保守 | 0.05% | 0.05% | 0.20% | 40% | −10% |
三行用的是同一条策略。参数选得乐观一点,它是个能拿去实盘的东西;参数选得保守一点,它是个亏钱机器。成本参数在这里的分量,已经超过策略本身。
三组参数,三个结论
放大差距的是频率。往返成本每高出 0.01 个百分点,乘 200 就是 2 个百分点的年化。所以交易越密的策略,对成本参数越敏感——高频策略的回测曲线,本质上是一条被成本参数决定的曲线。频率和成本怎么相乘,单独算在一年交易多少次那篇。
还有一个中文资料特有的麻烦。搜到的滑点参考值,不少精确到小数点后三位,来源多半是十几二十年前的 A 股或商品期货研究。那些数字在它们的原始语境里可能是对的,搬到这边不行:这边 7×24 连续交易、没有涨跌停、没有集合竞价、不同标的的盘口厚度能差几个数量级,还多了一项永续合约的资金费。能搬的是方法,不是数值。
单边还是往返,先说清这一处
这是最常出错、也最容易查的一处。回测框架的成本参数,有的按单边收(开仓扣一次、平仓再扣一次),有的要你直接填一次完整往返的合计。填反了,结果差一倍。
查法不用读文档:跑一个只做一次开平仓的最小样本,手算这一笔该扣多少,和框架输出的数对一下。差一倍就是填反了。这件事花五分钟,能省掉后面全部的自我怀疑。
另外,别把手续费和滑点填进同一个参数里。它们的走向不一样——手续费按你的费率档走,滑点按标的深度走,合并之后再想调其中一个就分不开了。
手续费填哪一档
三条规则,按顺序用:
- 默认填吃单档。除非你的策略明确用只做挂单的方式下单并且接受不成交,否则按吃单填。市价单、止损单、追价单,全都落在吃单那一侧。两档的区别见挂单和吃单到底差在哪。
- 填你现在这一档,不填你将来可能到的那一档。成交量上去费率确实会降,可那是策略先跑出来之后的结果。拿一个还没拿到的档位,去论证一条还没跑起来的策略,这是循环论证。
- 抵扣类折扣先别填。它依赖你持有某种资产、依赖开关处于打开状态、依赖活动还在。先把最坏情况跑通,折扣当安全垫。
再补一个小额策略专属的坑:某些交易对存在单笔最低收费。单笔金额小的时候,实际费率会明显高过费率表上写的百分比。回测里按固定百分比算,这一块整片消失。判断方法是拿计划中的最小单笔金额去乘费率,看结果是不是低于那个最低值;低于就说明你的实际成本更高,得单独把这一项建成固定费用。
滑点按流动性分档
滑点没有通用数值,只有通用方法。决定它大小的是一个比值:你的订单金额相对该标的的盘口厚度。同一笔钱换个标的,这个比值就换了,填法也得跟着换。所以要先分档,再定填法。
| 流动性档 | 判断依据 | 单边滑点怎么填 |
|---|---|---|
| 充裕 | 你的单量小于盘口第一档挂单量 | 下限取半个最小价位跳动,再往上留一档余量 |
| 一般 | 单量约等于前几档累计量 | 按订单簿实算加权成交价,取几个时段的中位数 |
| 薄 | 单量超过前十档累计量 | 别用固定百分比,只能按订单簿逐档模拟 |
| 极端时段 | 剧烈波动、数据发布、深夜低量 | 单独跑一组压力参数,不要和常态混在一起平均 |
三个执行细节:
- 用中位数而不是均值。滑点分布是长尾的,均值会被少数极端值拉高,中位数更能代表常态;长尾那部分留给压力参数那一组。
- 盘口厚度分时段。同一个标的在活跃时段和清淡时段是两个东西,如果你的策略集中在某个时段触发,就用那个时段的数据估。
- 止损单要单独给一组更差的参数。它触发的时刻通常正是盘口最薄、价格最急的时刻,用常态滑点估它会系统性偏乐观。
想快速估一笔单子的量级,可以先用滑点估算工具跑一遍;市价和限价之间的差距怎么拆,见市价单比限价单贵多少。
永续回测漏掉的那一项
做永续合约的回测,除了手续费和滑点,还有一项按周期结算的持仓费用。它和成交没有关系,只看你在结算时刻手里有没有仓、仓有多大、方向是哪边。
三个特点决定了它不能忽略:它按固定时点收,不管你在不在看;它有方向性,同一时刻多头空头一收一付;它的费率每一期都会变,不能当常数用。持仓时间越长的策略,这一项占比越大;隔夜或跨周持仓的策略,它可能比手续费还重。
回测里的正确做法是把结算时刻当成独立事件建模,按当时的费率和你的持仓名义价值计算,而不是折成一个日均百分比摊掉——摊掉之后,「专挑结算前平仓」这类策略的收益会被凭空造出来。结算机制见按周期结算的持仓费用。
限价单在回测里必成交,实盘不一定
多数回测框架的默认假设是:价格触碰到你的限价,这笔就成交了。实盘不是这样——同一价位上有排队,先挂的先成交,价格擦一下就走,排在后面的人什么也没拿到。
这个差异对不同策略的杀伤力差别很大。趋势策略往往在价格穿过之后才成交,影响有限;而专门在极值位置挂单的策略,回测里那些漂亮的成交,恰恰是实盘中最不可能成交的那一批。
保守的处理办法有两个,选一个用:要求价格穿过你的限价而不只是触碰,才判定成交;或者干脆把限价单按吃单费率计费,当成市价单来跑。两种都会让回测变难看,而难看的那一版更接近实盘。
把参数翻倍,看曲线还站不站得住
参数填完之后跑一次翻倍测试:所有成本参数乘 2,别的不动,再跑一遍。
| 翻倍后的表现 | 说明 | 下一步 |
|---|---|---|
| 几乎没有变化 | 成本参数很可能根本没生效 | 先去查参数有没有被读到 |
| 形状不变,收益小幅下降 | 成本不是主要驱动 | 可以进入下一阶段验证 |
| 收益大幅缩水但仍为正 | 对成本高度敏感 | 降低频率或换更厚的标的再测 |
| 由正转负 | 原来的收益主要来自成本假设 | 这条策略不成立 |
第一行是最值得先查的一行。参数没生效、单位填错(把 0.05% 填成了 0.05)、参数被后面的配置覆盖,这几种情况都会表现为「改了没反应」,而它们看起来和「策略很稳健」一模一样。
翻倍测试只是一把粗筛,别把它当成精确的风险度量。它要回答的问题只有一个:这条曲线的存在,依不依赖你把成本填得足够客气。依赖,就说明你在回测里赚的是参数的钱。
本文所列费率与规则为编辑部按币安公开页面核对后的记录,平台可能随时调整,以你操作时页面显示为准。文中不构成投资建议。本站与 Binance(币安)没有隶属关系;通过本站邀请码注册不会让你多付费,详见商业披露。