2、VaR计算方法概览:参数法、历史模拟法、蒙特卡洛模拟法
说到VaR的计算,市面上方法不少。但真正在量化风控一线常用的,其实就三招:参数法、历史模拟法、蒙特卡洛模拟法。
我个人习惯把这三种方法比作「三把尺子」——有的快但糙,有的准但慢,有的灵活但费劲。你想想看,做风控最怕什么?不是算不准,而是用错了工具还不知道。
2.1 参数法(方差-协方差法)
参数法,说白了就是假设收益率服从正态分布。然后我们只需要知道均值和方差,就能算出VaR。
公式很简单:
VaR = - (μ - z_α * σ) * P
其中z_α是置信水平对应的分位数,比如95%对应1.645,99%对应2.326。
核心假设:资产收益率服从正态分布,且资产间线性相关。
我在项目中遇到过一家基金公司,他们用参数法算债券组合的VaR。结果呢?市场一波动,VaR直接失效。为什么?因为债券收益率明显有厚尾特征,正态分布根本兜不住。
我的经验:参数法适合流动性好、历史数据充足的股票组合。对于含期权的组合,千万别用——非线性风险会把你坑惨。
2.2 历史模拟法
历史模拟法就简单粗暴了。它不假设任何分布,直接用过去N天的收益率数据,排序后取分位数。
比如你有1000天的日收益率数据,要算95% VaR,那就取第50小的那个值(1000 * 5% = 50)。
import numpy as np
def historical_var(returns, confidence=0.95):
sorted_returns = np.sort(returns)
index = int(len(returns) * (1 - confidence))
return -sorted_returns[index]
嗯,这里要注意。历史模拟法有个致命弱点:它假设历史会重演。我见过有人用2008年的数据去预测2017年的风险,结果市场结构早就变了,VaR完全失真。
避坑指南:我曾经帮一家券商做回测,发现历史模拟法在低波动时期表现很好,但一旦市场出现结构性变化(比如利率政策突变),它的预测能力会断崖式下跌。建议至少保留3-5年的数据窗口,并且定期做滚动回测。
2.3 蒙特卡洛模拟法
蒙特卡洛模拟法,说白了就是「暴力求解」。它通过随机生成大量价格路径,模拟出未来收益率的分布,再取分位数。
步骤大致如下:
- 设定随机过程(比如几何布朗运动)
- 生成N条价格路径(通常10000条以上)
- 计算每条路径的收益率
- 排序后取分位数
import numpy as np
def monte_carlo_var(S0, mu, sigma, T, n_simulations=10000, confidence=0.95):
dt = T / 252 # 假设252个交易日
returns = np.random.normal((mu - 0.5 * sigma**2) * dt, sigma * np.sqrt(dt), n_simulations)
final_prices = S0 * np.exp(returns)
portfolio_returns = (final_prices - S0) / S0
return -np.percentile(portfolio_returns, (1 - confidence) * 100)
核心优势:可以处理任意复杂的资产组合,包括期权、结构化产品等非线性工具。
我记得有一次帮一家私募做压力测试,他们的组合里有一堆奇异期权。参数法算不了,历史模拟法样本不够,最后只能用蒙特卡洛。跑了10万条路径,花了将近半小时,但结果确实靠谱。
我的建议:蒙特卡洛模拟法虽然灵活,但计算量巨大。实际生产中,我通常先用参数法做快速筛查,再用蒙特卡洛做精细校准。别一上来就上蒙特卡洛,服务器会哭的。
2.4 三种方法优缺点对比
| 方法 | 优点 | 缺点 |
|---|---|---|
| 参数法 | 计算快、实现简单、适合线性组合 | 假设正态分布、无法处理厚尾、非线性风险失效 |
| 历史模拟法 | 无分布假设、直观易懂、适合非正态数据 | 依赖历史数据、无法预测结构性变化、样本量要求高 |
| 蒙特卡洛模拟法 | 灵活性强、可处理复杂组合、支持压力测试 | 计算量大、依赖模型假设、随机误差需控制 |
你想想看,这三种方法其实没有绝对的好坏。关键看你的应用场景。我个人习惯是:
- 做快速日报,用参数法
- 做周度风控报告,用历史模拟法
- 做季度压力测试或新产品评估,用蒙特卡洛模拟法
重要提醒:无论用哪种方法,回测都是必须的。我见过太多人直接拿VaR结果去交报告,结果回测一跑,失败率超标好几倍。记住,VaR不是算出来的,是「校准」出来的。