2026年八月16日 · 回测

为什么大多数回测在撒谎,以及修正它们的四项成本

为什么大多数回测在撒谎,以及修正它们的四项成本

先摆数字,因为数字本身就是全部论据。在主流永续合约场内,一次 taker 往返交易的手续费约为名义本金的 0.10%。在多头拥挤的行情里,资金费率可能以年化 10-30% 的速度反噬你。一笔相对盘口深度过大的市价单,除了点差之外还要按平方根定律付出冲击成本。而一个读取了"昨天数据今天修订版"的回测,会凭空得到每年好几个百分点的优势——一个从来不存在的优势。

0.10%每笔交易的 taker 往返成本
0.15%我们要求的单笔最低优势
4大多数回测跳过的成本项

真正出人意料的是第一个数字。不是因为它大,而是因为它对交易频率的影响。人人都会点头认同"要把手续费算进去",然后转头去测一个每天交易四十次的策略。按往返 0.10% 算,四十笔就是每天名义本金的 4% 全部消耗在成本上。中等市值的永续合约上根本不存在能跨过这道门槛的信号。这个策略离可行性差得很远,而那份不含手续费的回测却说它天才横溢。

手续费是筛子,不是折价

大多数人心里的模型是:手续费把曲线削薄一点——形状不变,只是略低。这是错的。手续费是一道频率筛子。它会彻底抹掉某个优势的高频变体,却几乎不碰它的慢速变体。当我们的流水线开始按场内真实 maker/taker 费率强制计费后,死掉的那些策略并不是坏点子——而是交易太频繁的好点子。解决办法通常是换更长的周期,而不是换更好的信号。现在,凡是单笔平均收益低于名义本金 0.15% 的策略我们一律放弃,因为扣掉双边成本后已经没有任何东西可供复利。

资金费率是一笔有记忆的持仓税

永续合约每小时或每八小时结算一次资金费率,而它不是噪声:它与动量系统最想做的那类交易存在结构性相关。当所有人都做多时,资金费率为正,而你的多头动量仓位正好在付这笔钱。不计提资金费率的回测,会系统性地美化永续合约上的趋势跟踪。我们是以一种尴尬的方式学到这一点的——一整族资金费率套利策略被自动判定放弃,原因竟是引擎没有把它们本就设计去收割的资金费率计入账。信号没问题,缺的是记账。

冲击成本随规模的平方根增长

基于 K 线的回测有一个礼貌的虚构:你以收盘价成交。对小单来说这大致成立。但只要单子有点分量,业界公认的模型是:冲击随订单规模相对成交量的平方根增长,而且不会回吐。我们把平方根定律的冲击估计折算进每一笔成交,也折算进权益曲线本身。它在最不方便的地方影响最大:容量。一个策略在 5 万美元规模上可能真的赚钱,在 500 万美元规模上却结构性亏损,而只有计入冲击的曲线才能显示出这条边界。

前视偏差藏在数据里,不在代码里

没人会写 if tomorrow_close > today_close: buy()。前视偏差是从数据管道里溜进来的:新闻情绪按发布时间而非采集时间打戳;资金费率按其所覆盖的周期而非其可知时点做关联;把"当前"的标的池套用到历史上(幸存者偏差);用修订后的经济数据替换掉当时真正打到行情上的那个数字。我们的规则是处处 point-in-time:每一条补充数据序列都以我们当时可能知道它的时刻打戳,而回测只能读取在那一纳秒确实存在的数据。

检验一份回测的标准不是曲线是否向上,而是同一套代码在实盘喂入同样的信号时,是否产生同样的交易——而要知道这一点,你只能日复一日、永不停歇地去核对。

最后这句话是一道真实的流程,不是一句口号。我们每天都把每个模拟盘策略的时间窗重放进回测引擎,逐笔比对交易。当模拟盘和重放对不上时,其中一方在撒谎,而撒谎的通常是某项成本或某个时间戳。上面这四项,不过是最先骗到我们的那几项。

回测手续费资金费率市场冲击诚实
← 全部文章