2026年十月31日 · 微观结构

我们在 Binance 上回测,在 Bybit 上模拟交易。优势原来是滞后。

我们在 Binance 上回测,在 Bybit 上模拟交易。优势原来是滞后。

我们有一套 1 分钟 BTC 动量策略,在 Binance 上看起来很诚实。taker 手续费、资金费率、一项我们已经故意做得略偏苛刻的平方根冲击项。滚动前向也没让我们难堪。模拟账户开在 Bybit,因为密钥在那儿。我对自己说,BTC 就是 BTC。到周五,我手里的策略一直在交易一段我们成交不了的领先-滞后,Sharpe 则属于一家我们根本没有账户的交易所。

周一:一份干净的 Binance 回测

智能体吐出来的东西几乎无聊:15 根 K 线的收益对比一条慢均线,在下一根的开盘做多或做空,触及止损或 12 分钟后平仓。我们把它强制套到 Binance USD-M BTCUSDT 上,2023 年至 2026 年初,并且拒绝看任何未扣成本的数字。

扣掉 4.0 bps taker、按小时资金费率和冲击之后,滚动前向 Sharpe 落在 1.6。每笔成交的平均净优势是 3.4 bps。交易次数多到我懒得再去戳 bootstrap。我们为自己技术栈已经加上的延迟垫(信号到下单,好日子 40 毫秒)几乎没推动它。我记得当时隐约有点恼火,它居然没更脆弱一点。

周二:模拟账户开始「滑点」

模拟盘在 09:12 UTC 上线。同一套代码、同一组参数、同一条「下一根开盘」规则,指向 Bybit 的正向 BTCUSDT。第一个下午看起来像一连串倒霉。我们的成交比同一批分钟的 Binance 回放差 2–8 bps,而且总是朝交易方向偏。成交流水写的是滑点。我信了成交流水,直到那些更差的成交扎堆出现在 Binance 已经开始跑动的那些分钟上。

隔夜,缺口并没有像嘈杂成交模型那样均值回归。它就搁在那儿。Bybit 上的一笔买单成交在 Binance 早一拍已经给出的价格,然后 Bybit 才赶到,然后我们付了这个价。而策略想要的那些分钟,恰恰是两条行情带意见不合的分钟。安静的分钟里,两边收盘价叠在一起,策略并不在意。它在挑选分歧,并管那叫 alpha。

3.4 bps每笔 Binance 成交的平均净优势
4.1 bps我们实际交易的那些分钟上的收盘价差中位数
1.6 → 0.4Bybit 原生重跑后的滚动前向 Sharpe

周三:两条行情带,同一只时钟

我们拉了两边的最新成交源,按交易所时间戳对齐,然后问了一个不客气的问题:当 BTC 至少走出 2 个 tick,哪家场所先打出成交?平静时段里,大约三分之二的这类突发是 Binance 领先 Bybit,领先中位数大约 40 毫秒,这落在很多「我们加了延迟」的讨论之内,却在 1 分钟 K 线之外。周二 CPI 公布期间,领先拉长到数百毫秒,有那么难看的几秒,两边最新价相差 $80。我坐在那儿,两边盘口都开着,看着 Bybit 去追一部 Binance 已经放过的电影。

那就是这一周的味道,而它不在 Sharpe 里。你可以在理智上知道,加密货币的最新价是场所本地的。但看着同一枚币开在两个窗口里,意识到其中一个活在过去,是另一回事。

然后我们做了周一就该要求的那个测试。保留 Binance 信号。在 Bybit 的下一根开盘成交。如果你偷看流动性更好的行情带却在别处交易,这就是模拟账户真正的信息集,这也是一种你永远无法在规模上拿到的前瞻:你在用执行场所还没打出来的价格。优势掉到 0.6 bps。反过来(Bybit 信号,Binance 成交),你铸出一段幻想。同场所 Binance 仍是 3.4。所谓「策略」,多半只是待在更快的那本订单簿上。

如果你的信号场所领先于执行场所,研究行情带里每一笔下一根 K 线的成交,都是账户尚未被报出的价格。把这两只时钟混在一起,不是一个滑点参数。那是一笔编造的成交。

我们交易过的那些分钟上,1 分钟收盘价差的中位数是 4.1 bps。无条件地,在所有分钟上,大约是 1.5。当然。信号是在已经有人开始动的时候触发的。我们一直在被选中的样本上测优势,而那恰好是场所分歧栖身的地方。

