做市策略类型:被动做市、主动做市、混合做市策略
做市策略不是千篇一律的。我做了这么多年,发现很多人一上来就问我「哪种策略最赚钱?」——这个问题其实问错了。你得先搞清楚自己的交易环境、资金体量、风险承受能力,再去选策略类型。
今天我把做市策略分成三大类:被动做市、主动做市、混合做市。咱们一个一个拆开讲。
一、被动做市(Passive Market Making)
被动做市,说白了就是「挂单等成交」。你在买一卖一的位置挂上订单,等着对手盘来吃你的单子。这是最基础、也是最常见的做市方式。
核心逻辑:赚取买卖价差(Bid-Ask Spread),不主动预测价格方向。
我在项目中遇到过不少新手,一上来就搞被动做市,结果被行情一波带走。为什么?因为被动做市有个致命弱点——方向性风险。你挂的买单,价格一直跌,你就一直接货;你挂的卖单,价格一直涨,你就一直卖飞。
被动做市的典型特征
- 低延迟要求高:你的订单得比别人快,否则抢不到好位置
- 库存管理是关键:不能无限接货,得有止损和再平衡机制
- 适合低波动市场:波动一大,被动做市就是送人头
我的经验:被动做市最适合在震荡行情里做。我一般会配合布林带或者ATR指标,当价格触及上下轨时,适当调整挂单间距。比如ATR=10个tick,我就把挂单间距设成8-12个tick,这样既能吃到价差,又不会被频繁成交。
被动做市的代码骨架
class PassiveMarketMaker:
def __init__(self, spread_multiplier=1.0):
self.spread_mult = spread_multiplier
self.position = 0
self.inventory_limit = 100
def calculate_quotes(self, mid_price, atr):
# 根据ATR动态调整价差
spread = atr * self.spread_mult
bid_price = mid_price - spread / 2
ask_price = mid_price + spread / 2
return bid_price, ask_price
def check_inventory(self):
# 库存过大时,缩小挂单量
if abs(self.position) > self.inventory_limit * 0.8:
return 0.5 # 挂单量减半
return 1.0
避坑指南:我曾经在ETH上做被动做市,没设库存上限,结果一波暴跌接了500个ETH,仓位直接爆了。后来我学乖了——永远设置最大持仓量,超过阈值就停止挂单。
二、主动做市(Active Market Making)
主动做市就不一样了。你不是傻等,而是主动出击。你会根据市场信号,主动调整挂单位置、挂单量,甚至主动吃单来管理库存。
你想想看,如果市场突然有大单砸盘,被动做市的人还在那傻傻挂着买单,结果就是被砸穿。但主动做市的人会怎么做?他会立刻撤单,甚至反手做空。
主动做市的核心手段
- 订单簿分析:观察买卖盘口的深度和变化速度
- 信号驱动:根据技术指标或订单流信号调整策略
- 库存主动管理:用对冲单或反向交易来平衡库存
关键区别:被动做市是「等别人来成交你」,主动做市是「我去找成交机会」。
我个人习惯在主动做市里加入订单簿不平衡指标(Order Book Imbalance)。比如买一量是卖一量的3倍以上,说明买方力量强,我会把卖单挂高一点,买单也挂高一点——说白了就是跟着大资金走。
主动做市的代码示例
class ActiveMarketMaker:
def __init__(self, imbalance_threshold=2.0):
self.threshold = imbalance_threshold
def calculate_imbalance(self, bid_volume, ask_volume):
if ask_volume == 0:
return float('inf')
return bid_volume / ask_volume
def adjust_quotes(self, mid_price, imbalance):
if imbalance > self.threshold:
# 买方强势,上移报价
offset = mid_price * 0.001
bid_price = mid_price - offset
ask_price = mid_price + offset * 1.5
elif imbalance < 1 / self.threshold:
# 卖方强势,下移报价
offset = mid_price * 0.001
bid_price = mid_price - offset * 1.5
ask_price = mid_price + offset
else:
# 平衡状态,正常报价
bid_price = mid_price * 0.999
ask_price = mid_price * 1.001
return bid_price, ask_price
我的经验:主动做市对计算延迟要求更高。我一般会用C++或者Rust写核心逻辑,Python只做回测和监控。别问我为什么——有一次我用Python做实盘,订单簿更新慢了200毫秒,结果被高频交易者反复收割。
三、混合做市(Hybrid Market Making)
混合做市,就是把被动和主动结合起来。嗯,这里要注意——不是简单的「一半一半」,而是根据市场状态动态切换。
我一般把市场状态分成三种:
| 市场状态 | 波动率 | 推荐策略 | 说明 |
|---|---|---|---|
| 低波动 | ATR < 0.5% | 被动为主 | 吃价差,减少主动干预 |
| 中波动 | ATR 0.5%-2% | 混合模式 | 被动挂单+主动库存管理 |
| 高波动 | ATR > 2% | 主动为主 | 减少挂单,多用对冲 |
混合做市的精髓:在低波动时赚稳定的价差,在高波动时保命。
混合做市的实现思路
class HybridMarketMaker:
def __init__(self):
self.passive = PassiveMarketMaker()
self.active = ActiveMarketMaker()
self.state = 'low_vol'
def update_state(self, atr, mid_price):
vol_ratio = atr / mid_price
if vol_ratio < 0.005:
self.state = 'low_vol'
elif vol_ratio < 0.02:
self.state = 'mid_vol'
else:
self.state = 'high_vol'
def generate_quotes(self, mid_price, atr, orderbook):
self.update_state(atr, mid_price)
if self.state == 'low_vol':
# 纯被动
bid, ask = self.passive.calculate_quotes(mid_price, atr)
elif self.state == 'mid_vol':
# 被动为主,主动微调
bid, ask = self.passive.calculate_quotes(mid_price, atr)
imbalance = self.active.calculate_imbalance(
orderbook['bid_vol'], orderbook['ask_vol']
)
bid, ask = self.active.adjust_quotes(mid_price, imbalance)
else:
# 主动为主,减少挂单
bid, ask = self.active.adjust_quotes(mid_price, 1.0)
return bid, ask
避坑指南:我曾经在混合做市里犯过一个低级错误——状态切换太频繁。市场在低波动和高波动之间来回跳,我的策略也跟着来回切换,结果手续费比利润还高。后来我加了状态切换的滞后逻辑,比如连续5个tick都满足条件才切换,这才稳定下来。
三种策略的对比总结
| 维度 | 被动做市 | 主动做市 | 混合做市 |
|---|---|---|---|
| 收益来源 | 价差 | 价差+方向判断 | 动态调整 |
| 风险水平 | 中(库存风险) | 高(方向风险) | 中低 |
| 技术门槛 | 低 | 高 | 中高 |
| 适合场景 | 震荡市、低波动 | 趋势市、高波动 | 全场景 |
| 代码复杂度 | 简单 | 中等 | 复杂 |
我个人建议,刚开始做市的朋友先从被动做市入手。跑通一个简单的价差策略,把库存管理、风险控制这些基本功练扎实了,再考虑加主动逻辑。别一上来就想搞混合做市——我见过太多人,策略还没跑明白,先把自己搞晕了。
最后说一句:做市策略没有银弹。你在BTC上跑得好的策略,放到山寨币上可能亏成狗。一定要根据具体的交易品种、流动性、波动特征来调整。嗯,这就是为什么我每次换品种都要重新回测至少一个月的数据。