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%。听起来不多?但一天几百万笔交易,丢个几千笔,策略就偏了。后来我加了个本地缓存和重传机制,才算搞定。
1.4 核心知识体系
说了这么多,我画张图帮你理一理。这张图展示了直连行情的基础架构和数据流向:
1.5 实战中的选择
说了这么多理论,到底怎么选?我个人的经验是:
- 看你的策略类型:高频策略必须直连,中低频用行情商就够了
- 看你的网络环境:如果和交易所同机房,UDP丢包率极低,可以大胆用
- 看你的容错能力:能接受偶尔丢数据吗?不能就老老实实走TCP
嗯,最后说一句。直连行情这条路,入门不难,精通不易。但只要你把协议解析、网络传输、数据重组这几个基本功打扎实了,后面写策略就是水到渠成的事。