Adam DePrince 在木刻风格的软件工作室里,身边是穿着裤子的丝羽乌骨鸡

C++ / 低延迟系统 / 电子交易

Adam DePrince.

我构建不假装能看见未来的交易系统。

我构建从行情数据通往交易决策的完整路径:行情处理、因果式重放、流式分析、 低延迟状态与传输、交易执行周边基础设施、性能测量,以及由操作员控制的实盘交易。

我的开源参考部署使用 Massive 和 Alpaca,面向研究和日内策略。 它并不是交易所托管的高频交易平台。它的底层工程问题,却与更快的交易系统相同。

快速路径,以及围绕它的一切

电子交易底层的机器

低延迟并不来自某一个聪明的循环,而是整条路径的行为:数据如何进入、移动、 变成状态、形成决策,并且在负载下仍然能够被准确测量。

01

行情数据路径

在事件进入内部总线之前,完成原生数据摄取、分帧、解析、规范化和历史重放。

02

低延迟传输

共享内存环、RDMA、libfabric 与 EFA、XLIO、内核旁路,以及在普通 TCP 足够时使用普通 TCP。

03

事件分发

Goblin Core Pub/Sub 通过共享内存和其他低延迟传输,把规范化后的市场事件扇出到各个策略进程。

04

流式分析

因果式指标、在线模型、状态估计,以及随事件到达而增量更新的策略输入。

05

模拟

识别买卖价的历史重放、可配置延迟,以及不会暴露未来数据、只向前推进的策略语义。

06

测量

延迟分布、尾延迟分析、NUMA 布置、网络路径、基准设计和性能回归测试。

公开硬件和工作负载上下文

用测量说话的低延迟工程

这些是相互独立的组件测量,不是虚构的端到端交易延迟。 每个结果都链接到产生它的操作、传输方式、硬件和统计口径。

传输与事件总线实验室

Goblin Core

问题 在协议和传输开销至关重要的系统中,提供低延迟进程间消息和 Redis 兼容事件分发。

方法 RESP 和 SBE 可运行在共享内存环、单边 RDMA、libfabric/EFA、XLIO、Unix 套接字和 TCP 上。在参考交易系统中,Goblin Core 是总线并负责扇出,不作为交易状态存储。

测量 在 Threadripper 相邻绑定核心上,SBE 共享内存环完成一次紧凑 HSET 或 ZADD 请求/响应需 220 ns。原生 EFA 独立测试在两台 AWS hpc7g.4xlarge 上完成八种深度为一的操作,p50 算术平均值为 23.06 µs。

交易意义 为交易进程之间提供快速 Pub/Sub 扇出、传输实验和完整延迟分布,但不把组件结果冒充交易系统 SLA。

流式分析

RTTA

问题 有状态指标和在线模型必须按因果顺序前进,不能在每次事件到来时重建数组。

方法 固定状态的 C++23 算法、直接 Python 绑定,以及按顺序执行的批量或流式更新。

测量 当前目录包含 319 种公开因果算法。已发布的每次运行覆盖 247 种算法;Arm、x86 和 LoongArch 三类 CPU 的逐 CPU 中位数简单平均后,纯状态推进为 57.7 ns,更新并返回 Python 结果为 77.4 ns。

交易意义 分析状态可以在历史重放与实时运行中逐个观察值向前推进。

原生行情摄取

Goblin Slurp

问题 获得授权的商业 WebSocket 行情以帧到达,必须先被摄取、拆分并规范化,才能进入内部事件总线。

方法 C++23 桥接程序把源帧拆成独立事件,将 JSON 或 SBE 发布到 Goblin Core,并使用有界队列明确表达背压。

证据 这是正在运行的实时行情摄取组件;这里不宣称独立的延迟数字。

交易意义 Goblin Slurp 负责摄取。Goblin Core 接收规范化事件,再将其扇出到各个策略进程。

网络路径测量

Latency Lab

问题 在消息到达应用程序之前,包速率、分帧、压缩和排队就可能改变线上延迟。

方法 让 PCAP、PCAPNG 和 Nasdaq 风格二进制抓包通过可配置的速率与压缩阶段。

证据 输出逐层延迟 CDF、一直到 p99.99 的百分位数、出口大小和精确丢包归因。压缩计算时间目前明确不在模型中。

交易意义 在修改进入生产环境之前,先把行情路径的后果变成可以检查的数据。

增量市场图

negcycle

问题 一次报价更新不应该迫使系统重建所有可能的货币循环。

方法 在真实买卖报价上运行增量稠密 Bellman-Ford,并提供 AVX-512、AVX2、NEON 和 LASX 路径。

测量 在绑定至 Xeon 6975P-C 核心、包含 1,206 行真实市场数据的基准中,单边更新并精确求出最佳三货币循环的中位数为 0.445 µs。

交易意义 展示由报价触发、具有明确买卖方向语义的 SIMD 分析。

开发中

Goblin Cannon

问题 长距离行情传输不仅受软件影响,还受传播、频谱、编码和恢复行为约束。

方法 正在开发的 C++23 基带调制解调器设计,探索 QAM、前向纠错、Viterbi 解码、AES 和共享 SPSC 路径。

状态 目前只在单元测试环境中验证;不宣称无线电硬件、实地、跨大西洋或已部署延迟结果。

交易意义 探索如何把无线链路、编解码器和软件流水线视为一个延迟问题。

小型状态估计

fast-kalman

问题 小型状态空间模型不应该承担动态矩阵和逐次 Python 调用的高额开销。

