4. 价差策略设计:固定价差策略、动态价差策略、基于波动率的价差调整、基于订单簿不平衡的价差调整、价差与库存风险的平衡

做市商的核心工作,说白了就是「低买高卖」赚价差。但价差设多少,是个技术活。

设太宽,单子挂不出去,赚不到钱。设太窄,虽然成交快,但容易被高频玩家反复收割。我见过不少新手做市商,上来就把价差压到0.01%,结果被套利机器人来回摩擦,库存全亏光了。

这一章,我们来拆解价差设计的几种主流思路。我会结合实战经验,把每种策略的优缺点、适用场景都讲透。

4.1 固定价差策略

这是最基础的策略。说白了,就是不管市场怎么变,我就在中间价两边各挂一个固定宽度的单子。

比如BTC/USDT当前中间价是50000,我设价差0.1%,那么买单价就是49975,卖单价就是50025。就这么简单。

优点:实现简单,逻辑清晰,适合新手入门。
缺点:市场波动大时容易被吃掉,波动小时又赚不够。

我在项目中遇到过一个小团队,他们用固定价差做ETH/USDT,设了0.05%。结果那天ETH突然拉升3%,他们的卖单瞬间被扫光,库存全变成了USDT。嗯,这就是固定价差的典型风险——你无法适应市场变化。

我的建议:固定价差只适合在低波动、高流动性的成熟币对上使用。比如BTC/USDT、ETH/USDT的主交易对。别拿它去做山寨币。

4.2 动态价差策略

动态价差,就是让价差跟着市场走。市场波动大,我就把价差拉宽;市场平稳,我就收窄。

为什么这么做?你想想看,波动大的时候,价格跳来跳去,你设窄价差很容易被「插针」打穿。拉宽一点,给自己留点安全垫。

最简单的动态价差公式:

spread = base_spread + k * volatility

其中base_spread是基础价差,k是敏感系数,volatility是当前波动率。

我习惯用过去N笔成交的收益率标准差来算波动率。N取多少?我个人觉得20-50比较合适,太短了噪声大,太长了反应慢。

注意:动态价差虽然比固定价差灵活,但参数调不好也会出问题。我曾经把k设得太大,结果波动稍微一高,价差直接拉到了0.5%,单子根本挂不出去,白白浪费了行情。

4.3 基于波动率的价差调整

这个策略是动态价差的升级版。核心思想是:用更精细的波动率模型来指导价差调整。

常用的波动率指标有:

  • 历史波动率(HV):过去一段时间价格变动的标准差
  • 已实现波动率(RV):用高频数据算的日内波动
  • 隐含波动率(IV):从期权价格反推的波动率(如果有期权市场)

我个人比较喜欢用已实现波动率。为什么呢?因为它反应快,能捕捉到分钟级别的波动变化。

举个例子:

def calc_spread_by_volatility(mid_price, rv, base_spread=0.0005):
    # rv: 已实现波动率,比如0.02表示2%
    # 当rv < 0.01时,用基础价差
    # 当rv在0.01-0.05之间,价差线性放大
    # 当rv > 0.05时,价差设到最大0.002
    
    if rv < 0.01:
        return base_spread
    elif rv < 0.05:
        return base_spread + (rv - 0.01) * 0.03
    else:
        return 0.002

这段代码看着简单,但实际跑起来效果不错。我在做SOL/USDT时用过类似的逻辑,把价差从0.03%到0.15%动态调整,整体收益比固定价差高了大概30%。

小技巧:波动率计算的时间窗口要跟你的做市频率匹配。如果你是高频做市(秒级),用1-5分钟窗口;如果是中低频(分钟级),用15-30分钟窗口。

4.4 基于订单簿不平衡的价差调整

这个策略关注的是订单簿的「形状」。说白了,就是看买单多还是卖单多。

订单簿不平衡指标(Order Book Imbalance, OBI)的计算方式:

OBI = (bid_volume - ask_volume) / (bid_volume + ask_volume)

OBI的取值范围是[-1, 1]。正值表示买单多,负值表示卖单多。

当OBI很大时(比如0.8),说明买方力量强,价格可能要涨。这时候你应该把卖单价差拉宽,把买单价差收窄。反过来也一样。

我见过一个很经典的实现:

def adjust_spread_by_obi(base_spread, obi, max_adjust=0.5):
    # obi: -1 到 1
    # 根据obi调整价差偏移
    adjust = obi * max_adjust
    bid_spread = base_spread * (1 - adjust)  # 买单收窄
    ask_spread = base_spread * (1 + adjust)  # 卖单拉宽
    return bid_spread, ask_spread
避坑指南:我曾经在某个小币种上用过这个策略,结果OBI指标被一个大户的虚假挂单给骗了。他挂了一大堆买单但不成交,OBI飙到0.9,我把买单价差收得很窄,结果他撤单后价格暴跌,我直接被套。所以,用OBI时一定要结合成交量过滤,别只看挂单量。

4.5 价差与库存风险的平衡

这是价差设计的终极难题。价差设得宽,库存风险小,但赚得少。价差设得窄,成交快,但库存风险大。

怎么平衡?核心思路是:让价差反映你的库存风险暴露

具体来说,就是引入一个「库存惩罚因子」。当你的库存偏离目标水平时,价差自动调整。

比如你的目标库存是50% BTC、50% USDT。现在BTC库存变成了60%,说明你BTC多了,风险暴露大。这时候应该把BTC的卖单价差收窄(鼓励卖出),把买单价差拉宽(抑制买入)。

一个简单的实现:

def inventory_adjusted_spread(base_spread, inventory_ratio, target_ratio=0.5):
    # inventory_ratio: 当前库存比例(比如BTC占比)
    # target_ratio: 目标库存比例
    deviation = inventory_ratio - target_ratio
    # deviation为正,说明BTC多了,要鼓励卖出
    bid_spread = base_spread * (1 + deviation * 2)  # 买单价差拉宽
    ask_spread = base_spread * (1 - deviation * 2)  # 卖单价差收窄
    return bid_spread, ask_spread
核心原则:库存偏离越大,价差调整幅度越大。但要注意设一个上限,别让价差变成负数或者太离谱。

我个人的经验是,把库存风险调整和波动率调整结合起来用效果最好。比如:

  • 先用波动率算出基础价差
  • 再用OBI做方向性微调
  • 最后用库存风险做最终修正

三层叠加,基本能应对大部分市场情况。

知识体系总览

下面这张图总结了价差策略的核心逻辑和相互关系:

价差策略设计知识体系 价差策略设计 固定价差策略 简单但不够灵活 动态价差策略 随市场波动调整 波动率价差调整 精细波动率模型 OBI价差调整 订单簿不平衡 价差与库存风险的平衡 库存偏离越大,价差调整幅度越大 三层叠加:波动率 → OBI → 库存风险 最终价差 = 基础价差 × 波动率因子 × OBI因子 × 库存因子

这张图把价差策略的四个子策略和库存风险平衡的关系画清楚了。你可以看到,从最简单的固定价差,到动态价差,再到基于波动率和OBI的精细调整,最后都要回归到库存风险这个核心问题上。

嗯,价差设计没有银弹。不同的币种、不同的市场环境、不同的资金规模,适合的策略都不一样。我建议你从固定价差开始,逐步加入动态调整,最后再引入库存风险控制。一步一步来,别想一口吃成胖子。

最后说一句:价差策略的成败,很大程度上取决于你对市场的理解。多观察、多回测、多复盘。我曾经花了一个月时间调参数,最后发现最简单的策略反而最赚钱。有时候,少即是多。

公众号:蓝海资料掘金营,微信deep3321