4、波动行情下的报价策略:动态价差调整、深度报价与轻仓报价切换、做市商库存管理
行情一波动,很多新手做市商就慌了。报价不敢出,出了又怕被吃。其实波动行情恰恰是做市商拉开差距的时候。我做了这么多年ETF做市,最深的体会就是:波动不是风险,失控才是。
这一章,我重点聊聊波动行情下怎么调整报价策略。说白了就三件事:价差怎么调、仓位怎么切、库存怎么管。这三件事做好了,波动越大你越稳。
4.1 动态价差调整:别死守固定价差
很多做市商喜欢设一个固定价差,比如0.01元。平时还行,一到波动行情就出问题。为什么?因为波动率变了,你的风险敞口也变了。
我个人习惯用波动率加权价差。核心公式很简单:
动态价差 = 基准价差 × (当前波动率 / 基准波动率) × 风险系数
举个例子。假设基准波动率是20%,基准价差是0.01元。现在波动率飙到40%,风险系数设为1.2。那么动态价差就是:
0.01 × (40% / 20%) × 1.2 = 0.024元
价差直接翻了一倍多。这不是乱调,是有逻辑的。
核心逻辑:波动率翻倍,意味着价格在单位时间内可能跑得更远。你的风险敞口变大了,价差必须跟着放大,否则就是在给市场送钱。
我在项目中遇到过一种情况:某只ETF突然因为成分股停牌,波动率瞬间飙升。团队里有人想维持原价差抢单量。我直接拦住了。你想想看,波动率翻了三倍,价差不变,一个大的错误报价就能把一个月利润吃掉。
具体怎么实现?我一般用滚动窗口法计算实时波动率:
def calc_dynamic_spread(base_spread, price_series, window=20):
# 计算滚动波动率
log_returns = np.log(price_series / price_series.shift(1))
current_vol = log_returns.tail(window).std() * np.sqrt(252)
# 基准波动率(历史均值)
base_vol = log_returns.std() * np.sqrt(252)
# 动态调整
vol_ratio = current_vol / base_vol
dynamic_spread = base_spread * vol_ratio
# 上下限保护
dynamic_spread = np.clip(dynamic_spread, base_spread * 0.5, base_spread * 3.0)
return dynamic_spread
小技巧:别忘了加上下限。我见过有人把价差调到0.05元,结果一整天没成交。价差太宽,流动性就没了。一般下限设0.5倍基准价差,上限设3倍。
4.2 深度报价与轻仓报价切换:看行情下菜碟
波动行情下,不是所有时候都适合深度报价。我把它分成三种模式:
| 行情状态 | 报价模式 | 单笔数量 | 价差策略 |
|---|---|---|---|
| 正常波动(波动率 < 30%) | 深度报价 | 正常量(如1000股) | 基准价差 |
| 中等波动(30% ≤ 波动率 < 60%) | 轻仓报价 | 减半量(如500股) | 1.5倍价差 |
| 剧烈波动(波动率 ≥ 60%) | 极轻仓/暂停 | 1/4量或暂停 | 2-3倍价差 |
为什么要切换?我举个例子你就明白了。
正常行情下,你挂1000股买单,价差0.01元。市场平稳,这单子可能挂几分钟才成交。但波动行情下,价格可能几秒钟就变一次。你挂1000股,一个急跌全部成交,你手里全是货。然后价格继续跌,你就被套了。
轻仓报价的核心思想是:用更小的单量去试探市场。我习惯在波动率超过30%时,自动把单量减半。超过60%时,直接减到1/4,甚至暂停报价。
注意:暂停报价不是不报价,而是只挂被动单。比如只挂买一和卖一,不主动追单。我曾经在2015年股灾时吃过亏,波动率爆表还硬着头皮报价,结果一天亏了三个月的利润。
切换逻辑的代码实现:
def switch_quote_mode(current_vol, base_vol):
vol_ratio = current_vol / base_vol
if vol_ratio < 1.3:
mode = 'deep'
size = 1000
spread_mult = 1.0
elif vol_ratio < 2.0:
mode = 'light'
size = 500
spread_mult = 1.5
else:
mode = 'ultra_light'
size = 250
spread_mult = 2.5
return mode, size, spread_mult
4.3 做市商库存管理:别让库存绑架你
库存管理是做市商的核心能力。波动行情下,库存管理的重要性会放大十倍。
我总结了一个库存健康度指标:
库存健康度 = (当前库存 - 目标库存) / 目标库存
健康度在±20%以内是安全的。超过这个范围,就要主动调整了。
举个例子。假设你的目标库存是10000股,当前持有15000股。健康度就是(15000-10000)/10000 = 50%。这已经严重超标了。
怎么办?我一般用不对称报价法:
- 库存偏高时:卖单报价更激进(价差收窄),买单报价更保守(价差放宽)
- 库存偏低时:买单报价更激进,卖单报价更保守
具体调整公式:
# 库存偏高时
bid_spread = base_spread * (1 + inventory_ratio * 0.5) # 买单价差放大
ask_spread = base_spread * (1 - inventory_ratio * 0.3) # 卖单价差缩小
# 库存偏低时
bid_spread = base_spread * (1 - inventory_ratio * 0.3) # 买单价差缩小
ask_spread = base_spread * (1 + inventory_ratio * 0.5) # 卖单价差放大
关键点:库存调整要平滑,不要急转弯。我曾经为了快速去库存,把卖单价差缩到几乎为零,结果被高频交易者连续吃掉,库存没降多少,反而亏了手续费。
还有一个容易被忽略的点:库存成本基准。波动行情下,你的持仓成本会快速变化。我习惯用移动平均成本来评估库存盈亏:
def calc_inventory_pnl(inventory, trades):
# 计算加权平均成本
total_cost = sum(trade.price * trade.quantity for trade in trades)
total_qty = sum(trade.quantity for trade in trades)
avg_cost = total_cost / total_qty
# 当前市值
current_value = inventory * current_price
# 浮动盈亏
unrealized_pnl = current_value - (avg_cost * inventory)
return unrealized_pnl, avg_cost
嗯,这里要注意:不要只看浮动盈亏,要看库存周转率。我见过有人库存浮盈很大,但全是死库存,根本卖不出去。波动行情下,流动性才是王道。
4.4 三者联动:一个完整的报价决策框架
动态价差、仓位切换、库存管理,这三件事不是孤立的。它们必须联动起来。
我画了一个决策流程图,你看看就明白了:
这个框架的核心思想是:先看波动率,再定模式,然后调价差,最后用库存做修正。每一步都是上一步的输入,形成一个闭环。
我在实际项目中,把这个框架做成了一个自动化模块。每天开盘前加载参数,盘中自动运行。遇到极端行情,系统会自动降级到轻仓模式,同时给我发一条预警消息。
实战建议:刚开始做波动行情报价时,别急着全自动。先手动跑一段时间,把参数调顺了再上自动化。我见过有人一上来就全自动,结果参数没调好,一天亏了十几万。
最后说一句:波动行情下,活着比赚钱重要。价差调宽一点,仓位轻一点,库存控制紧一点。虽然赚得少,但至少不会亏。等行情平稳了,再慢慢把利润赚回来。
这就是我做市这么多年,最朴素的生存法则。
公众号:蓝海资料掘金营,微信deep3321