4、历史情景构建法:基于历史极端事件构建压力情景

做压力测试,最怕什么?

怕你设计的场景根本不够「极端」。

我见过不少团队,自己拍脑袋想了个暴跌20%的场景,觉得已经很吓人了。结果回头一看,1987年一天跌了22%,2008年雷曼倒闭后市场连续熔断,2020年新冠直接把流动性打穿。你那个20%?说实话,连热身都算不上。

所以,我个人习惯的做法是——直接从历史里找素材。历史不会重复,但人性会。极端事件背后的市场行为、流动性枯竭、恐慌传导,这些规律是通用的。

4.1 核心思路:把历史「搬」到当下

历史情景构建法,说白了就是:

  1. 选事件:挑几个有代表性的历史极端行情
  2. 拆特征:把当时的价格波动、成交量变化、相关性突变等关键指标提取出来
  3. 做映射:把这些特征「贴」到你当前的持仓和策略上
  4. 算结果:看看如果历史重演,你的做市商会亏多少

嗯,这里要注意——不是简单地把历史价格曲线直接套用。因为市场结构变了,波动率水平也不同。我们要提取的是相对变化幅度模式特征,而不是绝对值。

关键原则:历史情景构建的核心是「模式复用」,而非「数据复用」。

4.2 三大经典历史事件拆解

我挑三个最典型的,也是我在项目中反复用到的:

事件 时间 核心特征 对做市商的影响
1987年黑色星期一 1987.10.19 单日暴跌22%,流动性瞬间消失 报价被击穿,库存无法对冲
2008年金融危机 2008.09-2009.03 相关性突变,信用利差飙升 多资产组合同时亏损
2020年新冠冲击 2020.02-2020.03 波动率爆表,日内反转频繁 高频策略失效,滑点巨大

4.3 具体构建步骤(附代码)

我一般分四步走。拿2020年新冠场景举个例子:

第一步:提取特征向量

从2020年2月20日到3月23日,提取以下指标:

  • 标普500指数日收益率:最大单日跌幅-12%
  • VIX指数:从15飙升至82
  • 买卖价差:平均扩大5-8倍
  • 成交量:放大3-4倍

第二步:映射到当前持仓

假设你现在做市的是某只科技股ETF。你需要把2020年的波动率变化、价差变化按比例映射过来。

# 伪代码示例:历史情景映射
def build_covid_scenario(current_price, current_vol, current_spread):
    # 提取2020年特征
    hist_vol_shock = 82 / 15  # VIX从15到82,放大5.47倍
    hist_spread_shock = 6     # 价差平均扩大6倍
    
    # 映射到当前
    scenario_vol = current_vol * hist_vol_shock
    scenario_spread = current_spread * hist_spread_shock
    
    # 价格路径模拟
    price_path = generate_gbm_path(
        S0=current_price,
        mu=-0.03,  # 2020年Q1累计跌幅约30%,日均约-0.03%
        sigma=scenario_vol,
        T=30,      # 模拟30个交易日
        n=1000     # 1000条路径
    )
    
    return price_path, scenario_spread

第三步:运行压力测试

把生成的场景数据喂给你的做市策略,看PnL曲线。我建议重点关注:

  • 最大回撤(Max Drawdown)
  • 库存累积速度
  • 盈亏比是否跌破1.0

第四步:对比基准

把结果和正常市场下的表现做对比。如果新冠场景下你的策略回撤超过正常情况的5倍,那就要警惕了。

我的经验:曾经有个团队,2020年之前一直觉得自己的做市策略很稳健。结果用新冠场景一测,发现库存会在3天内爆仓。后来他们加了动态对冲和熔断机制,才躲过一劫。所以,别等到真出事了再后悔。

4.4 历史情景的局限性

说实话,这个方法也不是万能的。我有几点想提醒你:

避坑指南

  • 历史不会简单重复:2020年的新冠场景,如果放在今天,市场结构已经变了(比如零日期权、算法交易占比更高),冲击形态可能完全不同。
  • 样本太少:真正极端的也就那么几次,统计上不够显著。你想想看,30年才3-4次极端事件,能说明什么?
  • 忽略新风险:历史情景无法覆盖「从未发生过」的风险,比如加密货币崩盘、地缘政治黑天鹅。

所以,我个人的做法是:历史情景 + 假设情景混合使用。历史情景提供「真实感」,假设情景覆盖「未知域」。两者互补,才能构建出真正有意义的压力测试。

4.5 知识体系图

下面这张图,是我自己整理的历史情景构建法的核心逻辑。你可以把它当成一个检查清单:

历史情景构建法核心流程 ① 选事件 1987 / 2008 / 2020 ② 拆特征 波动率 / 价差 / 相关性 ③ 做映射 相对变化 → 当前持仓 ④ 算结果 PnL / 回撤 关键输出指标:最大回撤 | 库存累积速度 | 盈亏比 | VaR(99%) | 流动性覆盖率 ⚠️ 注意事项 • 历史不会简单重复,需结合当前市场结构 • 极端事件样本少,统计显著性不足 • 无法覆盖「从未发生过」的新风险 • 建议与假设情景混合使用 ✅ 最佳实践 • 提取相对变化幅度,而非绝对值 • 同时模拟多条路径(蒙特卡洛) • 关注相关性突变和流动性枯竭 • 定期更新历史事件库(如2022年加息) 核心思想:模式复用,而非数据复用 历史情景提供「真实感」,假设情景覆盖「未知域」

4.6 实战中的小技巧

最后,分享几个我在项目中踩过的坑和总结的经验:

  • 别只盯着价格:很多人做历史情景只改价格,忽略了流动性变化。我曾经吃过这个亏——2020年新冠场景下,我的策略在回测里表现很好,但实盘时发现根本成交不了,因为价差太大了。后来我把价差冲击也加进了场景,才真正模拟出当时的恶劣环境。
  • 多事件叠加:真正的危机往往是多重冲击叠加。比如2008年,先是次贷危机,然后是雷曼倒闭,接着是流动性冻结。我建议你把几个历史事件的特征组合起来,构建一个「超级压力场景」。
  • 定期更新事件库:别只守着1987、2008、2020这三个。2022年的加息风暴、2023年的硅谷银行事件,都是很好的素材。我每半年更新一次事件库,保持场景的时效性。

一句话总结:历史情景构建法,就是用过去的极端事件,检验你今天的策略能不能扛得住。它不完美,但比凭空想象靠谱得多。

专注资料整理