3. 情景设计方法论:历史情景法、假设情景法、蒙特卡洛模拟法、宏观情景生成

各位同行,今天我们来聊聊压力测试里最核心、也最考验功力的部分——情景设计。

说白了,情景设计就是给银行体系“出难题”。你得想清楚:未来可能发生什么?最坏能坏到什么程度?我见过不少团队,模型建得漂漂亮亮,结果情景设计一塌糊涂,最后测试出来的数字根本没人信。嗯,这里面的坑,我踩过不少。

3.1 历史情景法:最朴素的“照镜子”

历史情景法,就是拿过去发生过的危机事件来模拟未来。比如2008年全球金融危机、2015年中国股灾、2020年新冠疫情。

核心逻辑:历史会重演,但不会简单重复。

我个人习惯,第一步先拉出历史上5-10次重大危机事件。然后提取关键变量的变化幅度:

  • GDP增速下滑了多少?
  • 失业率跳升了几个百分点?
  • 房价跌幅有多大?
  • 信用利差走阔了多少?

举个例子,2008年金融危机期间,美国GDP季度环比年化跌幅一度达到8.4%,失业率从4.7%飙到10%。这些数字,就是你的压力参数。

避坑指南:我曾经犯过一个错误——直接拿历史数据原封不动套用。结果发现,现在的市场结构、监管环境跟十年前完全不同。比如2008年时影子银行规模还没那么大,现在你拿当年的流动性冲击参数去测,根本不够用。

所以,历史情景法需要做“校准”。我的做法是:把历史冲击幅度乘以一个调整系数,这个系数要考虑当前市场的杠杆率、期限错配程度、监管约束等因素。

3.2 假设情景法:自己编故事,但要讲逻辑

假设情景法,说白了就是“如果……会怎样?”

比如:如果中国房地产销售面积下降30%,同时房企融资渠道全面收紧,会怎样?如果美联储加息到6%,同时中美贸易摩擦升级,会怎样?

这里有个关键点——假设情景不能天马行空。你得有逻辑链条。

我建议用“冲击传导链”来设计:

  1. 定义初始冲击:比如“原油价格暴涨至150美元/桶”
  2. 追踪传导路径:油价涨→生产成本上升→PPI走高→CPI上行→央行被迫加息→企业融资成本上升→违约率攀升
  3. 量化终端影响:最终落到银行的NPL(不良贷款率)、资本充足率、流动性覆盖率等指标上
我的经验:假设情景最好设计3-5个,覆盖“轻度、中度、重度”三种压力等级。重度情景要足够极端,但不能荒谬。我记得有一次,某团队设计了一个“外星人入侵导致全球供应链断裂”的情景……嗯,直接被风控委员会打回来了。

3.3 蒙特卡洛模拟法:让随机性帮你找“尾部”

蒙特卡洛模拟,本质上就是“暴力枚举”。你设定好关键风险因子的概率分布,然后让计算机随机生成成千上万种可能的情景。

为什么需要它?因为历史情景和假设情景都只能覆盖有限的几种情况。而蒙特卡洛可以帮你探索那些“从未发生过但理论上可能发生”的极端事件——也就是尾部风险。

具体怎么做?我简单说下步骤:

  1. 确定风险因子:比如利率、汇率、房价、GDP增速等
  2. 拟合分布:每个因子设定一个概率分布(正态分布、t分布、或者带厚尾的分布)
  3. 设定相关性:因子之间不是独立的。比如GDP下行时,房价通常也会跌。这里要用到Copula函数来建模相关性结构
  4. 随机抽样:生成10万组情景
  5. 计算损失:对每组情景,跑一遍风险模型,算出银行可能遭受的损失
  6. 提取分位数:看99%分位数、99.9%分位数对应的损失有多大

下面是一个简化的Python代码示例,展示蒙特卡洛模拟的核心逻辑:

import numpy as np

# 设定参数
n_simulations = 100000
mean_gdp = 0.02  # 基准GDP增速2%
std_gdp = 0.015  # 标准差1.5%
mean_rate = 0.03 # 基准利率3%
std_rate = 0.01  # 标准差1%
correlation = 0.6 # GDP与利率的相关系数

# 生成相关随机变量
cov_matrix = [[std_gdp**2, correlation*std_gdp*std_rate],
              [correlation*std_gdp*std_rate, std_rate**2]]
samples = np.random.multivariate_normal([mean_gdp, mean_rate], cov_matrix, n_simulations)

gdp_shocks = samples[:, 0]
rate_shocks = samples[:, 1]

# 计算违约率(简化模型)
default_rate = 0.01 - 0.5 * gdp_shocks + 0.3 * rate_shocks
default_rate = np.clip(default_rate, 0, 1)

