第十七章:做市商竞争分析
做市商不是一个人在战斗。嗯,这句话其实不太对——做市商之间其实是在激烈竞争的。你想想看,同一个交易品种,可能有好几家做市商同时在报价。谁的价格好,流动性就流向谁。这就是我们今天要聊的核心问题:做市商之间的竞争到底怎么分析?
我个人习惯用Hotelling模型来思考这个问题。这个模型最早是用来分析两家冰淇淋店在海滩上怎么选址的,但放到做市商报价竞争里,意外地好用。
Hotelling模型:报价竞争的几何解释
先说说Hotelling模型的基本逻辑。假设有两个做市商,一个在左边,一个在右边。交易者分布在中间。每个交易者会选择距离自己最近的做市商成交——这里的"距离",我把它理解为价格差异。
用数学语言表达就是:
# 假设两个做市商报价分别为 p1, p2
# 交易者的"位置" x 在 [0,1] 区间均匀分布
# 交易成本 = 价格 + 距离 * 单位成本
def hotelling_competition(p1, p2, transport_cost=0.1):
"""
计算两个做市商的市场份额
p1, p2: 报价
transport_cost: 单位距离成本(可以理解为滑点或手续费)
"""
# 无差异点:交易者选择哪家都一样
# p1 + t * x = p2 + t * (1 - x)
# 解得 x = (p2 - p1 + t) / (2 * t)
t = transport_cost
x = (p2 - p1 + t) / (2 * t)
# 市场份额
share1 = max(0, min(1, x))
share2 = 1 - share1
return share1, share2
# 举个例子
p1, p2 = 100.0, 100.2
s1, s2 = hotelling_competition(p1, p2)
print(f"做市商1份额: {s1:.2%}, 做市商2份额: {s2:.2%}")
# 输出: 做市商1份额: 60.00%, 做市商2份额: 40.00%
你看,报价差0.2,市场份额就差了20%。这就是为什么做市商对报价那么敏感。
纳什均衡报价:谁先撑不住?
说到均衡,我得提一下纳什均衡。在Hotelling模型里,两个做市商最终会找到一个平衡点——谁都不敢轻易动价格。
为什么会这样?我们来推一下:
- 如果做市商A降价,他能抢到更多份额
- 但降价意味着每笔交易利润变薄
- 做市商B看到A降价,也会跟着降
- 最后两个人都降到成本线附近
我在项目中遇到过这种情况。有一次做加密货币的做市,两个做市商互相压价,最后价差从0.05%压到了0.01%。表面上看交易者赚了,但实际流动性反而变差了——因为利润太薄,没人愿意提供深度。
纳什均衡报价公式:
在对称Hotelling模型中,均衡报价为:
p* = c + t
其中c是边际成本,t是单位距离成本
这意味着:均衡价差 = 2t(两个做市商各加t)
流动性黑洞:当竞争走向极端
讲到这里,我得说一个让人头疼的现象——流动性黑洞。这不是理论推演,是我亲眼见过的。
2010年5月6日,美股闪崩。道琼斯指数几分钟内暴跌近1000点。很多做市商在那一刻直接撤单了。为什么?因为风险太大了。
流动性黑洞的形成机制是这样的:
- 某个大单砸下来,价格快速下跌
- 做市商A看到风险,缩小报价宽度或撤单
- 做市商B发现流动性变差,也跟着撤
- 其他做市商看到两家都撤了,集体撤退
- 流动性瞬间消失,价格自由落体
我曾经在模拟环境里复现过这个过程。代码大概长这样:
import numpy as np
class LiquidityBlackHole:
def __init__(self, num_market_makers=10):
self.mm = num_market_makers
self.quotes = np.ones(num_market_makers) * 100.0
self.active = np.ones(num_market_makers, dtype=bool)
def simulate_flash_crash(self, shock_size=5.0, threshold=0.02):
"""
模拟闪崩过程
shock_size: 初始冲击大小
threshold: 做市商撤单的阈值(价格变动百分比)
"""
# 初始冲击
self.quotes[0] -= shock_size
for round in range(10):
# 检查每个做市商是否撤单
for i in range(1, self.mm):
if not self.active[i]:
continue
# 计算价格偏离
deviation = abs(self.quotes[i] - self.quotes.mean()) / self.quotes.mean()
if deviation > threshold:
self.active[i] = False
print(f"做市商{i}在第{round}轮撤单")
# 更新报价
active_quotes = self.quotes[self.active]
if len(active_quotes) == 0:
print("所有做市商已撤单!流动性黑洞形成!")
break
self.quotes[self.active] = active_quotes.mean()
return self.active.sum()
# 运行模拟
bh = LiquidityBlackHole()
remaining = bh.simulate_flash_crash()
print(f"剩余做市商数量: {remaining}")
避坑指南:
我曾经在实盘系统里遇到过类似情况。当时一个做市商因为网络延迟,报价更新慢了500毫秒。结果其他做市商看到价差异常,纷纷撤单。那500毫秒里,流动性直接腰斩。
教训:做市商的报价系统必须要有熔断机制。当检测到多个做市商同时撤单时,系统应该自动进入保护模式。
闪崩的微观结构分析
闪崩不是偶然事件。从微观结构角度看,它有明显的特征:
| 阶段 | 特征 | 持续时间 | 做市商行为 |
|---|---|---|---|
| 触发 | 大单冲击 | 毫秒级 | 被动接单 |
| 扩散 | 报价快速更新 | 秒级 | 缩小价差 |
| 恐慌 | 多品种联动 | 分钟级 | 集体撤单 |
| 恢复 | 流动性缓慢回归 | 小时级 | 试探性报价 |
我个人的经验是,闪崩最危险的不是第一波下跌,而是恢复阶段。很多做市商在恢复期过早进场,结果被第二波下跌打穿。
如何避免成为闪崩的牺牲品?
嗯,这里我给出几个实战建议:
- 设置动态撤单阈值:不要用固定百分比。市场波动率上升时,阈值应该自动放宽。
- 监控做市商群体行为:如果发现超过30%的做市商同时撤单,立刻启动保护。
- 保留部分流动性:即使在恐慌时,也要保留最低限度的报价。完全撤单会加剧恐慌。
- 使用延迟报价:在极端行情下,适当延迟报价更新频率,避免被高频交易者利用。
一个小技巧:
我习惯在系统里加一个"群体行为指数"。这个指数统计其他做市商的撤单速度。当指数超过某个阈值时,系统自动降低风险敞口。说白了,就是跟着大部队走,但不要走得太快。
知识结构图
下面这张图总结了本章的核心逻辑:
做市商竞争分析,说白了就是一场博弈。Hotelling模型给了我们分析框架,纳什均衡告诉我们最终会停在哪儿,而流动性黑洞和闪崩则是极端情况下的风险警示。
我个人觉得,做市商最重要的不是赚多少钱,而是活下来。在竞争激烈的市场里,活得久的那个才是赢家。