做市策略基础:什么是做市?做市策略的核心逻辑
做市,说白了就是「两边报价,赚差价」。
我刚开始接触这个领域时,觉得做市商就是交易所里的「黄牛」——左手买、右手卖,吃个中间价差。后来自己动手写策略才发现,事情远没那么简单。你想想看,如果真这么容易,为什么市场上90%的做市商都在亏钱?
嗯,今天我们就来拆解一下做市策略的核心逻辑。我会结合自己踩过的坑,把价差、库存、订单簿这三个核心要素讲透。
什么是做市?
做市商(Market Maker)的核心任务,就是为市场提供流动性。具体来说:
- 同时挂买单和卖单:在买一价挂单,在卖一价挂单
- 赚取价差:卖价 - 买价 = 你的利润
- 承担库存风险:万一方向走反了,你手里囤了一堆货
举个例子。假设BTC当前市场价是60,000 USDT。你挂单:
- 买一:59,990 USDT(买入1 BTC)
- 卖一:60,010 USDT(卖出1 BTC)
如果有人卖给你,你手里就有了1个BTC。如果有人从你手里买,你就赚了20 USDT的差价。看起来很简单对吧?
但问题来了——如果价格一直跌,你手里的BTC就变成了烫手山芋。这就是库存风险。
做市策略的核心逻辑
做市策略说白了就三件事:价差管理、库存控制、订单簿博弈。我们一个一个说。
1. 价差(Spread)——你的利润来源
价差就是卖一价和买一价之间的差值。公式很简单:
Spread = Ask_Price - Bid_Price
但实际策略中,价差不是固定的。我见过很多新手直接设一个固定价差,比如0.1%。结果市场波动一大,单子全被吃掉,亏得底裤都不剩。
我个人习惯用动态价差。核心逻辑是:
- 市场波动大 → 扩大价差(补偿风险)
- 市场波动小 → 缩小价差(吸引成交)
举个例子,我常用的一个价差模型:
spread = base_spread + k * volatility
其中 base_spread 是基础价差(比如0.05%),volatility 是近期波动率,k 是调节系数。
2. 库存(Inventory)——你的生死线
库存管理是做市策略里最容易被忽视、但也是最致命的一环。
我曾经犯过一个错误:某次做ETH做市,市场突然暴跌,我手里囤了200个ETH。当时觉得「没事,会反弹的」。结果跌了10%才止损,亏了6位数。
从那以后,我给自己定了一条铁律:库存必须控制在目标范围内。
库存管理的核心指标:
| 指标 | 含义 | 我的经验值 |
|---|---|---|
| 库存比率 | 当前库存 / 目标库存 | 0.8 ~ 1.2 |
| 库存偏离度 | (当前库存 - 目标库存)/ 目标库存 | ±20% 以内 |
| 库存周转率 | 每日成交额 / 平均库存 | 5 ~ 10 次/天 |
当库存偏离目标时,你需要调整报价:
- 库存过多:降低卖价,提高买价(鼓励卖出,抑制买入)
- 库存过少:提高卖价,降低买价(鼓励买入,抑制卖出)
说白了就是:手里货多了就便宜卖,货少了就贵点卖。
3. 订单簿(Order Book)——你的战场地图
订单簿就是当前市场上所有挂单的集合。做市策略的核心,就是读懂这张「地图」。
我一般关注订单簿的几个关键维度:
- 深度:每个价位上有多少量
- 斜率:价格越远,深度变化有多快
- 不平衡度:买单总量 vs 卖单总量
- 价差宽度:当前最优买卖价差
举个例子,如果买单深度远大于卖单深度,说明市场买盘强劲。这时候我会倾向于:
- 缩小卖价(更容易成交)
- 扩大买价(防止被砸盘)
反过来,如果卖单深度大,说明抛压重,我会谨慎做多库存。
这里有一个我常用的订单簿不平衡指标:
imbalance = (bid_volume - ask_volume) / (bid_volume + ask_volume)
取值范围 -1 到 1。正数表示买盘强,负数表示卖盘强。
价差决定你能赚多少,库存决定你会亏多少,订单簿告诉你往哪走。三者缺一不可。
做市策略的整体框架
说了这么多,我们来画一张图,把整个逻辑串起来。
这张图展示了我做策略时的完整流程。市场数据进来后,三个模块并行计算,然后汇总到报价决策引擎,最后输出挂单。同时,成交结果会反馈回来,形成闭环。
一个简单的做市策略示例
说了这么多理论,我们来看一个最简化的做市策略代码。嗯,这只是演示逻辑,生产环境千万别直接用。
class SimpleMarketMaker:
def __init__(self, base_spread=0.001, target_inventory=10):
self.base_spread = base_spread
self.target_inventory = target_inventory
self.current_inventory = 0
def calculate_spread(self, volatility):
"""动态价差计算"""
return self.base_spread * (1 + 2 * volatility)
def calculate_prices(self, mid_price, volatility, order_book):
"""计算买卖报价"""
spread = self.calculate_spread(volatility)
# 库存调整
inventory_deviation = (self.current_inventory - self.target_inventory) / self.target_inventory
inventory_adjustment = -0.5 * inventory_deviation * spread
# 订单簿不平衡调整
imbalance = order_book['bid_volume'] - order_book['ask_volume']
imbalance_adjustment = 0.1 * imbalance / (order_book['bid_volume'] + order_book['ask_volume']) * spread
# 最终报价
bid_price = mid_price * (1 - spread/2 + inventory_adjustment + imbalance_adjustment)
ask_price = mid_price * (1 + spread/2 + inventory_adjustment + imbalance_adjustment)
return bid_price, ask_price
这段代码虽然简单,但包含了三个核心要素:
- 价差随波动率动态调整
- 库存偏离时调整报价方向
- 订单簿不平衡影响报价偏移
做市策略的核心,说白了就是「在风险可控的前提下,赚取流动性溢价」。价差是你的利润,库存是你的风险,订单簿是你的情报。三者平衡好了,你就能在市场里稳定盈利。
嗯,今天就先聊到这里。记住,做市不是印钞机,而是精细的风险管理游戏。下一章我们会深入讲回测框架的设计,到时候我会分享更多实战中的坑和技巧。