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.0
  • inventory_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