3. 市场极端情景构建:历史情景、假设情景与蒙特卡洛模拟

各位同学,今天我们来聊聊压力测试里最核心的一环——极端情景怎么构建。

说实话,我刚入行那会儿,觉得压力测试就是拍脑袋想几个暴跌场景。后来吃过亏才明白,情景构建是个技术活。你构建的情景如果不够极端,测不出风险;如果太离谱,又会被业务部门怼回来。

我个人习惯把情景构建分成三类:历史情景假设情景蒙特卡洛模拟。这三者各有各的用处,咱们一个一个说。

3.1 历史情景:从过去找答案

历史情景,说白了就是「抄作业」。把过去发生过的极端事件,原封不动地搬到当前市场里。

比如2008年次贷危机、2015年A股股灾、2020年新冠疫情。这些事件都有完整的数据轨迹,我们只需要把当时的市场波动、相关性、流动性变化,套用到现在的投资组合上。

我建议你建一个历史事件库,至少包含近20年的重大危机事件。每个事件记录以下指标:

事件 时间 最大回撤 波动率变化 相关性变化
次贷危机 2008 -57% +300% 趋近1
欧债危机 2011 -32% +180% 分化明显
新冠冲击 2020 -35% +250% 先升后降
我的经验:历史情景有个坑——「这次不一样」。每次危机都有新特征,完全照搬历史会低估尾部风险。我一般会在历史情景基础上,再放大20%-30%的冲击幅度。

3.2 假设情景:自己造风暴

历史情景解决不了「从未发生过」的风险。比如俄乌冲突爆发前,谁能想到SWIFT会被当作武器?这时候就需要假设情景。

假设情景的构建,我总结了一个三步法

  1. 识别风险因子:利率、汇率、信用利差、波动率……你的组合暴露在哪些因子下?
  2. 设定冲击幅度:比如利率上升200bp,汇率贬值15%,信用利差扩大300bp。
  3. 考虑传导效应:一个因子变了,其他因子会怎么联动?

举个例子。我曾经帮一家银行做压力测试,假设「中美脱钩加速」情景。我们设定了:

  • 人民币对美元贬值10%
  • 中概股暴跌40%
  • 信用利差扩大250bp
  • 流动性枯竭,交易成本上升5倍

结果测出来,他们的固收+产品线直接亏穿。后来他们提前做了对冲,躲过一劫。

注意:假设情景不能太「温柔」。我见过很多团队,设定的冲击幅度连历史波动率的2倍都不到。这种情景测了等于没测。极端情景,就要往死里压。

3.3 蒙特卡洛模拟:让概率说话

历史情景和假设情景都是「点估计」,只测几个特定场景。但真实世界的风险是连续的、多维的。蒙特卡洛模拟能生成成千上万条路径,覆盖各种可能性。

核心逻辑很简单:

  1. 假设资产价格服从某种随机过程(比如几何布朗运动)
  2. 用历史数据估计参数(漂移率、波动率、相关性)
  3. 随机生成大量路径,计算每个路径下的组合损益
  4. 看尾部损失分布,比如99%分位数的损失

下面是一个简化的Python实现:

import numpy as np

def monte_carlo_simulation(S0, mu, sigma, T, n_steps, n_sims):
    """
    S0: 初始价格
    mu: 年化收益率
    sigma: 年化波动率
    T: 时间长度(年)
    n_steps: 时间步数
    n_sims: 模拟路径数
    """
    dt = T / n_steps
    paths = np.zeros((n_sims, n_steps + 1))
    paths[:, 0] = S0
    
    for i in range(n_sims):
        for t in range(1, n_steps + 1):
            z = np.random.standard_normal()
            paths[i, t] = paths[i, t-1] * np.exp(
                (mu - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * z
            )
    
    return paths

# 模拟10000条路径
paths = monte_carlo_simulation(
    S0=100, mu=0.08, sigma=0.25, 
    T=1, n_steps=252, n_sims=10000
)

# 计算99% VaR
final_prices = paths[:, -1]
returns = final_prices / 100 - 1
VaR_99 = np.percentile(returns, 1)
print(f"99% VaR: {VaR_99:.2%}")
关键点:蒙特卡洛模拟的精度取决于参数估计和模型假设。如果假设正态分布,会严重低估尾部风险。我建议用t分布或GARCH模型来刻画厚尾特征。

3.4 三种方法的对比与融合

这三种方法不是互斥的,而是互补的。我一般这样用:

  • 历史情景:做基准测试,看看组合在已知危机下的表现
  • 假设情景:覆盖「黑天鹅」事件,尤其是地缘政治风险
  • 蒙特卡洛模拟:做全概率分布分析,量化尾部风险

下面这张图展示了三者的关系:

市场极端情景构建方法对比 历史情景 基于过去危机事件 直接套用历史数据 优点:真实可信 缺点:无法覆盖新风险 适用:常规压力测试 假设情景 基于专家判断 自定义冲击幅度 优点:灵活覆盖黑天鹅 缺点:主观性强 适用:极端事件分析 蒙特卡洛模拟 基于随机过程 生成大量路径 优点:全概率分布 缺点:模型风险 适用:量化尾部风险 最佳实践:历史情景做基准 + 假设情景补缺口 + 蒙特卡洛量化概率

在实际项目中,我通常这样组合:先用历史情景跑一遍,看看组合在已知危机下的表现。然后用假设情景补充几个「黑天鹅」场景。最后用蒙特卡洛模拟生成完整的损失分布,计算VaR和ES。

避坑指南:我曾经犯过一个错误——只用了蒙特卡洛模拟,没做历史情景验证。结果模型参数估计有偏差,模拟出来的尾部风险比实际小了一半。后来我养成了习惯:任何模型结果,都要用历史事件回测一下。

好了,关于极端情景构建,今天就聊这么多。记住:压力测试不是为了预测未来,而是为了让你知道——当最坏的情况发生时,你扛不扛得住。

专注资料整理