# 提取尾部风险
var_99 = np.percentile(default_rate, 99)
print(f"99%置信度下违约率不超过: {var_99:.2%}")
注意:蒙特卡洛模拟的精度高度依赖于分布假设和相关性结构。如果你用了正态分布,但实际数据有厚尾特征,那尾部风险会被严重低估。我建议用t分布或者极值理论(EVT)来建模尾部。

3.4 宏观情景生成:VAR模型与DSGE模型

前面几种方法,要么依赖历史,要么依赖主观判断,要么依赖随机抽样。但宏观情景生成,是要用经济学模型来“内生”地生成情景。

这里我重点讲两个工具:VAR模型和DSGE模型。

3.4.1 VAR模型:数据驱动的“黑箱”

VAR(向量自回归)模型,说白了就是把一堆宏观经济变量放在一起,让它们互相解释。比如GDP、通胀、利率、房价,这四个变量之间可能存在复杂的动态关系。

VAR模型的优势在于:

  • 不需要太多经济学理论假设
  • 能捕捉变量之间的线性互动
  • 做脉冲响应分析很方便——你可以看“一个单位的利率冲击,会对GDP产生多大影响,持续多久”

我举个例子。假设你构建了一个包含GDP、CPI、利率的三变量VAR模型。然后你施加一个“利率上升100bp”的冲击,模型会告诉你:GDP在未来4个季度内累计下降0.8%,CPI在2个季度后下降0.3%。这些数字,就是你压力测试的输入参数。

实战经验:VAR模型有个致命弱点——它假设变量之间的关系是线性的、稳定的。但金融危机期间,很多关系会突变。比如正常时期利率上升会抑制通胀,但在流动性陷阱下,利率上升可能反而推高通胀预期。所以,用VAR做压力测试时,我通常会加上“ regime-switching”(区制转换)机制。

3.4.2 DSGE模型:理论驱动的“白箱”

DSGE(动态随机一般均衡)模型,是宏观经济学家的“终极武器”。它从微观主体的优化行为出发——家庭最大化效用、企业最大化利润、央行制定货币政策——然后把这些行为方程联立起来,形成一个完整的宏观经济系统。

DSGE模型的优势:

  • 有坚实的经济学理论基础
  • 能解释“为什么”会这样,而不是仅仅描述“是什么”
  • 可以做反事实模拟——比如“如果央行提前加息,结果会怎样?”

但DSGE也有明显的短板:

  • 模型假设太强(理性预期、完全竞争等)
  • 参数校准困难
  • 对金融危机等非线性事件拟合效果差

我个人建议:在实际工作中,把VAR和DSGE结合起来用。用DSGE提供理论框架和长期均衡关系,用VAR捕捉短期动态和数据的统计特征。这叫“混合方法”,我在好几个大型银行的项目里都这么干过,效果不错。

3.5 知识体系总览

下面这张图,我把四种情景设计方法的核心逻辑和适用场景梳理了一下:

情景设计方法论知识体系 情景设计方法论 历史情景法 假设情景法 蒙特卡洛模拟法 宏观情景生成 提取历史危机参数 校准当前市场结构 定义初始冲击 构建传导链 量化终端影响 设定风险因子分布 Copula建模相关性 提取尾部风险 VAR模型(数据驱动) DSGE模型(理论驱动) 混合方法(VAR+DSGE) 核心原则:情景设计要“合理、可解释、可量化” 避免过度拟合历史,警惕模型假设陷阱

3.6 方法对比与选择建议

最后,我整理了一张对比表,方便你根据实际情况选择合适的方法:

方法 优点 缺点 适用场景
历史情景法 简单直观,易于沟通 历史可能不重演,参数需校准 常规压力测试、监管报送
假设情景法 灵活,可覆盖极端事件 主观性强,逻辑链需验证 前瞻性分析、风险管理决策
蒙特卡洛模拟法 全面覆盖尾部风险 计算量大,依赖分布假设 量化尾部风险、资本规划
宏观情景生成(VAR/DSGE) 有经济学逻辑支撑 模型复杂,参数校准困难 系统性风险分析、政策评估

我个人建议:别只依赖一种方法。实际项目中,我通常先用历史情景法搭框架,再用假设情景法补充极端情况,然后用蒙特卡洛模拟法做敏感性分析,最后用VAR或DSGE模型做宏观一致性检验。四管齐下,出来的结果才经得起推敲。

最后说一句:情景设计没有标准答案。你设计的每一个情景,本质上都是在跟未来的不确定性博弈。保持敬畏,保持怀疑,保持迭代。这是我在这个行业摸爬滚打十几年最大的心得。
专注资料整理