一、行情系统概述

做量化系统这么多年,我始终觉得行情系统是整个交易链路里最容易被低估的一环。很多人一上来就盯着交易引擎、策略模型,结果行情数据还没到,策略就已经输了。说白了,行情系统就是交易系统的「眼睛」——眼睛不好使,再快的腿也没用。

1.1 什么是低延迟行情系统

低延迟行情系统,核心任务就一个:把交易所的行情数据,以尽可能快的速度、尽可能完整的形态,送到策略端

我习惯把它拆成三个环节来看:

  • 行情接入:从交易所的行情网关接收数据,通常是UDP组播或者TCP流
  • 行情处理:解码、校验、重组、缓存,有时候还要做快照合成
  • 行情分发:把处理好的数据推给策略进程,或者存到磁盘里

你想想看,一个高频交易策略,从行情到达、信号计算、到订单发出,整个链路可能也就几十微秒。行情系统如果慢了,后面的所有优化都是白搭。

核心定义:低延迟行情系统,是指在微秒甚至纳秒级别内完成行情数据的接收、处理与分发的系统。它不追求「大而全」,而是追求「快而稳」。

1.2 核心指标

衡量一个行情系统好不好,我一般看三个指标:延迟、吞吐量、抖动。这三个指标缺一不可。

指标 定义 典型要求 我的经验
延迟 从交易所发出行情到策略收到数据的时间差 < 10 微秒(P50),< 50 微秒(P99) 我见过最夸张的项目,延迟要求是 5 微秒以内,连网卡中断合并都得关掉
吞吐量 单位时间内能处理的行情消息数量 百万级消息/秒 国内期货市场,单品种一天能产生几百万笔逐笔成交,吞吐量不够直接丢数据
抖动 延迟的波动程度,通常用 P99 - P50 来衡量 < 20 微秒 抖动比延迟更可怕。延迟高可以预测,抖动大策略根本没法做风控

避坑指南:我曾经在一个项目里只盯着 P50 延迟,结果 P99 抖动达到 200 微秒。策略在大部分时间跑得挺好,但每隔几秒就卡一下,直接导致做市商策略频繁撤单。后来我才意识到,对于高频交易来说,P99 比 P50 重要得多

1.3 应用场景

低延迟行情系统不是万能的,但在下面几个场景里,它是刚需。

高频交易

高频交易的核心就是「快」。谁先拿到行情,谁就能先下单。我见过一个做期货跨期套利的团队,他们的行情系统延迟比对手慢了 3 微秒,结果一年下来少赚了上千万。嗯,3 微秒,就是一根光纤从上海到杭州的时间。

做市商

做市商需要同时维护买卖双边报价,行情抖动直接导致报价失效。我记得有个做市商朋友跟我说过:「行情系统抖一下,我的报价单就全废了。」做市商对行情系统的要求,不仅仅是快,还要稳——延迟可以稍微高一点,但绝对不能抖。

策略回测与仿真

这个场景很多人会忽略。回测时如果行情数据不完整、时间戳不精确,策略在实盘里就会「水土不服」。我习惯把行情存储系统也纳入低延迟体系里——存得快,才能回测得准

1.4 系统整体架构概览

下面这张图是我自己画的一个行情系统整体架构。它不算复杂,但每个模块都有讲究。

低延迟行情系统整体架构 交易所行情源 行情接入层 UDP组播接收 · TCP流解析 · 协议解码 行情处理层 数据校验 · 快照合成 · 增量合并 · 时间戳校准 行情存储 磁盘写入 · 文件归档 行情分发 共享内存 · 零拷贝 · 组播 策略接入 回调接口 · 事件驱动 策略引擎 · 回测系统 · 风控系统 · 监控面板

这个架构图里,我刻意把「行情存储」和「行情分发」放在同一层。为什么?因为在实际项目中,存储和分发往往是同一个模块的两个功能——数据既要实时推给策略,也要落盘留作回测。我习惯用共享内存做分发,用异步IO做存储,两者互不干扰。

注意:很多初学者会把行情存储做成「先存后发」,也就是等数据写进磁盘再推给策略。这个做法在低延迟场景下是致命的——磁盘IO的延迟是微秒级的,而行情分发要求纳秒级。正确的做法是先发后存,或者并发处理

好了,这一章我们先把行情系统的「骨架」搭起来。后面的章节,我会带着你一步步把每个模块的细节抠清楚——从网卡配置到内存管理,从协议解码到文件格式设计,咱们一个一个来。


专注资料整理