3、库存压力测试场景设计:历史场景回放与合成场景生成

库存压力测试,说白了就是给你的做市系统“上强度”。

你想想看,平时行情风平浪静,系统跑得稳稳当当。但一到极端行情,库存风险瞬间暴露。我见过太多团队,回测时曲线漂亮得不行,一上实盘就被一波流动性枯竭打穿。

所以,场景设计是压力测试的灵魂。今天我们就来聊聊怎么设计靠谱的测试场景。

3.1 历史场景回放:让历史教训重演

历史场景回放,是最直接、最真实的压力测试方式。我个人习惯,先把历史上几次著名的极端行情拉出来,作为必测项目。

3.1.1 2020年3月:流动性黑洞

2020年3月,新冠疫情引发的全球市场恐慌,至今记忆犹新。我记得当时比特币从10000美元跌到3800美元,只用了两天时间。做市商面临的是:

  • 价格断崖式下跌:分钟级别的跌幅超过10%
  • 买卖价差急剧扩大:从平时的0.01%扩大到1%以上
  • 订单簿深度骤降:盘口挂单量减少80%以上

我在项目中遇到过,有些做市策略在回测时表现很好,但一遇到这种行情,库存瞬间堆积,亏损速度远超预期。为什么会这样?因为回测用的是正常行情,而极端行情下的流动性结构完全不同。

关键指标: 2020年3月12日,比特币现货市场买卖价差一度超过2%,深度(1%价格范围内的挂单量)下降至正常水平的15%。

3.1.2 2021年5月:政策冲击下的踩踏

2021年5月19日,中国监管政策出台,市场瞬间崩盘。这次行情的特点是:

  • 多市场联动下跌:现货、期货、永续合约同步暴跌
  • 资金费率异常:永续合约资金费率一度达到-1%以上
  • 交易所间价差扩大:不同交易所的价差超过5%

嗯,这里要注意。2021年5月的行情,对跨交易所做市策略冲击特别大。我有个朋友,他的策略在正常行情下能稳定套利,但5月19日那天,交易所之间的价差瞬间拉大,他的库存对冲完全失效,一天亏掉了三个月的利润。

避坑指南: 我曾经以为历史回放只要把价格数据喂进去就行。后来发现,订单簿的深度数据、成交数据、资金费率数据,一个都不能少。否则回放出来的场景是“假”的。

3.2 合成场景生成:制造你想象不到的极端

历史场景虽然真实,但市场永远在进化。下一次极端行情,可能和历史上任何一次都不一样。所以,我们需要合成场景——人为制造各种极端条件,看看系统能不能扛住。

3.2.1 波动率突变场景

波动率突变,是库存风险的主要来源。我建议从三个维度来构造:

  1. 瞬时波动率飙升:在1秒内,波动率从正常水平跳升到10倍
  2. 波动率持续高位:波动率在高位维持30分钟以上
  3. 波动率集群:高波动率之后紧接着更高波动率

合成方法其实不复杂。你可以用GARCH模型来生成波动率路径,也可以直接用历史波动率做随机采样。我个人习惯用后者,因为更直观,也更容易控制。

# 波动率突变场景生成示例
import numpy as np

def generate_volatility_shock(base_vol, shock_factor, duration):
    """
    base_vol: 基础波动率(年化)
    shock_factor: 突变倍数
    duration: 突变持续时长(秒)
    """
    normal_vol = base_vol / np.sqrt(365 * 24 * 3600)  # 秒级波动率
    shock_vol = normal_vol * shock_factor
    
    # 生成突变序列
    vol_series = np.ones(duration) * shock_vol
    # 加入随机扰动
    vol_series *= (1 + 0.1 * np.random.randn(duration))
    
    return vol_series
小技巧: 合成场景时,不要只做一次。我建议至少生成1000个不同的波动率突变路径,然后看系统在95%分位数下的表现。这才是真正的压力测试。

3.2.2 流动性枯竭场景

流动性枯竭,是做市商的噩梦。你想想看,当市场突然没人交易了,你的库存就变成了“烫手山芋”。

合成流动性枯竭场景,我一般关注这几个参数:

参数 正常值 枯竭值 说明
盘口深度 100 BTC 5 BTC 1%价格范围内的挂单量
买卖价差 0.01% 0.5% 最优买卖价差
成交频率 10笔/秒 0.1笔/秒 市场成交速度
订单撤销率 30% 90% 挂单被撤销的比例

合成时,我建议把这些参数做成动态变化的。比如,先让深度缓慢下降,然后突然加速,最后在某个点瞬间归零。这样更接近真实市场的流动性崩塌过程。

核心逻辑: 流动性枯竭场景下,做市商的库存周转率会急剧下降。如果你的策略依赖高频成交来管理库存,那在这种场景下会非常危险。

3.3 场景组合与执行策略

光有场景还不够,怎么执行也很关键。我总结了一套组合策略:

  1. 单场景测试:每个场景独立运行,看系统能不能存活
  2. 连续场景测试:把多个场景串联起来,模拟“黑天鹅”接连发生
  3. 随机场景测试:从场景库中随机抽取,模拟不可预测的市场

我个人最看重连续场景测试。因为真实市场里,极端行情往往不是孤立的。2020年3月之后,紧接着就是2020年4月的流动性恢复期,期间波动率依然很高。如果你的系统只能扛住单一冲击,那还不够。

注意: 场景执行时,一定要记录系统的完整状态。库存水平、盈亏曲线、成交记录、订单簿快照,这些数据缺一不可。否则你没法分析系统到底是在哪个环节崩溃的。

3.4 本章知识体系

下面这张图,是我对库存压力测试场景设计的整体理解。你可以把它当作一个检查清单,看看自己有没有遗漏。

库存压力测试场景设计 历史场景回放 合成场景生成 2020年3月 2021年5月 关键特征 • 价格断崖式下跌 • 买卖价差急剧扩大 • 订单簿深度骤降 波动率突变 流动性枯竭 关键特征 • 瞬时波动率飙升10倍 • 盘口深度下降95% • 成交频率降至0.1笔/秒 执行策略:单场景 → 连续场景 → 随机场景 输出:库存风险报告 + 系统容量评估

这张图把整个场景设计的脉络理清楚了。左边是历史场景,右边是合成场景,中间是执行策略,最终输出风险报告和容量评估。你照着这个框架去搭建,基本不会漏掉关键环节。

最后说一句: 场景设计不是一次性工作。市场在变,你的策略也在变。我建议每季度更新一次场景库,把最新的极端行情加进去,把过时的场景淘汰掉。这样才能保证压力测试始终有效。

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