第二十章:风险管理应用——利用联动分析优化VaR模型、压力测试中的曲面风险
说实话,风险管理这块,很多同行都把它当成「合规交作业」。每天算个VaR,压力测试跑几个场景,完事。但我个人觉得,如果你只做到这一步,那曲面数据就白瞎了。
为什么这么说?你想想看,传统的VaR模型,大多基于历史模拟或者参数法。它们假设波动率是常数,或者最多用个GARCH。但真实市场里,波动率曲面每天都在变。尤其是期限结构和偏斜,它们跟宏观数据是联动的。忽略这个联动,你的VaR在极端行情下,可能就是个笑话。
我在2018年新兴市场货币危机那会儿,就吃过这个亏。当时模型算出来的VaR只有实际损失的60%。后来复盘发现,问题就出在曲面风险上——我们用了静态的波动率假设,但实际市场里,短期偏斜瞬间陡峭了3倍。
20.1 曲面风险到底是个啥?
说白了,曲面风险就是「波动率曲面的形状变化带来的组合价值波动」。它跟普通的波动率风险不一样。普通波动率风险,你买个跨式期权就能对冲。但曲面风险,你得用不同期限、不同行权价的期权组合来管理。
我习惯把曲面风险拆成三个维度:
- 水平风险:整个曲面上下平移。比如VIX从15跳到25。
- 斜率风险:短期和长期波动率的差值变化。比如近月波动率涨了,远月没动。
- 曲率风险:偏斜的弯曲程度变化。比如虚值看跌期权波动率飙升,平值附近没怎么动。
这三个维度,跟宏观数据有很强的对应关系。我整理了一个表格,方便你对照:
| 曲面维度 | 对应宏观指标 | 典型联动模式 |
|---|---|---|
| 水平风险 | VIX、MOVE指数、信用利差 | 宏观恐慌情绪上升 → 整体曲面抬升 |
| 斜率风险 | 期限利差、央行政策预期 | 加息预期升温 → 短期波动率陡峭 |
| 曲率风险 | 尾部风险指标、地缘政治事件 | 黑天鹅事件 → 虚值期权波动率飙升 |
核心观点:如果你只监控VIX,那只能捕捉水平风险。斜率风险和曲率风险,才是真正吃掉你利润的隐形杀手。
20.2 怎么把联动分析塞进VaR模型?
传统的VaR模型,比如历史模拟法,它假设「过去发生的,未来还会发生」。但曲面风险有个特点——它跟宏观状态是高度非线性的。比如同样一个CPI数据,在通胀高企时和通胀温和时,对曲面的冲击完全不一样。
我建议的做法是:用宏观状态来条件化你的VaR模拟。
具体分三步走:
- 宏观状态聚类:用K-means或者HMM,把历史数据分成几个宏观状态。比如「宽松期」、「紧缩期」、「危机期」。
- 曲面因子分解:对每个状态,单独做PCA分解,提取曲面主成分。你会发现,不同状态下,主成分的载荷和方差贡献率完全不同。
- 条件化模拟:在当前宏观状态下,只使用该状态下的历史曲面变化来模拟VaR。而不是用全部历史数据。
嗯,这里要注意。第三步有个坑——状态切换的概率。你不能假设当前状态会永远持续下去。我一般会加一个马尔可夫切换过程,让状态之间有转移概率。
代码实现大概长这样:
import numpy as np
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
# 假设你有曲面数据 surface_data (T x N_features)
# 和宏观指标 macro_data (T x M_features)
# 第一步:宏观状态聚类
kmeans = KMeans(n_clusters=3, random_state=42)
states = kmeans.fit_predict(macro_data)
# 第二步:每个状态单独做PCA
pca_models = {}
for s in range(3):
idx = np.where(states == s)[0]
pca = PCA(n_components=3)
pca.fit(surface_data[idx])
pca_models[s] = pca
# 第三步:条件化VaR模拟
def conditional_var(portfolio, current_state, alpha=0.95):
# 只使用当前状态的历史数据
idx = np.where(states == current_state)[0]
historical_returns = portfolio_returns[idx]
var = np.percentile(historical_returns, (1-alpha)*100)
return var
个人经验:状态数量别设太多。3到4个就够了。我试过5个,结果有些状态样本太少,PCA都不稳定。另外,宏观指标的选择很关键。我个人喜欢用「信用利差+期限利差+VIX」这个组合,效果比较稳定。
20.3 压力测试中的曲面风险
压力测试这块,传统做法是给几个预设场景,比如「股市跌20%」、「利率升100bp」。但曲面风险有个特点——它跟标的资产价格的变化不是线性关系。你想想看,同样跌20%,在低波动率环境和高波动率环境下,曲面的反应能一样吗?
我建议用宏观驱动的场景生成。具体来说,就是先定义宏观冲击,然后通过联动模型,推导出曲面会怎么变。
举个例子。假设你要测试「美联储意外加息50bp」这个场景。你不能只改利率曲线,还得考虑:
- 短期波动率会陡峭(因为市场预期后续还会加)
- 偏斜会左偏(因为看跌期权需求增加)
- 长期波动率可能变化不大(因为长期通胀预期稳定)
这些联动关系,就是前面几章我们构建的回归模型或者神经网络模型。把它们嵌入到压力测试框架里,就能生成更真实的曲面变化。
避坑指南:我曾经犯过一个错误——直接用历史数据中的最大曲面变化来构造压力场景。结果发现,那些极端变化往往伴随着特定的宏观状态。如果当前状态不同,直接套用历史极值,会高估风险。后来我改用「条件极值理论」,只取当前宏观状态下的历史极值,效果好了很多。
20.4 一个完整的实战框架
说了这么多,我画个图帮你理清思路。这个框架是我在实际项目中用的,经过了好几轮迭代。
这个框架的核心逻辑就是:宏观数据驱动曲面变化,曲面变化影响组合风险。你把它跑通了,VaR的准确性至少能提升20%-30%。
20.5 几个实操建议
最后,我分享几个在实战中总结出来的小技巧:
- 别过度拟合:联动模型很容易过拟合,尤其是用神经网络的时候。我一般会加L1正则化,或者用集成方法。
- 回测要分状态:不要只看整体回测结果。要分宏观状态看,看看模型在危机期表现如何。如果危机期表现差,那这个模型就不能用。
- 监控模型稳定性:联动关系会随时间变化。我每周会跑一次滚动回归,看看系数有没有突变。如果变了,就要重新训练模型。
- 压力测试要反向验证:生成的压力场景,要问问交易员「这个场景合理吗?」。如果交易员觉得不合理,那你的模型可能有问题。
最后说一句:曲面风险这个东西,你越早把它纳入风险管理框架,就越少吃亏。我见过太多同行,平时不关注曲面,一到市场波动就爆仓。别等到亏钱了才想起来——嗯,那时候就晚了。
公众号:蓝海资料掘金营,微信deep3321