第三章 系统架构设计总览:从交易接口到风控模块,一个做市系统的全貌
做市系统长什么样?
很多人一上来就问我:「能不能直接给我一套代码跑起来?」
我理解这种急切。但说实话,没有架构思维,你拿到的代码就是一堆定时炸弹。我在第一家公司做期权做市时,就吃过这个亏——系统跑了两周,突然某天盘口报价全乱,风控模块根本没触发。查了一整夜,发现是订单管理模块和行情模块之间共享了一个全局变量,被并发写坏了。
嗯,从那以后,我养成了一个习惯:先画架构图,再写一行代码。
核心观点:做市系统的架构,本质上是在「低延迟」和「高可靠」之间找平衡。你不可能既要毫秒级响应,又要全链路强校验。架构设计就是做取舍。
3.1 整体架构分层
我个人习惯把做市系统分成四层。你想想看,这其实跟盖楼差不多:
- 接入层:跟交易所打交道,收行情、发订单
- 核心业务层:定价、做市策略、订单管理
- 风控层:实时检查,防止你把自己做死
- 数据层:记录一切,事后分析用
每一层之间通过内存队列或者共享内存通信。为什么不用RPC?延迟太高。我在项目中遇到过,用gRPC做层间通信,单次调用多了200微秒,做市策略根本没法跑。
3.2 接入层:你的手和眼睛
接入层说白了就是跟交易所对接。我建议你把它拆成两个独立进程:
- 行情网关:接收tick数据,做快照合并,推送给策略层
- 交易网关:发单、撤单、接收成交回报
为什么要分开?
我在项目中遇到过,行情网关因为网络抖动卡了500毫秒,结果交易网关也跟着卡——因为它们在同一个线程里。分开之后,行情挂了交易还能撑一会儿,至少不会乱报价。
避坑指南:我曾经把行情网关和交易网关放在同一个进程里,结果行情数据量一大,订单发送就延迟了。后来改成独立进程+共享内存通信,延迟从300微秒降到了50微秒。
3.3 核心业务层:大脑所在
这一层是做市系统的核心。我把它再拆成三个模块:
| 模块 | 职责 | 关键指标 |
|---|---|---|
| 定价引擎 | 计算期权理论价格、Greeks | 单次计算 < 10μs |
| 做市策略 | 决定双边报价价差、深度 | 策略更新 < 1ms |
| 订单管理 | 维护订单状态机、处理成交 | 状态切换 < 100μs |
定价引擎这块,我建议用C++写核心计算,Python做策略逻辑。为什么?C++算Greeks快,Python改策略灵活。你想想看,如果全用C++,每次改个参数都要重新编译,做市商一天改十几次策略,谁受得了?
3.4 风控层:你的安全带
风控模块,说白了就是防止你把自己做死。
我见过太多人忽略风控,觉得「我策略很稳,不会出事」。结果呢?一次波动率飙升,持仓Delta暴露过大,几分钟亏掉一个月的利润。
风控模块至少要有这几道防线:
- 限价检查:报价不能偏离理论价格超过X%
- 敞口监控:总Delta、Gamma、Vega不能超过阈值
- 频率限制:每秒撤单次数不能超过N次
- 熔断机制:连续亏损超过M元,自动停止报价
警告:风控模块必须独立于策略进程运行。我曾经见过有人把风控逻辑写在策略代码里,结果策略崩了,风控也跟着崩了。风控进程应该有自己的心跳检测,一旦策略进程失联,自动撤掉所有订单。
3.5 数据层:事后诸葛亮也得当
做市系统跑起来之后,数据就是你的金矿。
我建议你至少存这几类数据:
- 原始行情:所有tick数据,用于回测
- 订单日志:每一笔订单的完整生命周期
- 策略快照:每秒钟的策略状态(报价、持仓、Greeks)
- 风控事件:所有触发的风控规则记录
存储方案上,我个人习惯用InfluxDB存时序数据,PostgreSQL存结构化数据。为什么不用MongoDB?嗯,做市数据对一致性要求高,MongoDB在极端情况下会丢数据,我不敢赌。
3.6 模块间通信:别用HTTP
模块之间怎么通信?
我见过有人用REST API做内部通信,结果延迟动不动几十毫秒。做市系统里,几十毫秒够你亏好几轮了。
我建议的方案:
- 同机模块:共享内存 + 无锁队列
- 跨机模块:UDP组播(行情) + TCP(订单)
- 监控模块:ZeroMQ(可以容忍偶尔丢包)
经验之谈:共享内存的延迟可以做到1微秒以内。但要注意内存对齐和缓存行伪共享问题。我曾经因为两个变量在同一个缓存行上,导致性能从1微秒掉到10微秒。后来用alignas(64)强制对齐,问题解决。
3.7 总结:架构是活的
说了这么多,其实我想表达的是:架构不是画完就完事的。
我刚开始做系统时,架构图画得漂漂亮亮,结果一上线就发现各种问题。行情量大了,共享内存不够用;策略复杂了,单线程处理不过来;风控规则多了,检查耗时太长。
所以我的建议是:先搭一个最小可用架构,跑起来,然后根据实际数据量、策略复杂度、延迟要求,逐步优化。别想着一步到位,做市系统没有「完美架构」,只有「当前够用」。
最后说一句:如果你现在刚开始搭建,我建议你先关注接入层和风控层。接入层决定了你能不能跟交易所正常通信,风控层决定了你能不能活过第一周。至于策略层,可以先用简单的做市逻辑跑起来,后面再慢慢优化。
公众号:蓝海数据掘金营,微信deep3321