核心业务逻辑:订单簿管理、双边报价策略、库存风险管理、价差与手续费模型
做市商系统,说白了就是一台精密的「赚钱机器」。但机器好不好用,得看核心逻辑硬不硬。今天咱们就把这四个模块拆开揉碎了讲——订单簿管理、双边报价策略、库存风险管理、价差与手续费模型。嗯,这四块是骨架,缺一不可。
订单簿管理:你的战场地图
订单簿是什么?就是当前市场上所有买单和卖单的集合。我习惯把它比作「战场地图」——你得知道敌人在哪,火力多猛,才能决定自己怎么排兵布阵。
做市商系统里,订单簿管理要干三件事:
- 实时同步:行情数据一来,订单簿必须毫秒级更新。我在项目中遇到过,某次交易所的增量快照延迟了200毫秒,结果我们的报价全成了「废单」。后来我强制要求:增量更新必须在50ms内完成,否则直接降级到只读模式。
- 深度聚合:别把每一笔订单都展示出来,那太慢了。按价格档位聚合,比如每0.1个tick一个档位。你想想看,BTC/USDT的订单簿,如果逐笔展示,光渲染就能卡死UI。
- 本地重建:万一断线重连,得能从快照+增量日志里重建订单簿。我建议用「快照+增量」双缓冲机制——快照每10秒存一次,增量日志用环形缓冲区存最近1000条。这样重建时间能控制在1秒内。
核心指标:订单簿的「深度快照延迟」必须小于100ms,「增量更新延迟」必须小于20ms。否则你的报价策略就是「盲人摸象」。
双边报价策略:左右互搏的艺术
双边报价,就是同时挂买单和卖单。赚的是价差,但风险也大——万一一边成交了,另一边没成交,你就成了「单腿」持仓。
我个人习惯把策略分成三层:
- 基准价层:用加权中价(WMP)还是最后成交价?我建议用WMP,因为它能平滑掉短期的波动噪音。公式很简单:
基准价 = (买一价 * 买一量 + 卖一价 * 卖一量) / (买一量 + 卖一量)。 - 价差层:价差不是固定的。市场波动大时,价差要拉宽;波动小时,价差可以收窄。我常用的模型是:
动态价差 = 基础价差 * (1 + 波动率系数 * 波动率)。波动率用过去5分钟的收益率标准差来算。 - 偏移层:如果库存偏多,就把卖单价格压低一点,促进卖出;库存偏少,就把买单价格抬高一点,促进买入。说白了,就是「用价格调整来管理库存」。
避坑指南:我曾经把价差设得太窄,结果被高频交易者反复「夹击」——他们专吃我的价差,我成了他们的提款机。后来我加了一条规则:如果连续3笔订单都被同一对手方吃掉,就暂停报价5秒,重新评估市场状态。
库存风险管理:别让仓位压垮你
做市商最怕什么?不是亏钱,是「爆仓」。库存风险管理,就是给你的仓位戴上「紧箍咒」。
我把它拆成三个维度:
| 维度 | 指标 | 阈值示例 | 处理动作 |
|---|---|---|---|
| 库存量 | 净持仓 / 总资产 | ±20% | 超过阈值时,启动「库存对冲」——用期货或永续合约反向开仓 |
| 库存成本 | 持仓均价 vs 当前市价 | 亏损超过2% | 强制平掉一半仓位,或者暂停报价 |
| 库存集中度 | 单一币种占比 | 超过50% | 限制该币种的报价深度,只报最小手数 |
为什么会这样设计?因为库存风险是「慢刀子割肉」。你想想看,如果BTC突然暴跌5%,你的库存全是BTC,那损失就是实打实的。所以,我建议把库存管理做成「自动化闭环」——系统每10秒检查一次库存状态,超标就自动调整报价参数。
注意:库存对冲不是万能的。我记得有一次,市场流动性枯竭,对冲订单根本成交不了。后来我加了一个「熔断机制」:如果对冲订单超过30秒未成交,直接暂停所有报价,等待人工干预。
价差与手续费模型:算清楚每一分钱
做市商赚的是「微薄利润」,所以每一笔交易的手续费、每一跳的价差,都得算得明明白白。
我常用的模型是这样的:
- 净价差 = 报价价差 - 双边手续费。比如你挂的买卖价差是0.1%,交易所手续费是0.05%每边,那净价差就是0.1% - 0.05%*2 = 0%。嗯,白干。
- 盈亏平衡点:净价差必须大于0,否则就是亏本买卖。我建议把目标净价差设为0.02%以上,这样扣除滑点后还能有微利。
- 手续费折扣:大交易所都有VIP费率。我习惯把手续费分成「基础费率」和「返佣费率」两层。比如基础费率0.05%,但月交易量超过1亿后,返佣0.02%。那实际费率就是0.03%。
核心公式:预期收益 = 净价差 * 成交率 * 交易量 - 库存风险成本。如果预期收益为负,就别报价了,休息一下。
说白了,价差模型就是「在手续费和滑点之间找平衡」。我见过很多新手,把价差设得很窄,结果手续费一扣,全是亏损。所以,我建议在系统里加一个「实时盈亏计算器」——每笔成交后,立刻算出扣除手续费后的实际盈亏,并显示在监控面板上。
知识体系总览
下面这张图,把四个模块的关系画清楚了。你可以看到,订单簿是数据源,报价策略是决策层,库存管理是风控层,手续费模型是利润核算层。四者环环相扣,缺一不可。
嗯,这四个模块讲完了。你可能会问:它们之间怎么协作?其实很简单——订单簿给报价策略提供「原料」,报价策略生成订单后交给风控层「审核」,风控层通过后订单才发往交易所,最后手续费模型把每一笔账算清楚。整个过程,就像一条流水线。
我个人习惯,在系统里加一个「全链路监控面板」,把每个模块的延迟、吞吐量、错误率都实时展示出来。这样一旦某个环节出问题,能立刻定位。毕竟,做市商系统里,时间就是金钱。
最后一个小建议:别把所有逻辑都写在一个进程里。我建议把订单簿管理、报价策略、库存管理拆成三个独立的微服务,通过Redis Pub/Sub通信。这样即使报价策略挂了,订单簿还能继续更新,不会丢失行情数据。
公众号:蓝海资料掘金营,微信deep3321