2026年十一月15日 · 研究

刷单把成交带注水时,加密货币成交量该怎么回测?

刷单把成交带注水时,加密货币成交量该怎么回测?

周一我们做了件负责任的事。智能体在一张中盘 USDT-M 永续上跑动量策略,每笔 25,000 USDT;第一次没加成交量过滤器的回测,把每个信号都按订单簿是 BTC 那样成交了。于是我们加上教科书式的门槛:连续 20 根 1 分钟 K 线的美元成交量必须超过下单量的 20 倍,订单才能发出。20 分钟,50 万美元的成交带。这枚币忙的一天大约打出 $40 million。过滤器留住了大部分信号。权益曲线没那么锯齿了。我们把它送上了模拟盘。

11 小时后,一笔 25,000 USDT 买单吃掉 8,400 的盘口就停了。那一分钟对应的 20 根 K 线成交量是 $1.14 million。过滤器说的是可以。

34%上报成交带从未推动过价位
11 hrs模拟盘直到第一笔下单卡住
20×仍然放行的下单量对成交量规则

周一:让我们觉得自己很诚实的过滤器

智能体在 pull request 上的说明是「已加入容量检查,20× 名义本金。」我批了。这句话我以前批过。就是那种规则:有人给你看一份回测,在 $4,000-OI 的币上打 $50,000 的单,全屋人一脸嫌弃,于是你加成交量倍数,免得再发生。

周一,这条规则在回测里干了它一贯会干的事。它丢掉了死寂的时段。它留下了交易所自家成交量数字看起来很热闹的时段。换手大约降了三分之一。平均成交额仍是 25,000,因为成交模型是个懦夫:门槛一开,就按最新价再加几个 bps 把整笔下单量吃掉。没人去问订单簿上到底坐没坐着 25,000。

看到一枚币的 24h 成交量是个整数、旁边持仓却很薄,我还是会心里一紧。那是 2021 年留下的后遗症:当时 Discord 上的「做市」机器人就是 2 个子账户对敲,再把成交量截图贴到 #brag。成交带看着像派对。订单簿是硬纸板。我告诉自己,在 1 分钟 K 线上加 20× 过滤器,就是从那种日子里走出来的办法。不是。那只是把硬纸板平均成一个更平滑的数字。

周二:模拟盘,然后一笔残留

模拟盘开头还算客气。前 5 笔顺着卖盘跳了 2–4 档就成交了。难看,但成交了。接着 14:07 UTC,一个做多信号,25,000 USDT,盘口 1,100,下一档 2,400,再往下就是空气。我们以 taker 成交了 8,400,剩下 16,600 挂着。40 秒后,剩余部分按我们自己的 time-in-force 撤掉了。策略以为自己做多了整整一笔。账户只多了三分之一笔。

可过滤器说的是可以。我把那根 K 线拉出来。到 14:07 为止的 20 分钟美元成交量是 $1.14 million,稳稳超过 $500k。这 $1.14 million 里大约 $380k 是成对的成交:同一价格、同一数量、相反的 aggressor 标记,间隔 2–8 毫秒,而该价位的买卖盘数量纹丝不动。那些成交在互相付手续费。它们并没有给我们一个 25,000 USDT 的缺口。

周三:把成交带对上订单簿

周三是慢的一天,下次我会按 2 倍时间来排。我们取了同一张永续上 5 个工作日的成交和 L2 快照,100ms 一张订单簿照片,把每笔成交对照前一张、后一张快照的订单簿做了分类。

  1. 若成交价上的数量大约减少了成交那么多,就是碰到了订单簿。计入。
  2. 若一买一卖、数量相等、打在同一价格、订单簿无变化,就叫刷单,从任何容量数字里剔除。
  3. 若一笔成交穿过数档、且这些档位消失了,那是真正的 taker。计入,但别假装你也能吃到那笔流动性;已经有人吃过了。
  4. 若成交被标记为强平,那是真实数量,也是你最不该拿来证明 你能下 25,000 的数量。那笔强制单在跟你抢。

