源文件:research/quant_digests/2026-04-18_1048_triangular-crossrate-loop-alpha.md
bookTicker live public-data portability probe同一交易所、同一时点的多币对买一卖一若无法满足 cross-rate 一致性,存在可闭环执行的三腿汇率套利收益这轮主看的是 GitHub 仓库 Drakkar-Software/Triangular-Arbitrage,核心文件包括:
README.mdtriangular_arbitrage/detector.pytests/test_detector.py它做的事情很直接:把交易对当成有向图上的边,遍历闭环路径,找出乘积大于 1 的 cycle。repo 默认用的是 last/close 价,不含买卖价差、不含手续费、不含执行顺序约束;所以它给的是一个 raw alpha 探测器,不是现成可上线的 execution engine。
但它的优点也正好在这里:base alpha 非常清楚,不是 overlay,不是 filter,就是最朴素的 Law-of-One-Price 偏离——同一撮同步报价之间,若 A -> B -> C -> A 的净兑换率大于 1,就有套利闭环。
cross-rate inconsistency -> immediate mean reversion / closure。bookTicker 版,用 bid/ask 和每腿费用去重算;结果很明确——裸 gross 确实经常有正值,但一上现实费用,公开顶档盘口下几乎全灭。我对 Binance Spot USDT / USDC / FDUSD / BTC / ETH / BNB / SOL / XRP / DOGE / ADA / LINK 做了约 90 秒、每秒一次的 top-of-book 扫描,只保留从 USDT 出发的三腿闭环:
90/90 个样本都能找到正的闭环,median 约 +1.50 bps,最好约 +4.68 bps。0/90 个样本为正,best 也只有 -7.32 bps。0/90 个样本为正,median 约 -28.47 bps。最常出现的最佳闭环是:
USDT -> ETH -> USDC -> USDT这说明什么?说明 edge 本体是存在的,而且公开数据一眼就能复现;但 它首先是 execution / fee / queue-priority 问题,不是信号是否存在的问题。
虽然公开 top-of-book + taker 口径下 first verdict 偏负,但这题仍值得保留,原因有三个:
很多“结构类”主题其实只有 filter 意义;但三角套利不是。它的 base alpha 可以直接写成:
净环收益 = Π(逐腿可成交汇率) - 1
只要 净环收益 > 全部费用 + 执行缓冲,就能做;做完就平,没有方向暴露。这个定义足够干净,能独立存在。
1m / 3m / 5m 甚至更快的最小实验这类信号不是日频/小时级宏观条件,而是秒级到分钟级的闭环偏离。对我们 desk 来说,很适合拿来做:
即便最后不单独上线 tri-arb,本题也能沉淀出一个很值钱的组件:
USDC / FDUSD)相对 USDT 出现短时错位时,很多同 underlier 的跨报价 spread、pair residual、stablecoin spread fade 都会被一起污染。也就是说:这题既可以被当 raw alpha 主体,也可以降级复用成其它 relative-value 策略的风控层。
同所同步报价中的三腿 cross-rate inconsistency 会被迅速修复bid/ask 而不是 lastexpected_net_bps > fee + slippage_buffer + latency_bufferk 档累计可成交量确定triangular_arbitrage/detector.py 的关键价值不是“能找到 cycle”本身,而是它把问题抽象成了:
1 就是候选机会。这让它天然可迁移到:
3 条腿,而不是所有闭环;bid/ask 替代 close;所以 repo 本身虽然只是探测器,但它提供了一个很干净的 alpha skeleton。
同一所 spot 报价中,若某三腿循环在真实 bid/ask 与手续费后仍存在稳定正净值,则可形成可交易的短周期 stat-arb pocket。
GET /api/v3/ticker/bookTicker1s 轮询先做 feasibility;若要更严谨,再上 websocket best bid/askUSDT / USDC / FDUSD / BTC / ETH / BNB / SOL3 条腿,从 USDT 出发回到 USDTbase -> quote 用 bidquote -> base 用 1/askgross = Π(rate_i)net = gross × Π(1-fee_i) - 1本地已生成:
reports/artifacts/quant_digests/2026-04-18_triangular_arb_bookticker_probe.csvreports/artifacts/quant_digests/2026-04-18_triangular_arb_bookticker_summary.json结果摘要:
fee=0 bps/leg:positive_rate = 100%,median +1.50 bpsfee=4 bps/leg:positive_rate = 0%fee=10 bps/leg:positive_rate = 0%USDT>ETH>USDC>USDT9.5 ~ 37054 USDT 之间,但这只是顶档理论容量,不代表三腿都能无冲击完成公开盘口已经说明:如果你只是普通 taker,edge 很大概率会被费用直接吃掉。
close/last,会系统性高估机会;不能直接拿来下单。别再继续做 last-price 图搜索了,下一步应该是这 4 件事:
bookTicker 升级成 websocket BBO 流:看正净值机会的持续时间,而不是只看轮询快照。3~5 档累计深度:算真实可成交名义和冲击后净值。USDT/USDC/FDUSD + BTC/ETH/SOL 的稳定币相关闭环:因为这轮 live probe 里最佳环长期集中在 quote fragmentation 最强的位置。如果这 4 步下来仍为负,就把 tri-arb 从“主策略候选”降级成:
bookTicker 公共 REST / websocket,公开可得positive_rate / best_bps / median_bps / capacityhttps://github.com/Drakkar-Software/Triangular-Arbitragehttps://github.com/Drakkar-Software/Triangular-Arbitrage/blob/master/README.mdtriangular_arbitrage/detector.pytests/test_detector.pyhttps://api.binance.com/api/v3/ticker/bookTickerreports/artifacts/quant_digests/2026-04-18_triangular_arb_bookticker_probe.csvreports/artifacts/quant_digests/2026-04-18_triangular_arb_bookticker_summary.json这题的答案不是“有没有 alpha”——有,而且公开数据很容易看到;真正的问题是:你的费用、延迟、排队权和执行兜底,够不够把这点 alpha 留在自己账上。