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.5倍。这是血的教训。
2.5 实战中的价差管理框架
下面这张图是我自己总结的价差决策流程。你想想看,每次挂单前,其实都在做这个判断:
这个流程看起来简单,但实际跑起来坑很多。比如波动率怎么算?用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 总结:价差是门艺术
买卖价差看起来简单,但背后是风险定价、库存管理、市场微观结构的综合博弈。说白了,做市商赚的是“信息不对称”的钱,也是“流动性提供”的钱。
记住三个关键点:
- 价差不是越大越好,太大会失去竞争力
- 价差不是越小越好,太小会亏手续费和风险
- 动态调整才是王道,死板挂单必死
嗯,今天就聊到这里。下一章我们聊聊库存风险的具体管理方法——那才是做市商真正头疼的地方。