方法 固定尺寸 C++23 Kalman 变体、直接绑定,以及支持不规则时间与观测方差的批量更新。

测量 在文档所述测试机器上,公开的二状态、单观测线性批量基准每个测量值耗时 43 ns。

交易意义 状态估计足够便宜,可以随观察值到达而持续更新。

传输工程的上下文 共享内存:220 ns 请求/响应 RDMA 环:2.673 µs RESP2 PING p50 本地 libfabric verbs:八种操作 p50 平均值 6.39 µs AWS EFA:八种操作 p50 平均值 23.06 µs XLIO:直接 100 Gb/s 链路上的深度一完整分布

真实架构,不演高频交易

一套端到端参考交易系统

这套参考部署不是高频交易系统。 它使用普通客户也能购买的 Massive 行情和 Alpaca 券商服务,面向研究与日内策略。

它展示快速路径周围的完整架构:因果式重放、流式状态、独立策略进程、 目标仓位意图、券商执行、可观测性和有意识的操作员干预。

行情数据 Massive 历史与实时数据 商业研究行情
历史 massive-speedup
实时 Goblin Slurp
决策进程 策略机器人 + RTTA 只向前推进的状态和目标仓位意图
实盘窄腰接口 Jinghong 目标仓位路由器 汇总、对账、路由、报告
券商 Alpaca 商业模拟盘或实盘券商

研究与实盘语义

结构上只向前推进

massive-speedup 读取压缩历史数据,建立按时间排序的存储,并在配置延迟之后、按照届时可见的买价或卖价模拟市价单。 策略代码无法偷看未来成交价。

历史重放和实时运行使用相同的前向分析模型与事件驱动策略形态。 市场适配器和运行基础设施不同;本站不声称回测与实盘的每一条代码路径都完全相同。

Jinghong 的小协议

通过窄腰接口表达目标仓位

  • 机器人在目标仓位变化时发布仓位意图,并且每五秒发送一次心跳。
  • 心跳有效时,Jinghong 保留最近一次意图;静默超过 15 秒后,该机器人的意图被视为零。
  • 机器人启动时先明确宣布零仓位,在积累足够实时状态形成判断之前保持为零。
  • Jinghong 汇总有效意图,与实际持仓对账,再通过 Alpaca 发送市价单。
  • 系统目前使用市价单,因为回测引擎目前模拟的就是市价单。
  • 重启后的机器人自行负责预热。系统不宣称崩溃机器人能够透明热重启或自动重放市场。

Hyperion / 实盘控制

操作员控制

Hyperion 是观察实盘系统并有意识进行干预的操作界面。它不是监管平台, 也不自称完整的机构级盘前风险系统。

观察

  • 实时查看持仓和表现。
  • 查看每个机器人最近一次心跳的时间。
  • 查看 Alpaca 总消息速率。
  • 查看每个机器人的意图消息速率,识别异常意图风暴。

干预

  • 禁用单个机器人。
  • 取消该机器人的未完成订单。
  • 有意识地清算持仓。
  • 启动交易或手工管理持仓。

禁用机器人、取消未完成订单和清算持仓是三种不同的动作。 Hyperion 不会推断策略的回看窗口、预热要求、模型状态、预期交易频率或可接受回撤。 它与机器人的协议有意保持很小。

这些工程有其来路

为什么是 Adam

我曾在 Quantlab 和 Massive.com 从事量化与行情系统工作, 在 S&P Global 处理大规模金融数据,也在 Google 和 Amazon 从事大规模工程。

我的开源工作把这条路线搬到公众面前。我构建行情处理器、传输、状态引擎、 模拟器、测量工具和操作界面,而不是把孤立的内核包装成完整系统。

参考平台不是高频交易系统。它下面的工程公开实现并测量了更快的电子交易系统 所依赖的许多基础机器。

主线之外的广度

交易之外的系统工程

存储、SIMD、非主流架构、网络和 Python 内部机制现在排在页面下方, 但没有消失。它们展示支撑交易工程的技术广度。

大对象存储

Goblin Store

用 RAM 保存对象头部,通过异步 SSD 与 HDD 提供尾部的 Memcached 兼容服务。

序列比对

stride-align

覆盖 x86、Arm、LoongArch 和 RISC-V 的 SIMD 比对与距离内核。

LoongArch 生态

DragonArray

LoongArch 软件包、NumPy LASX、超越函数 SIMD 和 BLAKE3 移植。

外部排序

bsort

面向局部性和大于内存的数据集设计的定长记录排序。

恶劣网络

mosh 补丁

Agent、套接字、SOCKS、X11 和流转发,以及采用 FEC 的大文件传输。

解释器内部机制

CPython SIMD

面向编解码器、文本、字节、JSON、CSV、URL 和哈希的运行时 SIMD 实验。

数值计算

NumPy LASX

面向 Loongson 系统的 256 位 LASX 概念验证移植。

Goblin Reactor

把棘手的交易系统问题带给我

我用开放系统证明能力。Goblin Reactor 把这些能力带进客户的系统。

这里出售的是系统与性能工程:行情路径、延迟、内存、网络、分析基础设施和生产行为。 不出售交易信号、Alpha 或投资建议。

把问题交给 Goblin Reactor
电子邮件
f"{given_name.lower()}.{family_name.lower()}@gmail.com"
电话
f'{2**8}-{2*3**2*37}-{13*101}'
GitHub
github.com/adamdeprince
开发笔记
adamdeprince.com/zh-CN/blog