报价宽度参数:最优买卖价差设定、动态调整逻辑、市场波动率关联

做市策略里,报价宽度是最核心的参数之一。说白了,就是你愿意在买一和卖一之间留多大缝隙。缝隙太小,容易被两头吃掉;缝隙太大,又没人愿意跟你成交。这个度怎么拿捏?我今天跟你聊聊我的实战经验。

一、最优买卖价差的基本设定

先讲基础。价差设定不是拍脑袋定的,它跟几个硬指标挂钩。

参数 含义 典型范围
最小报价单位 交易所允许的最小价格变动 0.01元 / 0.001元
固定价差 买卖报价之间的固定差值 1~5个tick
比例价差 基于中间价的百分比 0.01% ~ 0.1%

我个人习惯用「最小报价单位的倍数」作为基础单位。比如在沪深300股指期货上,最小变动是0.2点,我通常设2~3个tick作为初始价差。为什么?因为太窄了,你想想看,万一遇到瞬间波动,你的单子会被秒吃,然后价格反向跑,你就亏了。

核心公式:
基础价差 = max(最小报价单位 × 倍数, 中间价 × 比例因子)

这里有个坑。我曾经在某个商品期货上直接用了固定倍数,结果遇到价格从3000涨到6000,价差还是2个tick,相当于比例从0.013%缩到了0.0067%。流动性变差,我的单子根本排不上队。后来我改成比例+固定双模式,取较大值,才稳住。

二、动态调整逻辑

静态价差只能应付平稳行情。真正的做市,价差必须会「动」。怎么动?我总结了三层逻辑。

2.1 基于订单簿深度调整

看买一和卖一位置的挂单量。如果买一挂了1000手,卖一只有10手,说明卖方稀缺。这时候我会把卖价抬高,买价不动,价差自然扩大。

def adjust_spread_by_depth(bid_vol, ask_vol, base_spread):
    imbalance = abs(bid_vol - ask_vol) / (bid_vol + ask_vol + 1e-8)
    if imbalance > 0.3:
        # 深度不平衡,扩大价差
        spread = base_spread * (1 + imbalance)
    else:
        spread = base_spread
    return spread

嗯,这里要注意。不平衡度阈值0.3是我在多个品种上试出来的经验值。太小了频繁调整,太大了反应迟钝。你可以根据自己做的品种微调。

2.2 基于成交速度调整

如果你的买单在1秒内就被吃掉了,说明价差可能设得太窄了。反过来,挂了10秒还没成交,说明价差太宽,你被市场抛弃了。

我做过一个简单的反馈控制器:

def feedback_spread(last_trade_time, current_time, spread):
    elapsed = current_time - last_trade_time
    if elapsed < 0.5:  # 0.5秒内成交,太频繁
        spread *= 1.2
    elif elapsed > 5.0:  # 5秒没成交,太冷清
        spread *= 0.9
    return spread

这个逻辑看着简单,但实际跑起来效果很好。我记得有一次在夜盘,行情突然加速,我的价差自动从3个tick扩到6个tick,帮我躲过了一波急跌。

2.3 基于持仓风险调整

做市商不是纯挂单,手里会有库存。库存多了,价差就要收窄,赶紧把货出掉。库存少了,价差可以放宽,慢慢赚。

我的经验: 库存风险调整的权重应该比前两个都大。因为库存是实打实的钱,深度和速度只是信号。

三、市场波动率关联

波动率是价差调整的「天花板」。高波动时,价差必须宽,否则你就是在给市场送钱。

我常用的波动率指标是「过去N笔交易的收益率标准差」。N取多少?我试过20、50、100,最后发现50笔最稳。太短了噪声大,太长了反应慢。

def vol_adjusted_spread(base_spread, price_series):
    returns = np.diff(np.log(price_series))
    vol = np.std(returns[-50:]) * np.sqrt(50)  # 年化波动率
    # 波动率每增加1%,价差扩大0.5%
    spread = base_spread * (1 + 0.5 * vol)
    return spread

为什么会这样?因为波动率代表不确定性。不确定性越高,你承担的风险越大,自然要收更高的「过路费」。

注意: 波动率调整不要过度。我曾经设过1:1的比例,结果波动率一上来,价差直接翻倍,单子全挂在天上,根本没人理。后来改成0.5倍,才平衡了风险和成交率。

四、整体框架图

下面这张图是我自己设计的价差调整流程,你可以参考一下。

报价宽度动态调整流程图 市场数据输入 步骤1:计算基础价差(固定tick + 比例) 步骤2:订单簿深度不平衡调整 步骤3:成交速度反馈调整 步骤4:波动率关联放大/缩小 最终报价宽度 库存风险反馈

这个流程我用了两年多,在三个不同的交易所跑过实盘。每次调整参数,我都会先回测一周的历史数据,看看价差分布是否合理。

五、实战中的避坑指南

  • 不要同时调整所有参数。 我建议一次只调一个维度,比如先调基础倍数,稳定了再调波动率系数。
  • 注意交易所的最小报价单位限制。 有些交易所不允许挂非整数tick的价差,你算出来3.7个tick,实际只能挂3或4。
  • 波动率计算窗口要跟你的交易频率匹配。 高频做市用50笔,中频用200笔,低频用1000笔。别搞混了。
一个小技巧: 把价差参数做成可配置的JSON文件,每次调整只改文件,不用改代码。这样回测和实盘切换也方便。

我曾经在实盘上线前忘了检查波动率窗口长度,结果用了一个200笔的窗口做高频。价差反应慢得像蜗牛,前5分钟亏了2%。从那以后,我每次上线前都会跑一遍参数检查脚本。

好了,报价宽度这块就聊到这儿。记住一句话:价差不是死的,它是你跟市场对话的语言。学会听懂市场的反馈,你的做市策略才能活起来。

专注资料整理