我曾经以为最糟的场所 bug 是合约代码映射,BTCUSDT 对 BTC-PERP,一次静默复制仓位的拼接。那是簿记。这一次是在 CPI 期间同时看着两本订单簿,意识到我研究的是一个我并不交易的市场。

周四:资金费率、标记价和手续费也不是同一个市场

一旦你承认最新价不同,就得承认市场数据契约的其余部分也不同。我们把 Binance 的费率表抄进 Bybit 模拟账户,然后纳闷为什么成本那一行在漂移。

输入Binance 回测那一周的 Bybit 模拟
最新价Binance USD-MBybit 正向
Taker 手续费4.0 bps5.5 bps
资金费率间隔按小时00 / 08 / 16 UTC
标记价 / 指数Binance 篮子Bybit 篮子
最小数量 / tick0.001 / 0.100.001 / 0.10
强平计算从未触发,BTC标记价不同,仍从未触发

tick 和手数在 BTC 上碰巧一致。我不会把这推广开去。周四晚上我们瞄过的 SOL 订单簿上,tick 大小和最小名义价值都不一样,交易分钟上的收盘价差是 11 bps。资金费率是更慢的那道渗漏。Binance 按小时结算。Bybit 那张正向合约仍在 8 小时时钟上。一笔持过 01:00 UTC 的仓位,在研究账本里记了一笔 Binance 费用,模拟盘上却是沉默,然后在 08:00 砸下一整块,而回测早已把它一滴一滴记完了。持仓成本在一周尺度上对得上,在一个下午对不上,而这恰好是这套策略活着的时间尺度。

手续费几乎无聊,却仍然吃掉了 3.4 bps 故事里的 1.5 bps。人们把 4.0 对 5.5 当成脚注,因为它在 2% 的日波动旁边显得很小。它在 3.4 bps 的优势旁边并不小。我们早就知道这一点。我们只是把这知识用到了错误场所的费率表上。

周五:一次 Bybit 原生重跑

用 Bybit 的 OHLCV、Bybit 的资金费率时间戳、Bybit 的 5.5 bps 把整套东西重建一遍。同一条代码路径、同一组滚动前向切分、同一个冲击函数。Sharpe 0.4。平均净优势 0.9 bps,一旦你停止把 Binance 的第一眼白送给它,这已经落在 1 分钟 taker 策略的噪声里。

那是一个不同的市场,不是一个更吵的市场。模拟盘否定回测,并不是因为模拟在抽象意义上「更真实」。模拟一直在研究从未见过的订单簿里成交。那 1.6 在内部是自洽的。它自洽的是错误的那家交易所。

我们把 Binance 版本留在档案里,报告上加了一句:不要拿这个账户去对这条行情带做模拟。能继续跑的是 Bybit 版本,数字小到没人会为此发帖。这才是正确的结果。我仍有点想念那 1.6,而这恰恰说明它在做一份它还没挣到的工。

下次我们会跳过什么

那条捷径是社会学的。Binance 是每个供应商、每本研究笔记、每个智能体默认想塞给你的行情带。账户在你实际能开出来的地方。这两件事感觉像运维细节。它们就是回测本身。

  1. 先选定执行场所。用该场所的最新价、资金费率时间戳、标记价、tick 和费率档位来构建研究行情带。如果供应商的默认是 Binance,那不是默认。那是另一套策略。
  2. 如果拿不到你将要模拟交易的那个场所的历史,不要拿一条领先的行情带顶上,再把缺口叫做滑点。要么等,要么把外来行情带当作延迟信号,把它滞后到执行订单簿里本来就能看见的时刻。
  3. 把模拟和回测对照时,把漂移拆开:交易分钟上的最新价缺口、手续费那一行、资金费率时间戳、止损用的标记价。周二的成交流水把这四样混在一起,贴上了滑点的标签。
  4. 故意跑交叉测试。在 A 上取信号,在 B 上成交。如果全部优势都住在那儿,你没有策略。你有的是一段你无法在规模上成交的领先-滞后。

在 Bybit 上交易时,我还会偷看 Binance 吗?作为主观的健全性核对,会。作为成交,不会。模拟账户已经告诉我们那一偷看值多少。它值另一间房间先打出来的 4.1 bps,而那些我们拿不到。

加密期货回测模拟交易市场微观结构领先-滞后
← 全部文章