快照会撒一点谎。任何在 100ms 内成交又补回来的,看起来都像幽灵,而有些真正的做市商 cancel-replace 就是这么快。我们后来抽了几分钟 10ms 的订单簿,刷单占比只动了几个百分点,没有变成 2 倍。几个百分点我受得了。把交易所成交量 ticker 当成流动性普查,我受不了。

AggTrades 已经把一个 taker 在同一价格打到多个 maker 的情况折叠了。它们不会折叠 2 个子账户对倒。如果你的「干净」行情是聚合成交,这个问题你照样有。只是行数更少。

而 ticker API 上的 24h 成交量是同一笔脏合计,还带延迟,所以研究智能体爱它。一个字段。永远在。看起来像特征。它其实是一条恰好写进行情 protobuf 的营销统计。

如果一个成交量数字对不上订单簿的变化,它就不该出现在容量检查、冲击模型或标的池过滤里。24h ticker 是这个数字最糟糕的副本,因为它已经被加总、四舍五入、剥掉了时间。

周四:一周收进一张表

5 个交易时段,同一下单量、同一 20× 规则、回测里同一成交模型。模拟盘成交比是该时段我们实际发出的订单中,成交名义本金除以意向名义本金。周一模拟盘是空的,因为我们还在回测。

时段交易所成交带推动订单簿类刷单强平成交过滤器放行模拟盘成交
周一$38.4m$22.6m$13.5m$2.3m41 / 48 个信号n/a
周二$41.1m$24.2m$15.2m$1.7m36 / 400.61
周三$29.6m$20.1m$8.1m$1.4m22 / 310.77
周四$44.8m$25.6m$17.4m$1.8m39 / 440.54
周五$33.2m$22.3m$9.4m$1.5m28 / 350.71

类刷单成交占当周成交带的 34%。它们分布并不均匀。周四,原过滤器最喜欢的那个时段,是最脏的。这才是我在意的失效模式。门槛不只是平均高估流动性。刷单机器人开工的日子,它开得更宽,因为那些日子原始数字看起来最健康。

我们只用推动订单簿的成交量重跑了回测,倍数仍是 20×。一周信号从 198 个降到 121 个。被丢掉的很多落在那种周四式时段:成交带很吵,盘口却只有 1,100 USDT。原来的 Sharpe 用的是 198 笔全额成交。我不会把新的 Sharpe 当作策略的发现来报。那是成交模型的发现:一旦你不再在订单簿没有的价格上赏给它 25,000 USDT,很大一块「优势」不过是本该变成剩余单的完整成交。

周五:我们真正上线的,以及下次我会跳过的

我们留下的门槛很无聊。滚动的推动订单簿名义本金,只计入从某档吃掉数量的成交,必须超过下单量的 20×,而且我们在决策 K 线之前的那些 K 线上计量,好让当前这一分钟的刷单投不了票。强平成交另设上限:若近期推动订单簿成交量里超过四分之一是强平,策略停手。强制流是真实数量,在跟你抢。

冲击模型也吃了同一套减肥餐。旧模型用交易所成交量和我们的下单量推断一个 Kyle lambda。喂它刷单,lambda 就会下降,因为市场看起来很深。喂它推动订单簿的成交量,同一笔下单量在真正改写订单簿的量里占比大得多。随后几个时段的模拟盘滑点更靠近那个难看的数字。更靠近,不是一模一样。我们仍然看不见队列,100ms 的照片仍会漏掉一些真实数量。

下次我会跳过的,是整个第一个周一。不要从 ticker 起步,不要从 24h 成交量起步,不要让智能体把原始美元成交量既放进特征库又放进门槛,假装那是两个主意。那是同一条脏序列,用了两次。先做出与订单簿一致的成交带,哪怕这意味着你在有标的池之前,要在单一中盘上研究 2 天。按刷单过滤出来的标的池,是一份擅长看起来很忙的币名单。

另一件要跳过的:任何把通过成交量检查当成成交的成交模型。周二那笔残留才是策略本身。过滤器只能回答「有没有人在交易」。它回答不了「你的 25,000 是会挂着还是会消失」。第二个问题需要订单簿、剩余部分,以及 time-in-force,那是另一篇日记,也是我们本该写在这篇之前的那一篇。

刷单成交量加密货币回测市场微观结构
← 全部文章