做市商核心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。一查原因,原来是他们重仓赌方向,运气好赚了钱。这种收益是不可持续的。后来市场一反转,一个月就把一年的利润全吐回去了。

四、报价引擎的基本原理

报价引擎,就是做市商的「大脑」。它负责实时计算买卖报价,并推送到交易终端。

一个典型的报价引擎包含以下几个模块:

  1. 市场数据模块:接收实时行情(收益率曲线、信用利差、波动率等)
  2. 定价模型模块:计算IRS的合理价格(通常用贴现现金流模型)
  3. 风险计算模块:计算当前库存的DV01、凸性、信用风险等
  4. 报价生成模块:根据定价和风险,生成Bid/Ask报价
  5. 订单管理模块:处理成交、撤单、修改等

下面我画了一张报价引擎的流程图,帮你理解整个逻辑:

利率互换做市报价引擎流程图 市场数据模块 收益率曲线 / 波动率 / 信用利差 定价模型模块 贴现现金流模型 / 插值算法 风险计算模块 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