MarketMaker.cc Team
量化研究与策略
MarketMaker.cc Team
量化研究与策略
《期货与现货之间的复杂套利链》系列第 6 部分
想象一位指挥家同时领导着五个交易所的管弦乐队。每种乐器都在发挥自己的作用,在第一个音符和最后一个音符之间的时间不应超过几毫秒。一个错音,套利机会就会变成亏损:一个交易所的订单成交了,而另一个交易所的价格却消失了。
这是“期货与现货之间的复杂套利链”系列的第六部分,也是最具实践意义的一部分。我们将深入到字节、缓存行(Cache line)和原子操作(Atomic operations)的层面。
多步套利的高超低延迟执行系统架构:从接收市场数据到发送订单仅需 2-6 毫秒。
为了实现亚毫秒级的精度,我们需要绕过传统的瓶颈。
io_uring 通过在用户空间和内核之间共享内存环来提供异步 I/O。一旦初始化,从多个 WebSockets 读取数据等操作几乎不需要系统调用(Syscall)。
use io_uring::IoUring;
struct UringReader {
ring: IoUring,
buffers: Vec<Vec<u8>>, // 预分配的缓冲区:每个交易所一个
}
大多数交易所使用 JSON。simd-json 使用 SIMD 指令进行并行解析,比标准解析器提供 2-4 倍的加速。
在高频交易(HFT)环境中,订单簿上的互斥锁(Mutex)是一个巨大的瓶颈。我们使用 crossbeam-skiplist 进行 复杂度的无锁搜索:
use std::sync::atomic::{AtomicU64, Ordering};
use crossbeam_skiplist::SkipMap;
struct PriceLevel {
price: AtomicU64,
total_qty: AtomicU64,
}
struct LockFreeOrderBook {
bids: SkipMap<Reverse<u64>, PriceLevel>,
asks: SkipMap<u64, PriceLevel>,
}
预分配的、具有缓存行对齐(64 字节)的环形缓冲区是执行流水线的核心。它允许市场数据并行流经订单簿更新程序、策略引擎和风险监控器,实现零拷贝。
我们使用三个维度来模拟滑点:
多步套利策略永远不是原子化的。一步成交了,而其他步可能失败。我们使用 Rust 的类型状态模式(Type-State Pattern),将无效的状态转移在编译时就变成错误。
// 将状态作为类型。无效的转移将无法编译。
struct Idle;
struct Validating;
struct ExecutingLeg;
struct FullyFilled;
struct RollingBack;
struct Execution<State> {
trade_id: u64,
legs: Vec<TradeLeg>,
_state: PhantomData<State>,
}
一个三级**熔断机制(Circuit Breaker)**保护系统免受灾难性市场波动的影响:
通过优化的 Rust 代码,我们的延迟预算如下:
Rust 是执行复杂套利的完美语言。它提供了 C++ 的底层控制能力,同时兼具金融系统所需的安全保证。
这结束了我们关于“复杂套利链”的系列文章。从图算法和 Copulas 到机器学习和纳秒级执行,你现在已经拥有了构建专业级加密货币套利系统的蓝图。
准备好大规模执行了吗?请在 GitHub 上克隆我们的 HFT 执行引擎。