2. 做市商盈利核心逻辑:买卖价差(Bid-Ask Spread)的深度解析

做市商怎么赚钱?说白了,就靠四个字:低买高卖

但这里的“低买高卖”不是指预测价格涨跌,而是同时挂出买单和卖单,吃中间的差价。这个差价,就是我们常说的买卖价差(Bid-Ask Spread)

我个人习惯把价差比作“过路费”。市场每成交一笔,做市商就收一次费。费率不高,但架不住量大。今天我们就来拆解这个“过路费”到底怎么收、收多少、以及怎么才能不亏本。

2.1 价差的基本构成

先看一个最简单的例子。假设某股票当前最优买价(Bid)是10.00元,最优卖价(Ask)是10.02元。

  • Bid(买价):10.00元 —— 你愿意卖给我的价格
  • Ask(卖价):10.02元 —— 我愿意卖给你的价格
  • Spread(价差):0.02元

做市商在10.00元买入,在10.02元卖出。每完成一次买卖循环,赚0.02元。听起来不多,但一天交易几万次呢?

核心公式:

做市商单笔毛利 = (Ask - Bid) × 成交量 - 交易费用

净利 = 单笔毛利 × 交易次数 - 持仓风险成本

嗯,这里要注意:价差不是纯利润。你还要扣掉手续费、交易所返佣、以及最重要的——库存风险成本。

2.2 价差的三个层次

我在项目中遇到过不少新手,以为价差就是简单的“卖价减买价”。其实,真正的价差管理要分三层看:

层次 名称 说明 我的经验
第一层 名义价差 盘口上看到的Ask - Bid 这只是表面数字,别太当真
第二层 有效价差 实际成交价与中间价的差值 这才是你真正赚到的
第三层 实现价差 扣除逆向选择成本后的净价差 做市商真正的命门

为什么会这样?因为市场不是静止的。你挂10.00的买单,可能被一个知道内幕消息的大户砸穿。你以为赚了0.02,结果下一秒价格跌到9.90,你手里全是高价货。这就是逆向选择成本。

2.3 盈亏平衡点:你至少要赚多少?

做市不是无本生意。我给大家算一笔账:

盈亏平衡价差公式:

盈亏平衡价差 = 2 × (手续费 + 滑点成本 + 库存风险成本)

举个例子:

  • 手续费:每笔0.005元
  • 滑点成本:每笔0.003元(市场波动导致)
  • 库存风险成本:每笔0.002元(持有头寸的波动风险)

那么你的盈亏平衡价差 = 2 × (0.005 + 0.003 + 0.002) = 0.02元。

也就是说,如果价差低于0.02元,你就是在做慈善。我曾经犯过这个错,为了抢成交量把价差压到0.01元,结果一个月下来亏了手续费。嗯,从那以后我再也不干这种傻事了。

2.4 价差策略的核心变量

做市商不是死板地挂一个固定价差。你需要动态调整。我个人习惯关注以下四个变量:

  1. 波动率:波动越大,价差要越宽。因为风险高了。
  2. 成交量:流动性好的品种,价差可以收窄。薄利多销。
  3. 库存头寸:手里货多了,要降价卖;货少了,要提价买。
  4. 对手方类型:遇到散户可以窄一点,遇到机构要小心。

避坑指南:

我曾经在波动率飙升时还维持窄价差,结果被一连串的市价单打穿。记住:波动率翻倍,价差至少翻1.5倍。这是血的教训。

2.5 实战中的价差管理框架

下面这张图是我自己总结的价差决策流程。你想想看,每次挂单前,其实都在做这个判断:

做市商价差决策流程图 获取市场数据 波动率评估 库存头寸检查 输出动态价差:Bid / Ask 关键参数: 1. 波动率 → 价差宽度 2. 库存 → 价格偏移 3. 成交量 → 调整频率 4. 对手方 → 风险溢价 ⚠ 每100ms更新一次

这个流程看起来简单,但实际跑起来坑很多。比如波动率怎么算?用1分钟标准差还是5分钟?我个人习惯用指数加权移动平均(EWMA),对近期数据更敏感。

2.6 代码示例:一个简单的价差计算器

下面是一个Python示例,展示如何根据波动率和库存动态调整价差:

class SpreadCalculator:
    def __init__(self, base_spread=0.02, vol_multiplier=1.5):
        self.base_spread = base_spread
        self.vol_multiplier = vol_multiplier
        self.inventory = 0
        
    def calc_spread(self, volatility, inventory):
        # 波动率调整
        vol_adjust = 1 + self.vol_multiplier * volatility
        
        # 库存调整:库存为正,降低买价;库存为负,提高卖价
        inv_adjust = 1 + 0.1 * abs(inventory) / 1000
        
        spread = self.base_spread * vol_adjust * inv_adjust
        return round(spread, 4)
    
    def calc_quotes(self, mid_price, volatility):
        spread = self.calc_spread(volatility, self.inventory)
        bid = mid_price - spread / 2
        ask = mid_price + spread / 2
        return bid, ask

# 使用示例
calc = SpreadCalculator()
mid = 100.00
vol = 0.02  # 2% 波动率
bid, ask = calc.calc_quotes(mid, vol)
print(f"Bid: {bid}, Ask: {ask}, Spread: {ask-bid}")

你看,代码本身不复杂。但真正的难点在于参数调优。base_spread设多少?vol_multiplier用1.5还是2.0?这些都需要回测。

我的建议:

刚开始做市时,把价差设宽一点。宁可少赚,不要亏钱。等跑顺了,再慢慢收窄。我曾经用0.05的base_spread起步,三个月后才降到0.02。

2.7 总结:价差是门艺术

买卖价差看起来简单,但背后是风险定价、库存管理、市场微观结构的综合博弈。说白了,做市商赚的是“信息不对称”的钱,也是“流动性提供”的钱。

记住三个关键点:

  • 价差不是越大越好,太大会失去竞争力
  • 价差不是越小越好,太小会亏手续费和风险
  • 动态调整才是王道,死板挂单必死

嗯,今天就聊到这里。下一章我们聊聊库存风险的具体管理方法——那才是做市商真正头疼的地方。


专注资料整理