做市商核心KPI与报价逻辑:买卖价差、库存周转率、风险调整后收益、报价引擎的基本原理
做市商这活儿,说白了就是「低买高卖,赚个差价」。但真干起来,你会发现这行当没那么简单。我做了十几年利率互换做市,见过太多人盯着报价屏幕,却看不懂背后的KPI。
今天咱们就聊聊做市商的核心指标和报价逻辑。嗯,这些东西,你理解了,才算真正入了门。
一、买卖价差:你的饭碗有多厚
买卖价差(Bid-Ask Spread)是做市商最直接的收入来源。你报一个买价(Bid),再报一个卖价(Ask),中间的差价就是你的利润空间。
但问题来了——价差设多大合适?
我个人习惯用这个公式来估算:
Spread = (Ask - Bid) / MidPrice × 10000 (单位:bps)
举个例子:
- 某5年期IRS,Bid = 2.50%,Ask = 2.52%
- MidPrice = (2.50% + 2.52%) / 2 = 2.51%
- Spread = (2.52% - 2.50%) / 2.51% × 10000 ≈ 0.80 bps
0.8个基点,看着不大吧?但你要知道,一笔名义本金1亿的IRS,这0.8bps就是8000块的收入。一天做几十笔,收入就上来了。
关键点:价差不是越大越好。价差大了,客户就跑了。价差小了,你扛不住风险。我见过有些新手做市商,上来就报1bps的价差,结果被高频交易者来回收割,一天亏了几十万。
我在项目中遇到过一件事:有个客户专门盯着我们报价,只要价差超过0.5bps,他就去别家做。后来我调整了策略,把活跃期限的价差压到0.3bps,虽然单笔赚得少了,但量上来了,总利润反而更高。
二、库存周转率:你的资金效率有多高
库存周转率,说白了就是你手里的头寸多久能换一轮。做市商不是投资者,我们不靠方向性交易赚钱,靠的是「快进快出」。
库存周转率的计算公式:
库存周转率 = 一定时期内成交的名义本金总额 / 平均库存头寸
举个例子:
- 一天成交了50亿名义本金的IRS
- 平均库存头寸(净敞口)是5亿
- 库存周转率 = 50 / 5 = 10次/天
周转率越高,说明你的资金利用效率越高。我一般要求团队做到每天至少5-8次的周转率。低于3次,说明你持仓时间太长,风险敞口暴露太大。
我的经验:库存周转率不是越高越好。太高了说明你频繁交易,交易成本(手续费、滑点)也会上去。我建议控制在5-10次/天比较合适。
你想想看,如果一笔IRS你持有了3天还没平掉,中间利率波动了10bps,你可能就把之前赚的价差全赔进去了。所以,做市商的核心就是「快」。
三、风险调整后收益:你到底赚没赚钱
这个指标,我把它叫做「做市商的照妖镜」。很多做市商看着账面利润很高,但一算风险调整后收益,发现其实是在刀尖上跳舞。
常用的指标是夏普比率(Sharpe Ratio)和索提诺比率(Sortino Ratio)。
夏普比率公式:
Sharpe Ratio = (策略收益率 - 无风险利率) / 收益率标准差
举个例子:
- 你的做市策略年化收益率是15%
- 无风险利率是3%
- 收益率标准差是8%
- Sharpe Ratio = (15% - 3%) / 8% = 1.5
夏普比率大于1,说明你的收益对得起你承担的风险。大于2,那就是顶级水平了。
注意:夏普比率有个坑——它对上行波动和下行波动一视同仁。但做市商最怕的是下行风险。所以我更推荐用索提诺比率,它只考虑下行波动。
我曾经见过一个团队,账面利润一年做了2000万,但夏普比率只有0.3。一查原因,原来是他们重仓赌方向,运气好赚了钱。这种收益是不可持续的。后来市场一反转,一个月就把一年的利润全吐回去了。
四、报价引擎的基本原理
报价引擎,就是做市商的「大脑」。它负责实时计算买卖报价,并推送到交易终端。
一个典型的报价引擎包含以下几个模块:
- 市场数据模块:接收实时行情(收益率曲线、信用利差、波动率等)
- 定价模型模块:计算IRS的合理价格(通常用贴现现金流模型)
- 风险计算模块:计算当前库存的DV01、凸性、信用风险等
- 报价生成模块:根据定价和风险,生成Bid/Ask报价
- 订单管理模块:处理成交、撤单、修改等
下面我画了一张报价引擎的流程图,帮你理解整个逻辑:
报价引擎的核心逻辑其实不复杂:
# 伪代码示例
def generate_quote(market_data, inventory):
# 1. 计算合理价格
fair_price = pricing_model(market_data)
# 2. 计算风险敞口
risk = calculate_risk(inventory)
# 3. 根据风险调整价差
if risk > threshold:
spread = base_spread * 1.5 # 风险大,价差扩大
else:
spread = base_spread
# 4. 生成买卖报价
bid = fair_price - spread / 2
ask = fair_price + spread / 2
return bid, ask
嗯,这里要注意:实际生产环境中的报价引擎比这个复杂得多。比如要考虑:
- 不同期限的流动性差异(2年期比10年期流动性好,价差可以更窄)
- 交易对手信用风险(对手方信用差,价差要加宽)
- 市场波动率(波动大时,价差要扩大)
- 库存集中度(某个期限持仓过多,报价要偏向平仓方向)
我的建议:刚开始搭建报价引擎时,不要追求完美。先跑通一个简单的版本,然后逐步迭代。我见过太多团队花半年时间搞一个「完美」的引擎,结果上线第一天就被市场打脸。
我曾经犯过一个错误:报价引擎里没有考虑「库存集中度」这个因子。结果有一次,我们在10年期IRS上积累了太多多头头寸,但报价引擎还在按正常价差报价。客户一看我们的报价比市场好,疯狂来卖给我们。一天下来,我们接了5个亿的多头,晚上利率一跌,亏了200万。
从那以后,我在报价引擎里加了一个「库存压力因子」:某个期限的库存超过阈值,报价就往平仓方向偏移。比如多头多了,Bid就报低一点,少接点货;Ask也报低一点,鼓励客户来买。
说白了,报价引擎不是死板的数学公式,它要能「感知」你的库存风险,并做出动态调整。
总结一下
做市商的四个核心KPI和报价逻辑,其实是一个闭环:
- 买卖价差决定你每笔赚多少
- 库存周转率决定你赚钱的速度
- 风险调整后收益决定你赚钱的质量
- 报价引擎是执行这一切的工具
这四个东西,缺一个都不行。你想想看,价差再大,周转率上不去,资金效率低;周转率再高,风险调整后收益不行,迟早翻车;报价引擎再牛,KPI没设对,也是白搭。
好了,今天就聊到这儿。这些内容,你在教科书上也能看到,但实战中的坑,只有真正做过的人才知道。
公众号:蓝海资料掘金营,微信deep3321