第十七章:做市商竞争分析

做市商不是一个人在战斗。嗯,这句话其实不太对——做市商之间其实是在激烈竞争的。你想想看,同一个交易品种,可能有好几家做市商同时在报价。谁的价格好,流动性就流向谁。这就是我们今天要聊的核心问题:做市商之间的竞争到底怎么分析?

我个人习惯用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模型里,两个做市商最终会找到一个平衡点——谁都不敢轻易动价格。

为什么会这样?我们来推一下:

  1. 如果做市商A降价,他能抢到更多份额
  2. 但降价意味着每笔交易利润变薄
  3. 做市商B看到A降价,也会跟着降
  4. 最后两个人都降到成本线附近

我在项目中遇到过这种情况。有一次做加密货币的做市,两个做市商互相压价,最后价差从0.05%压到了0.01%。表面上看交易者赚了,但实际流动性反而变差了——因为利润太薄,没人愿意提供深度。

纳什均衡报价公式:

在对称Hotelling模型中,均衡报价为:

p* = c + t

其中c是边际成本,t是单位距离成本

这意味着:均衡价差 = 2t(两个做市商各加t)

流动性黑洞:当竞争走向极端

讲到这里,我得说一个让人头疼的现象——流动性黑洞。这不是理论推演,是我亲眼见过的。

2010年5月6日,美股闪崩。道琼斯指数几分钟内暴跌近1000点。很多做市商在那一刻直接撤单了。为什么?因为风险太大了。

流动性黑洞的形成机制是这样的:

  1. 某个大单砸下来,价格快速下跌
  2. 做市商A看到风险,缩小报价宽度或撤单
  3. 做市商B发现流动性变差,也跟着撤
  4. 其他做市商看到两家都撤了,集体撤退
  5. 流动性瞬间消失,价格自由落体

我曾经在模拟环境里复现过这个过程。代码大概长这样:

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模型 纳什均衡报价 流动性黑洞 报价位置竞争 市场份额分配 均衡价格 = c + t 价差 = 2t 集体撤单机制 闪崩微观结构 核心结论 竞争 → 均衡 → 极端情况 → 风险管理

做市商竞争分析,说白了就是一场博弈。Hotelling模型给了我们分析框架,纳什均衡告诉我们最终会停在哪儿,而流动性黑洞和闪崩则是极端情况下的风险警示。

我个人觉得,做市商最重要的不是赚多少钱,而是活下来。在竞争激烈的市场里,活得久的那个才是赢家。


无相订单流研究社 微信Lucian808555