一、交易系统概述:券商交易系统的架构演进、核心功能模块与接口开发定位
各位同学,今天咱们聊聊券商交易系统的整体面貌。说实话,我刚入行那会儿,交易系统远没有现在这么复杂。那时候一台服务器、一个数据库,就能撑起一个营业部的交易。现在呢?你想想看,一个中等规模的券商,后台服务器少说上百台,中间件、消息队列、缓存层,层层叠叠。
为什么会这样?因为市场变了,交易量上去了,监管要求也严了。我经历过一次系统升级,从老架构切到新架构,整整熬了三个通宵。嗯,这里要跟大家分享一个经验——理解系统架构的演进,比学会写几行代码重要得多。
1.1 架构演进:从单体到分布式
券商交易系统的架构演进,说白了就是三个字:拆、分、合。
- 第一阶段:单体架构(2000年前后)——行情、交易、风控全在一个进程里。好处是简单,坏处是改一个模块就得重启整个系统。我记得有一次,为了加一个风控指标,整个营业部停了15分钟交易,被客户骂得狗血淋头。
- 第二阶段:分层架构(2010年左右)——把行情、交易、风控拆成独立服务。这时候开始引入消息中间件,比如早期的IBM MQ,后来换成Kafka。我个人习惯用Kafka,吞吐量确实高。
- 第三阶段:微服务+分布式(现在)——每个核心功能拆成多个微服务,比如订单服务拆成下单、撤单、查询三个独立服务。再加上分布式缓存(Redis)、分布式数据库(TiDB),系统复杂度上了一个台阶。
核心观点:架构演进的本质,是为了解决「高可用」和「低延迟」这对矛盾。单体架构延迟低但不可靠,分布式架构可靠但延迟高。好的架构师,就是在两者之间找到平衡点。
下面这张图,是我自己画的券商交易系统核心架构图,你们感受一下:
1.2 核心功能模块详解
交易系统有四个核心模块,缺一不可。我按数据流的顺序给大家捋一遍:
1.2.1 行情模块
行情是交易系统的「眼睛」。没有行情,交易员就是瞎子。行情模块负责接收交易所的实时数据,包括:
- Level-1行情:每3秒一次快照,包含最新价、涨跌幅、成交量等基础数据
- Level-2行情:逐笔成交、十档买卖盘口,延迟在毫秒级
- Tick数据:每一笔成交的详细记录,用于回测和分析
我在项目中遇到过一个问题:行情网关同时接收沪深两个交易所的数据,结果因为网络抖动,深交所的数据比上交所晚了200毫秒。你想想看,量化策略如果同时依赖两个市场的行情,这200毫秒的偏差足以让策略失效。后来我们加了时间戳对齐和延迟补偿机制,才算解决。
避坑指南:行情模块最容易踩的坑是「数据乱序」。我曾经因为没处理好行情包的序号,导致策略在盘中频繁报错。解决方案很简单——每个行情包都带一个序列号,接收端按序列号排序后再处理。
1.2.2 交易模块
交易模块是系统的「心脏」。它负责把客户的委托指令发到交易所,并把成交结果返回给客户。核心流程如下:
- 委托接收:通过交易网关接收客户的下单请求
- 订单校验:检查证券代码、数量、价格是否合法
- 风控检查:调用风控模块进行资金、持仓校验
- 订单路由:根据证券品种,路由到对应的交易所网关
- 成交回报:接收交易所的成交确认,更新订单状态
这里有个细节:订单状态机。一个订单从「已报」到「已撤」再到「部成」,状态变化非常复杂。我建议你们画一张状态机图,把每个状态之间的转换条件写清楚。不然上线后出了bug,查起来真要命。
1.2.3 风控模块
风控是系统的「刹车」。没有风控,交易系统就是脱缰的野马。风控分三个层次:
| 风控类型 | 检查时机 | 典型规则 |
|---|---|---|
| 事前风控 | 下单前 | 资金是否充足、持仓是否足够、是否在涨跌停范围内 |
| 事中风控 | 交易中 | 单笔委托金额上限、日内累计交易量上限、自成交检查 |
| 事后风控 | 收盘后 | 异常交易行为分析、合规报告生成 |
说实话,风控模块是最容易出问题的。我记得有一次,一个客户用程序化交易下单,因为风控模块的缓存没及时更新,导致他连续下了100笔重复委托。虽然事后撤单了,但交易所那边还是给了警告。从那以后,我坚持风控模块必须用「实时查询+缓存双写」的模式。
警告:风控模块的延迟不能超过1毫秒。如果风控检查耗时超过10毫秒,交易模块的吞吐量会直接腰斩。我曾经见过一个系统,风控模块用了数据库查询,结果每秒只能处理200笔委托——这完全不可接受。
1.2.4 清算模块
清算是系统的「账本」。每天收盘后,清算模块负责:
- 资金清算:计算每个客户当日的应收应付资金
- 证券交割:更新客户的持仓数据
- 对账服务:与交易所、登记结算公司进行数据核对
- 报表生成:生成交易结算单、资金流水等报表
清算模块有个特点:它不要求实时性,但要求绝对准确。一分钱都不能差。我见过最夸张的一次,清算对账差了0.01元,结果整个团队查了三天,最后发现是浮点数精度问题。嗯,这里提醒大家:涉及金额的计算,一律用整数(分)或者Decimal类型,别用浮点数。
1.3 接口开发在整个系统中的定位
好了,前面讲了那么多架构和模块,现在回到咱们课程的核心——接口开发。
接口开发是什么?说白了,就是连接各个模块的「桥梁」。没有接口,行情模块的数据传不到交易模块,交易模块的指令发不到交易所,风控模块也拿不到订单信息。
接口开发在整个系统中的定位,我总结为三点:
- 数据通道:接口负责在不同模块之间传递数据。比如行情接口把实时数据推给策略引擎,交易接口把委托指令发给交易所网关。
- 协议转换:不同系统可能使用不同的通信协议。比如交易所用FIX协议,内部系统用gRPC,接口层负责做协议转换。
- 性能瓶颈:接口往往是整个系统的性能瓶颈。你想想看,行情接口每秒要处理几万笔数据,交易接口的延迟必须控制在微秒级。接口写得好不好,直接决定了系统的吞吐量和延迟。
我个人习惯把接口开发分成三层:
- 底层接口:与交易所、行情源直接通信,使用TCP/UDP、FIX协议
- 中间层接口:内部模块之间的通信,使用gRPC、消息队列
- 上层接口:对外暴露的API,使用RESTful、WebSocket
在后面的课程中,我会带着大家从底层接口开始,一步步搭建一个完整的交易系统接口层。你会学到如何用C++写高性能的行情接收器,如何用Java写稳定的交易网关,如何用Python写灵活的策略接口。
嗯,今天就先到这里。记住一句话:接口开发不是简单的「调API」,而是理解整个交易系统的「经络」。经络通了,系统才能跑得顺畅。
本章小结:
- 券商交易系统经历了单体→分层→微服务的架构演进
- 四大核心模块:行情(眼睛)、交易(心脏)、风控(刹车)、清算(账本)
- 接口开发是系统的「桥梁」,决定了系统的性能和可扩展性
公众号:蓝海资料掘金营,微信deep3321