一、做市引擎概述
做市引擎,说白了就是一套自动报价系统。它不停地向市场挂买单和卖单,赚取中间的价差。我刚开始接触这个领域时,觉得这不就是低买高卖嘛,有什么难的?后来真正上手才发现,这里面的门道深着呢。
你想想看,一个合格的做市引擎,每秒要处理成千上万笔订单,同时还要管理风险、控制库存、预测价格走势。这可不是简单的买卖逻辑能搞定的。
什么是做市引擎
做市引擎是一套自动化交易系统。它的核心任务是在交易所同时挂出买单和卖单。比如比特币现价30000美元,做市引擎可能在29990挂买单,在30010挂卖单。只要市场波动,就能赚到这20美元的差价。
我在项目中遇到过最典型的情况:一个客户想给自家交易所做流动性。他们之前用手工做市,三个人轮班,每人盯8小时。结果呢?经常漏单、报价延迟、甚至挂错价格。后来换成做市引擎,这些问题全解决了。
核心要点:做市引擎不是简单的买卖机器人。它需要实时分析市场深度、订单簿状态、历史波动率,然后动态调整报价策略。
做市引擎的核心功能
一个完整的做市引擎,至少包含以下五个功能模块。我按重要程度排了个序:
- 订单管理 - 负责创建、修改、撤销订单。嗯,这里要注意,交易所的API限频很严格,我曾经因为没处理好限频,被交易所封了半小时。
- 风险管理 - 控制库存、设置最大亏损、监控异常波动。说白了就是保命用的。
- 报价策略 - 决定挂什么价格、挂多少量。这是做市引擎的大脑。
- 市场数据 - 实时获取行情、深度、成交记录。数据慢了,报价就废了。
- 性能监控 - 跟踪延迟、成交率、盈亏情况。我习惯每5秒输出一次性能指标。
这五个模块缺一不可。你想想看,如果风险管理没做好,一次黑天鹅事件就能让你爆仓。我见过太多这样的案例了。
做市引擎在量化交易中的角色
做市引擎在量化交易体系里,扮演着「流动性提供者」的角色。它不像趋势策略那样追涨杀跌,也不像套利策略那样寻找价差。做市引擎的核心价值在于:
- 稳定市场 - 通过持续报价,缩小买卖价差,降低交易成本
- 赚取价差 - 每笔交易赚一点点,积少成多
- 降低冲击成本 - 大单交易时,做市引擎可以帮忙消化
我记得有一次,一个朋友问我:「做市引擎和普通量化策略有什么区别?」我打了个比方:普通策略像猎人,找到猎物就出击;做市引擎像农夫,每天耕耘,稳定收获。两者没有好坏之分,只是赚钱的逻辑不同。
个人经验:做市引擎最适合波动率适中的市场。波动太小,价差赚不到钱;波动太大,风险控制不住。我一般选择日均波动率在1%-3%之间的品种。
做市引擎的核心架构
下面这张图展示了一个典型做市引擎的架构。我画了不下十版才定下来这个结构:
这张图我用了很多年。每次给团队新人讲解,我都会指着它说:「记住这个结构,做市引擎就这些东西。复杂的是每个模块里的细节。」
避坑指南:我曾经犯过一个错误——把策略引擎和订单管理混在一起写。结果每次改策略都要动订单管理的代码,出了好几次生产事故。后来我强制要求:策略引擎只负责计算报价,订单管理只负责执行。职责分离,这是血的教训。
做市引擎的技术选型
说到技术选型,我个人习惯用Python做原型开发,用C++做核心引擎。为什么?Python开发快,适合快速迭代;C++性能好,适合高频场景。
下面是我常用的技术栈:
| 模块 | 技术选型 | 说明 |
|---|---|---|
| 市场数据 | WebSocket + asyncio | 实时性要求高,必须用异步IO |
| 策略引擎 | Python + NumPy | 计算密集型,用NumPy加速 |
| 订单管理 | C++ | 延迟敏感,必须用底层语言 |
| 数据存储 | InfluxDB + PostgreSQL | 时序数据用InfluxDB,业务数据用PG |
| 监控告警 | Prometheus + Grafana | 开源方案,够用 |
你可能会问:为什么不用Go?Go的并发确实好,但生态不如Python丰富。我试过用Go重写策略引擎,结果发现很多量化库都没有Go版本,最后还是换回Python了。
做市引擎的常见误区
这些年我带过不少团队,发现新手做市引擎时容易犯几个错误:
- 过度优化 - 一上来就追求微秒级延迟。其实对于大多数品种,毫秒级就够了。先跑起来,再优化。
- 忽视风控 - 只想着赚钱,没想过亏钱。我见过有人一天赚了10万,第二天亏了50万。风控不是摆设。
- 策略太复杂 - 一个策略里塞了十几个参数。参数越多,过拟合风险越大。我一般控制在3-5个核心参数。
我的建议:刚开始做做市引擎,先跑模拟盘。模拟盘跑一个月,把各种边界情况都测一遍。我曾经在模拟盘上发现过一个bug——订单簿深度为0时程序会崩溃。这个bug要是上了实盘,后果不堪设想。
做市引擎这个领域,说难不难,说简单也不简单。核心就三点:报价要快、风控要严、策略要稳。把这三点做好了,你的做市引擎就能稳定盈利了。