一、系统概述与架构设计

做市商业务痛点分析

做市商这行,说白了就是「赚差价,控风险」。我在这个领域摸爬滚打了好几年,见过太多团队因为监控不到位而吃大亏。你想想看,一个做市商系统每天要处理几万笔订单,管理几十个交易对,同时盯着多个交易所的价差变化。这里面有几个核心痛点,我一个个说。

第一个痛点:数据延迟。做市商最怕什么?最怕你看到的价格已经是3秒前的了。3秒在传统交易里不算啥,但在高频做市里,足够让你亏掉一整天利润。我曾经有个项目,就因为WebSocket重连机制没做好,导致价差数据延迟了2秒,结果一天亏了十几万。嗯,从那以后我对数据管道的延迟就特别敏感。

第二个痛点:告警轰炸。很多团队一开始做监控,恨不得每个指标都设告警。结果呢?告警邮件堆满收件箱,真正的异常反而被淹没了。我记得有个同事,他的手机一天能收到500条告警短信,最后直接静音了。这其实是个典型的「狼来了」问题。

第三个痛点:可视化混乱。做市商需要同时看的东西太多了:订单簿深度、持仓盈亏、资金费率、历史波动率……如果每个指标都单独开一个页面,交易员根本忙不过来。我见过最夸张的,一个交易员桌上摆了6个显示器,每个显示器开4个窗口。这哪是交易,这是练眼力。

核心结论:做市商监控系统的本质,是把「海量数据」变成「可执行的决策信号」。延迟要低、告警要准、展示要清。

监控系统核心需求

基于上面的痛点,我总结了一套核心需求清单。这些需求不是拍脑袋想的,是踩过坑之后才明白的。

需求类别 具体需求 优先级
实时性 数据端到端延迟 < 100ms P0
可靠性 系统可用性 99.99%,支持自动重连 P0
可观测性 支持自定义指标、多维聚合 P1
告警智能 支持动态阈值、告警降噪、升级策略 P1
可视化 支持实时仪表盘、历史回溯、多维度钻取 P1
扩展性 支持新增交易对、交易所、策略模块 P2

我个人习惯把需求分成P0、P1、P2三级。P0是必须满足的,否则系统没法上线。P1是核心体验,P2是锦上添花。你想想看,如果实时性做不到100ms以内,那这个监控系统基本就是废的。所以P0需求,我建议你死磕到底。

整体技术架构选型

选型这件事,我踩过的坑比做过的项目还多。先说结论:Python + Redis + WebSocket + Grafana 这套组合,是目前做市商监控领域最务实的选择。为什么?我一个个说。

Python:做市商策略开发的主力语言。Python生态里,asyncio做异步IO、pandas做数据处理、numpy做数值计算,一套下来非常顺手。有人可能会说Python慢,但说实话,对于监控系统这种IO密集型的场景,Python完全够用。我见过用C++写监控的团队,开发周期长了三倍,最后性能也没好到哪去。

Redis:做市商系统的「数据高速公路」。Redis的Pub/Sub机制天然适合做实时数据分发,而且它的List和Stream数据结构,可以完美解决数据缓冲和回溯的问题。我记得有一次,交易所的WebSocket断了10分钟,Redis里缓存的数据帮我们完整恢复了这段时间的行情,一点没丢。

WebSocket:前端实时更新的核心通道。相比轮询,WebSocket的延迟低一个数量级。而且WebSocket支持双向通信,交易员可以在仪表盘上直接下发参数调整指令。这个功能在紧急情况下特别有用。

Grafana:可视化层的「瑞士军刀」。Grafana的仪表盘功能非常强大,支持自定义面板、告警规则、团队协作。而且它原生支持Redis数据源,省去了中间转换的麻烦。

个人建议:如果你团队里有人熟悉InfluxDB,也可以考虑用Grafana + InfluxDB的组合。但Redis的实时性更好,而且做市商系统本身就需要Redis做缓存,复用起来更划算。

模块划分与数据流设计

这部分是架构设计的核心。我习惯把系统拆成四个模块:数据采集层、数据处理层、告警引擎层、可视化层。每个模块各司其职,互不干扰。

先看一张整体架构图,我手绘的,凑合看:

做市商实时监控系统架构图 数据源层 交易所WebSocket行情 订单簿快照 成交记录 资金费率 数据采集层 (Python asyncio) WebSocket连接管理 数据解析与清洗 心跳检测与重连 数据缓冲 Redis Pub/Sub 消息总线 数据处理层 指标计算 聚合统计 告警引擎层 规则匹配 告警降噪 可视化层 Grafana仪表盘 WebSocket推送 实时仪表盘 告警通知(邮件/短信/钉钉) 历史数据存储(CSV/DB)

数据流其实很简单,我捋一遍你就明白了:

  1. 数据采集层通过WebSocket连接交易所,拿到原始行情数据。这一步最关键的是连接管理和心跳检测。我建议用asyncio的异步框架,一个连接一个协程,互不阻塞。
  2. 采集到的数据经过简单清洗后,直接推送到Redis Pub/Sub。为什么用Pub/Sub而不是直接存数据库?因为延迟低。Redis的Pub/Sub延迟在微秒级,而写入数据库至少是毫秒级。
  3. 数据处理层订阅Redis的特定频道,拿到数据后做指标计算。比如计算买卖价差、订单簿不平衡度、持仓盈亏等。计算完的结果再推回Redis。
  4. 告警引擎层同样订阅Redis,但它只关注指标是否触发了告警规则。这里有个技巧:告警规则要支持动态阈值,不能写死。比如价差告警,白天和晚上的阈值应该不一样。
  5. 可视化层通过WebSocket从Redis拉取数据,实时更新Grafana仪表盘。交易员看到的就是最新的市场状态。

避坑指南:我曾经在数据流设计上犯过一个错误——让数据处理层直接写入数据库。结果数据库写入成了瓶颈,导致整个数据管道阻塞。后来改成「先推Redis,再异步写库」,问题就解决了。记住:实时管道里不要有阻塞操作

最后说一句,架构设计没有银弹。这套方案适合中小型做市商团队(管理资产规模在1亿美金以内)。如果你团队规模更大、交易频率更高,可能需要引入Kafka做消息队列,或者用C++重写核心模块。但作为入门课程,这套架构足够你跑起来了。


专注资料整理