1. 行情数据基础:直连行情与交易所协议

做量化交易这些年,我见过太多人一上来就扎进策略开发,结果连行情数据怎么来的都没搞清楚。说实话,这是个大坑。今天我们就聊聊最基础的东西——直连行情到底是什么,交易所怎么把数据塞给你的,以及TCP和UDP在里头扮演什么角色。

1.1 什么是直连行情?

直连行情,说白了就是跳过中间商,直接从交易所的行情网关拿数据。你想想看,市面上那些行情软件,比如通达信、同花顺,它们的数据是经过一层层转发的。延迟?少说几十毫秒起步。

直连就不一样了。你的程序直接连到交易所的行情服务器,数据从撮合引擎出来,到你手里,中间几乎没有转发环节。我做过一个测试,同样的合约,直连比通过行情商快了至少5-10毫秒。别小看这几毫秒,高频策略里这就是真金白银。

核心要点: 直连行情 = 跳过中间商 + 低延迟 + 原始数据格式

嗯,这里要注意。直连行情虽然快,但代价也不小。你得自己处理协议解析、数据重组、断线重连这些脏活累活。不过话说回来,想赚这份钱,就得吃这份苦。

1.2 交易所数据协议概述

国内主流交易所,比如上期所、大商所、郑商所、中金所,每家都有自己的数据协议。我刚开始接触时,看着那几百页的协议文档,头都大了。但后来发现,其实核心就那几样东西。

交易所的行情数据,通常包含以下内容:

  • 行情快照:买卖盘口、最新价、成交量、持仓量等
  • 逐笔成交:每一笔交易的详细信息
  • 订单簿变化:委托队列的增删改
  • 统计信息:开盘价、最高价、最低价、收盘价等

每家交易所的协议格式都不一样。举个例子:

交易所 协议类型 编码方式 特点
上期所 二进制 Little-Endian 字段紧凑,解析快
大商所 二进制 Big-Endian 带校验和,安全性高
郑商所 二进制 + XML 混合编码 配置信息用XML,行情用二进制
中金所 STEP协议 ASCII 基于FIX协议,文本格式

我记得有一次,我接手一个老项目,里面解析上期所行情时,字节序搞反了。结果所有价格都翻了好几倍,差点把策略给干爆仓。从那以后,我每次写协议解析,第一件事就是确认字节序。

1.3 TCP与UDP在行情中的应用

这个问题很有意思。为什么有的交易所用TCP,有的用UDP?其实背后是延迟和可靠性的权衡。

TCP:可靠但慢

TCP有三次握手、拥塞控制、重传机制。这些保证了数据不丢、不乱序。但代价就是延迟高。你想想看,行情数据每秒几千笔,如果每笔都要确认,那延迟就上去了。

我个人习惯,对于订单簿快照这种关键数据,用TCP。因为丢了一帧,整个盘口就乱了。但如果是逐笔成交,我会考虑UDP。

UDP:快但不可靠

UDP就是发出去就不管了。速度快,但可能丢包、乱序。交易所通常会在UDP上做一层自己的可靠性机制,比如序列号、重传请求。

我曾经在一个项目中,用UDP接收逐笔成交。结果发现,高峰期丢包率能达到0.5%。听起来不多?但一天几百万笔交易,丢个几千笔,策略就偏了。后来我加了个本地缓存和重传机制,才算搞定。

实战建议: 如果条件允许,同时订阅TCP和UDP两路行情。TCP做主通道,UDP做辅助。当UDP丢包时,用TCP补全。这样既有速度,又有可靠性。

1.4 核心知识体系

说了这么多,我画张图帮你理一理。这张图展示了直连行情的基础架构和数据流向:

交易所撮合引擎 行情数据源 TCP/UDP 协议解析层 二进制/STEP/XML 字节序转换 策略系统 TCP 适用场景 • 行情快照(必须可靠) • 订单簿全量数据 • 登录/认证信息 • 控制指令 UDP 适用场景 • 逐笔成交(高吞吐) • 行情快照增量更新 • 心跳包 • 非关键统计信息
避坑指南: 我曾经犯过一个错误——在UDP通道上传输订单簿快照。结果网络抖动时,盘口数据全乱了,策略直接报错。记住:关键数据走TCP,非关键数据走UDP。这个原则别搞反了。

1.5 实战中的选择

说了这么多理论,到底怎么选?我个人的经验是:

  1. 看你的策略类型:高频策略必须直连,中低频用行情商就够了
  2. 看你的网络环境:如果和交易所同机房,UDP丢包率极低,可以大胆用
  3. 看你的容错能力:能接受偶尔丢数据吗?不能就老老实实走TCP

嗯,最后说一句。直连行情这条路,入门不难,精通不易。但只要你把协议解析、网络传输、数据重组这几个基本功打扎实了,后面写策略就是水到渠成的事。

专注资料整理