4. 报价策略基础:对称报价与非对称报价、固定价差与动态价差策略
做市商的核心工作,说白了就是「不停地报出买卖价格」。但怎么报?报多宽?这里面门道很深。我刚开始做市的时候,以为只要把买卖价差设成固定值就行了,结果被市场狠狠教育了一顿。今天我们就来拆解报价策略的四个基本维度。
4.1 对称报价 vs 非对称报价
先看一个最简单的场景。假设某股票当前市场中间价是 100 元。你作为做市商,要报出买价和卖价。
对称报价:买价和卖价围绕中间价对称分布。比如买价 99.8,卖价 100.2,价差 0.4 元。中间价正好是 100。
非对称报价:买价和卖价不围绕中间价对称。比如买价 99.7,卖价 100.2,价差 0.5 元。中间价变成了 99.95,明显偏向买方一侧。
为什么要用非对称报价?我举个例子。假设你手上持有大量某币种的多头仓位,风险敞口很大。这时候你希望吸引买家来接盘,同时吓退卖家。怎么做?把卖价报低一点,把买价也报低一点。这样你的报价整体下移,更容易成交卖单(你买入),更难成交买单(你卖出)。
核心逻辑:对称报价适用于中性库存管理,非对称报价用于主动调整库存风险。
我在项目中遇到过一种情况:某个流动性较差的代币,市场深度很薄。我如果用对称报价,很容易被大单吃掉一边,导致库存严重偏离目标。后来我改用非对称报价,根据实时库存偏离度动态调整偏移量,效果好了很多。
4.2 固定价差 vs 动态价差
价差就是买卖价之间的差值。固定价差策略,顾名思义,不管市场怎么波动,价差始终不变。比如永远保持 0.2 元的价差。
动态价差策略则根据市场状态实时调整价差。波动率高了,价差拉宽;波动率低了,价差收窄。
为什么需要动态调整?你想想看,如果市场突然出现剧烈波动,你还用固定价差,很可能被高频交易者反复收割。我记得有一次,某个消息出来后市场瞬间波动了 2%,我当时的固定价差只有 0.1%,结果被连续吃了好几笔,亏损惨重。
| 策略类型 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 固定价差 | 低波动、高流动性市场 | 简单、易实现、确定性高 | 无法适应波动变化,容易被套利 |
| 动态价差 | 高波动、低流动性市场 | 自适应市场环境,风险可控 | 参数调优复杂,可能过度反应 |
4.3 四种策略的组合矩阵
把对称/非对称和固定/动态组合起来,就得到四种基本报价策略。我习惯用一张图来理解它们的关系。
这张图我经常用来给团队做培训。从左下角到右上角,策略复杂度逐渐增加,但适应能力也在提升。我个人建议,新手先从「对称+固定」开始,跑通了再逐步升级。
4.4 动态价差的数学模型
动态价差的核心公式其实不复杂。我常用的一个版本是:
spread = base_spread + k * volatility + lambda * inventory_skew
其中:
base_spread:基础价差,通常取市场平均价差volatility:近期波动率,可以用标准差或 ATR 计算k:波动率敏感系数,我一般取 0.5~2.0inventory_skew:库存偏离度,表示当前库存与目标库存的差距lambda:库存调整系数,控制库存回归速度
小技巧:波动率计算窗口我习惯用 20 个 tick 或 1 分钟。太短容易过度反应,太长又滞后。你可以根据交易品种的流动性来调。
4.5 实战中的避坑指南
我曾经犯过一个低级错误:在动态价差策略里把波动率敏感系数设得太高。结果市场稍微一波动,价差就拉得特别宽,导致完全无法成交。等波动过去,价差收窄,我又被其他做市商抢了先机。那天的收益惨不忍睹。
后来我总结了几条经验:
- 不要过度拟合历史数据。你回测时表现很好的参数,实盘可能一塌糊涂。市场结构会变。
- 价差不能无限宽。要设置上下限。我一般设为基础价差的 0.5 倍到 3 倍。
- 非对称偏移要有限度。偏移太多会导致报价严重偏离市场,容易被套利者盯上。
- 注意订单簿的深度。如果你的报价在很浅的位置,即使价差很小,也可能被大单吃掉。
重要提醒:动态价差策略在低流动性市场可能失效。因为报价更新频率跟不上市场变化,价差调整会滞后。我建议在流动性低于某个阈值时,切换到固定价差模式保命。
4.6 一个简单的实现示例
下面是一个 Python 风格的伪代码,展示动态价差的核心逻辑。实际生产环境会更复杂,但骨架就是这样。
class DynamicSpreadMaker:
def __init__(self, base_spread=0.002, k=1.0, lambda_=0.5):
self.base_spread = base_spread
self.k = k
self.lambda_ = lambda_
self.target_inventory = 100 # 目标库存
self.current_inventory = 100
def calc_volatility(self, recent_prices):
# 计算近期波动率
returns = [p1/p0 - 1 for p0, p1 in zip(recent_prices[:-1], recent_prices[1:])]
return np.std(returns)
def calc_inventory_skew(self):
# 库存偏离度,正值表示库存过多
return (self.current_inventory - self.target_inventory) / self.target_inventory
def get_spread(self, recent_prices):
vol = self.calc_volatility(recent_prices)
skew = self.calc_inventory_skew()
spread = self.base_spread + self.k * vol + self.lambda_ * abs(skew)
# 限制价差范围
return max(self.base_spread * 0.5, min(spread, self.base_spread * 3.0))
def get_quotes(self, mid_price, recent_prices):
spread = self.get_spread(recent_prices)
half_spread = spread / 2
skew = self.calc_inventory_skew()
# 非对称偏移:库存多时压低买价,库存少时抬高卖价
offset = self.lambda_ * skew * self.base_spread
bid = mid_price - half_spread + offset
ask = mid_price + half_spread + offset
return bid, ask
这段代码里,offset 实现了非对称报价。库存多时 skew 为正,offset 为正,买价和卖价都上移,更容易卖出。库存少时则相反。嗯,这个逻辑说起来简单,但调参确实需要花时间。
最后说一句:报价策略没有银弹。你在某个市场跑得很好的策略,换到另一个市场可能完全失效。我建议你多观察、多测试,找到适合自己风格和风险偏好的组合。
公众号:蓝海资料掘金营,微信deep3321