4、流动性博弈:做市商策略与逆向选择成本
做市商,说白了就是市场的「中间商」。
你想想看,一个交易市场如果没有做市商,你想买的时候没人卖,你想卖的时候没人买,那这市场就废了。做市商的作用就是——随时报出买价和卖价,赚取差价。
但问题来了:做市商不是傻子,他们怕被「聪明钱」割韭菜。这种风险,在量化圈里有个专门的名字——逆向选择成本。
4.1 做市商的核心逻辑:赚什么钱?
做市商的利润来源,其实就两个:
- 买卖价差(Bid-Ask Spread):低价买,高价卖,赚中间那点缝隙。
- 订单流回扣(Rebate):有些交易所会给做市商返佣,鼓励他们提供流动性。
但别以为这钱好赚。我刚开始做市商策略的时候,觉得「不就是挂单等成交嘛」,结果第一个月亏了6%。为什么?因为你挂的单子,总是被最聪明的那批人吃掉。
核心公式:
做市商利润 = 价差收入 - 库存风险成本 - 逆向选择成本
其中,逆向选择成本往往是被低估的那一项。
4.2 什么是逆向选择成本?
举个例子你就明白了。
假设你是一个做市商,你在BTC/USDT上挂了买单:
- 买一价:30000 USDT
- 卖一价:30005 USDT
这时候,突然一个大单砸下来,把你的买单全吃了。你以为是正常成交?
不。很可能是因为某个量化基金提前知道了市场要跌,或者他们检测到了某个大单正在路上。他们抢在你前面卖给你,你接盘了。
这就是逆向选择——你总是和比你更聪明、信息更快的人做对手盘。
⚠️ 我曾经踩过的坑:
我曾经在ETH上挂了一个比较宽的价差,想着「反正我报价厚,不怕」。结果被一个高频做市商反复「挑单」——他们只在我报价错误的时候成交,其他时候根本不碰我。一个月下来,我亏了12%的库存价值。后来我才明白:你的报价越「傻」,越容易被聪明钱盯上。
4.3 如何量化逆向选择成本?
我个人习惯用「成交后价格漂移」来度量这个成本。
具体做法:
- 记录每一笔成交的价格和时间
- 统计成交后1秒、5秒、30秒的价格变化
- 如果成交后价格朝着不利于你的方向移动,说明你被逆向选择了
举个代码例子:
import pandas as pd
import numpy as np
def calculate_adverse_selection_cost(trades, mid_prices, lookahead=5):
"""
trades: DataFrame, 包含 ['timestamp', 'price', 'side']
mid_prices: Series, 时间序列中间价
lookahead: 看未来几秒的价格变化
"""
costs = []
for _, trade in trades.iterrows():
t = trade['timestamp']
p = trade['price']
side = trade['side'] # 'buy' 或 'sell'
# 找到未来 lookahead 秒的中间价
future_idx = mid_prices.index.get_loc(t, method='nearest')
if future_idx + lookahead < len(mid_prices):
future_price = mid_prices.iloc[future_idx + lookahead]
else:
continue
# 如果是买单,价格下跌说明被逆向选择
if side == 'buy':
cost = (future_price - p) / p
else:
cost = (p - future_price) / p
costs.append(cost)
return np.mean(costs)
# 使用示例
avg_cost = calculate_adverse_selection_cost(my_trades, mid_prices, lookahead=5)
print(f"平均逆向选择成本: {avg_cost:.4%}")
嗯,这里要注意:lookahead 参数很敏感。太短(比如1秒)可能只是噪声,太长(比如60秒)可能混入其他市场因素。我个人习惯用5秒,对于大多数加密货币市场来说比较合理。
4.4 做市商策略的三大防线
既然逆向选择成本这么可怕,怎么防?我总结了三条:
4.4.1 动态价差调整
别傻傻地挂固定价差。当市场波动率上升时,价差要拉宽。为什么?因为波动率越高,你被逆向选择的概率越大。
我常用的公式:
spread = base_spread * (1 + k * volatility)
# 其中 volatility 可以用最近N笔交易的收益率标准差来算
4.4.2 订单簿位置管理
别总挂在最优价位。我见过很多新手做市商,非要把买单挂在买一,卖单挂在卖一。结果呢?每次都被「钓鱼」。
我的做法:
- 在波动率低的时候,挂近一点(买一、卖一)
- 在波动率高的时候,挂远一点(买二、卖二甚至更远)
- 如果检测到有大单在附近,直接撤单
4.4.3 库存风险对冲
如果你做市的是BTC,手里攒了一堆BTC多头,这时候你其实很脆弱。万一BTC暴跌,你不仅亏库存,还被逆向选择双重打击。
我建议:
- 在期货市场做空对冲
- 或者控制库存上限,超过阈值就停止做市
💡 一个小技巧:
我曾经在某个项目里,把库存风险拆成「方向性风险」和「非方向性风险」。方向性风险用期货对冲,非方向性风险(比如价差波动)用期权保护。效果还不错,夏普比率从0.8提到了1.6。
4.5 逆向选择成本的实战检测
你可能会问:我怎么知道我的策略有没有被逆向选择?
嗯,我一般用「成交后收益分布」来检测。
具体做法:
- 把所有成交按时间分成两组:被动的(挂单成交)和主动的(吃单成交)
- 分别统计这两组成交后的价格变化
- 如果被动成交后的价格变化显著为负,说明你的挂单被聪明钱盯上了
| 成交类型 | 成交后5秒平均收益 | 结论 |
|---|---|---|
| 被动买单(挂单成交) | -0.03% | 被逆向选择 |
| 主动买单(吃单成交) | +0.01% | 正常 |
| 被动卖单(挂单成交) | -0.04% | 被逆向选择 |
| 主动卖单(吃单成交) | +0.02% | 正常 |
你看这个表格,被动成交的收益都是负的。这说明什么?说明你的报价策略有问题,你总是在给聪明钱「送钱」。
4.6 做市商策略的完整框架图
下面我用一张SVG图,把整个做市商策略的核心逻辑串起来:
4.7 避坑指南:我犯过的三个错误
最后,分享几个我亲身踩过的坑:
坑一:过度自信于「统计套利」
我曾经写了一个看起来很美的做市商策略,回测夏普2.5。结果实盘第一天就被打爆了。为什么?因为回测数据里没有包含「极端行情下的逆向选择」。后来我加了一个规则:当市场波动率超过某个阈值时,直接停止做市。
坑二:忽略「订单簿深度」
有段时间我只看价差,不看深度。结果在一个流动性很差的币对上做市,我的单子挂在买一,结果一个2000BTC的大单砸下来,我直接被穿成筛子。现在我的策略里有一个「深度过滤器」:如果买一和买二之间的深度差超过3倍,我就撤单。
坑三:不做「成交后分析」
早期我只看盈亏,不看成交质量。后来发现,虽然整体是赚钱的,但被动成交的亏损率高达40%。这说明我的策略一直在给聪明钱「输血」。从那以后,我每天跑一次逆向选择成本检测,一旦发现异常就调整参数。
做市商策略,说白了就是一场信息不对称的博弈。你永远不可能比市场更聪明,但你可以通过机制设计,让自己不那么「傻」。动态调整价差、管理订单簿位置、对冲库存风险——这三板斧用好了,你就能在流动性博弈中活下来,甚至活得不错。
💡 最后一个小建议:
如果你刚开始做做市商策略,别急着上实盘。先用模拟盘跑一个月,每天分析你的逆向选择成本。等你能把那个数字控制在-0.01%以内,再考虑实盘。我当年就是太急了,亏了三个月学费才明白这个道理。