第二章:金融期货交易系统架构

做量化交易这些年,我见过太多人一上来就扎进策略细节里。结果呢?策略跑得挺好,一上实盘就崩。说白了,你不理解交易系统的整体架构,就像盖楼不打地基——早晚要出事。

这一章,我带你看看金融期货交易系统的完整骨架。我们从分层架构讲起,再拆解核心组件,最后把数据流和指令流理清楚。嗯,这些都是我踩过坑之后才真正搞明白的东西。

2.1 交易系统分层架构

一个成熟的金融期货交易系统,通常分为四层。我个人习惯这样划分:

层级 名称 核心职责 延迟要求
L1 接入层 行情接入、交易接口封装 微秒级
L2 核心业务层 策略计算、风控检查、订单管理 毫秒级
L3 服务支撑层 账户管理、资金核算、日志存储 秒级
L4 监控管理层 系统监控、告警、运维 分钟级

你想想看,为什么要把延迟要求不同的模块分开?我在项目中遇到过,有人把风控和策略写在同一个线程里,结果风控计算慢了几毫秒,策略那边行情都变了三遍了。这就是典型的「不分层」的教训。

核心原则:每一层只做自己的事,层与层之间通过轻量级消息传递。千万别让慢模块拖累快模块。

2.2 核心组件详解

交易系统里,有四个组件是绕不开的。我一个个说。

2.2.1 行情组件

行情组件是系统的「眼睛」。它负责从交易所接收实时数据,然后分发给策略模块。

  • 数据源:CTP、飞马、易盛等柜台接口
  • 数据格式:通常为Tick级数据(每笔成交)或快照数据(每秒2-4次)
  • 关键指标:行情到达延迟、数据完整性、时间戳精度

我记得有一次,行情组件因为网络抖动丢了一个Tick,策略那边直接开仓方向搞反了。从那以后,我坚持在行情组件里加一个「序列号校验」——每个数据包都带序号,丢了就补,绝不将就。

2.2.2 策略组件

策略组件是系统的「大脑」。它根据行情数据做出买卖决策。

这里有个常见的误区:很多人觉得策略就是写个公式。其实不然。策略组件要处理的事情很多:

  1. 信号生成:基于技术指标、统计模型或机器学习
  2. 订单生成:把信号转成具体的买卖指令(价格、数量、方向)
  3. 订单管理:跟踪订单状态,处理撤单、改单

我的建议:策略组件里一定要做「状态机」。每个订单从「已发送」到「已成交」或「已撤销」,状态流转必须清晰。否则,你根本不知道自己的单子到底在哪。

2.2.3 风控组件

风控组件是系统的「刹车」。没有它,再好的策略也可能爆仓。

风控检查通常分两层:

  • 事前风控:下单前检查——资金够不够?持仓超没超限?频率是不是太快?
  • 事后风控:成交后检查——盈亏是否在阈值内?风险敞口是否过大?

警告:风控组件必须独立于策略组件运行。我曾经见过一个系统,风控和策略共用同一个进程,结果策略崩了,风控也跟着挂了——这等于裸奔。

2.2.4 下单组件

下单组件是系统的「手脚」。它负责把策略的指令发到交易所。

下单组件最核心的能力就两个:

  • 低延迟:从收到指令到发出网络包,控制在微秒级
  • 高可靠:不丢单、不重单、不乱序

嗯,这里要注意。下单组件里有一个「重传机制」的设计难点。如果交易所没返回确认,你重不重发?重发可能造成重复下单,不重发可能漏单。我的做法是:每个订单生成时带一个唯一ID,交易所那边做幂等处理。这样重发也不怕。

2.3 数据流与指令流

理解了组件,我们再看看数据是怎么在系统里流动的。我画了一张图,帮你理清这个流程。

金融期货交易系统数据流与指令流 交易所 行情数据流 行情组件 行情数据 策略组件 指令流(下单请求) 风控组件 指令流(通过/拒绝) 下单组件 指令流(订单发送) 图例 行情数据流 指令流 订单发送 风控反馈

从这张图你能看到,数据流和指令流是两条线:

  • 数据流(蓝色):交易所 → 行情组件 → 策略组件。这是单向的,行情数据只进不出。
  • 指令流(橙色/紫色/红色):策略组件 → 风控组件 → 下单组件 → 交易所。这是双向的,每个环节都有反馈。

为什么要把数据流和指令流分开?说白了,就是怕互相干扰。行情数据量大、频率高,如果和指令流混在一起,下单延迟会变得不可控。我在项目中遇到过,有人把行情处理和下单处理放在同一个队列里,结果行情一爆发,下单排队排到天荒地老。

关键设计原则:数据流走「发布-订阅」模式,指令流走「请求-响应」模式。两条通道物理隔离,互不干扰。

2.4 实战中的架构取舍

讲完理论,我说点实际的。你在设计交易系统架构时,一定会遇到几个选择题:

第一,进程内还是进程间通信?

我的建议是:行情和策略之间用共享内存(进程内),延迟最低。策略和风控之间用TCP或Unix Socket(进程间),隔离性好。为什么?因为行情数据量大,共享内存能省掉序列化和网络开销。而风控需要独立运行,万一崩了不能影响策略。

第二,同步还是异步?

下单组件必须用异步。你想想看,如果下单是同步的,一个订单没成交,整个系统就卡住了。异步的好处是:发完单子就继续干别的,等交易所返回了再处理。嗯,这里要注意,异步编程的复杂度更高,要做好回调管理和超时处理。

第三,单线程还是多线程?

行情处理和下单处理,我建议用单线程。为什么?因为多线程有锁竞争、上下文切换,这些都会增加延迟。单线程配合非阻塞I/O,反而能跑出更低的延迟。策略计算如果比较重,可以单独开线程,但要注意和行情线程的同步。

避坑指南:我曾经在一个项目里用了多线程处理行情,结果因为锁竞争,行情到达延迟从5微秒飙到了50微秒。后来改成单线程+无锁队列,延迟直接降到2微秒。所以,能单线程就别多线程,能无锁就别加锁。

好了,这一章的内容就这些。你理解了交易系统的分层架构、核心组件和数据流,后面再讲优化就有基础了。记住一句话:架构设计决定了系统的上限,而优化只是把上限兑现出来。


公众号:蓝海资料掘金营,微信deep3321