第42讲:风险价值和条件风险价值 (VaR and CVaR)

第42讲:风险价值和条件风险价值 (VaR and CVaR)

第42讲:风险价值和条件风险价值 (VaR and CVaR)

💡查看全集:💎Quantopian量化分析56讲

一、核心概念解析VaR(风险价值):在给定置信水平α下,未来一段时间内投资组合可能承受的最大损失。例如α=95%的VaR为-10万元,表示未来有95%的概率损失不超过10万元。

CVaR(条件风险价值):当损失超过VaR时,这些极端损失的平均值。反映尾部风险,比VaR更能体现危机情境。

关键公式对比正态分布VaR计算公式:

VaR=(μ−σ⋅Zα)⋅V\text{VaR} = (\mu - \sigma \cdot Z_\alpha) \cdot VVaR=(μ−σ⋅Zα​)⋅V其中:

μ\muμ 为期望收益率σ\sigmaσ 为波动率ZαZ_\alphaZα​ 为置信水平对应的标准正态分布分位数VVV 为投资组合价值

历史模拟法VaR计算公式:

VaR=Percentile(R,1−α)⋅V\text{VaR} = \text{Percentile}(R, 1-\alpha) \cdot VVaR=Percentile(R,1−α)⋅V其中:

RRR 为历史收益率序列α\alphaα 为置信水平

条件风险价值(CVaR)计算公式:

CVaR=1(1−α)∫−∞VaRr⋅f(r)dr⋅V\text{CVaR} = \frac{1}{(1-\alpha)} \int_{-\infty}^{\text{VaR}} r \cdot f(r)dr \cdot VCVaR=(1−α)1​∫−∞VaR​r⋅f(r)dr⋅V其中:

f(r)f(r)f(r) 为收益率概率密度函数rr r为收益率α\alpha α为置信水平二、模拟数据实战生成模拟收益率import numpy as np

import pandas as pd

import yfinance as yf

from scipy.stats import norm

# 生成10个正态分布的虚拟资产收益率

np.random.seed(42)

returns = np.random.normal(0.01, 0.1, (1000, 10))

returns = pd.DataFrame(returns, columns=[f'Asset_{i}' for i in range(10)])

权重设置与可视化# 生成等权重组合

weights = np.ones(10) / 10

plt.figure(figsize=(10,4))

plt.bar(range(10), weights)

plt.title('等权重投资组合分配')

plt.xlabel('资产编号')

plt.ylabel('权重比例');

计算历史VaRdef historical_var(returns, weights, alpha=0.95, value=1e6):

port_returns = returns.dot(weights)

var = np.percentile(port_returns, 100*(1-alpha)) * value

return var

print(f"95% VaR: {historical_var(returns, weights):,.2f} 元")

输出示例:95% VaR: -42,567.89 元

三、真实市场数据分析获取历史数据# 获取苹果、微软历史数据

tickers = ['AAPL', 'MSFT']

data = yf.download(tickers, start='2015-01-01', end='2020-01-01')['Close']

# 计算收益率

returns = data.pct_change().dropna()

returns.plot.hist(bins=50, alpha=0.6, figsize=(10,4))

plt.title('苹果与微软历史收益率分布');

动态权重VaR分析# 生成随机权重

np.random.seed(42)

weights = np.random.random(len(tickers))

weights /= weights.sum()

# 计算滚动VaR

window = 252 # 1年交易天数

var_series = returns.rolling(window).apply(

lambda x: np.percentile(x.dot(weights), 5)*1e6)

plt.figure(figsize=(10,4))

var_series.plot()

plt.title('滚动一年期95% VaR')

plt.ylabel('风险价值(万元)');

四、进阶对比分析正态假设 vs 历史法def normal_var(mu, sigma, alpha=0.95):

return norm.ppf(1-alpha, mu, sigma)

mu = returns.mean().dot(weights)

sigma = np.sqrt(weights.T @ returns.cov() @ weights)

print(f"正态法VaR: {normal_var(mu, sigma)*1e6:,.2f} 元")

print(f"历史法VaR: {historical_var(returns, weights)*1e6:,.2f} 元")

CVaR计算实现def conditional_var(returns, weights, alpha=0.95, value=1e6):

port_returns = returns.dot(weights)

var = np.percentile(port_returns, 100*(1-alpha))

cvar = port_returns[port_returns <= var].mean() * value

return cvar

print(f"CVaR: {conditional_var(returns, weights):,.2f} 元")

五、关键要点总结正态假设常低估尾部风险(见下图对比)历史法依赖数据质量,需定期更新CVaR比VaR更全面反映尾部风险回看周期需平衡时效性与稳定性# 分布对比可视化

plt.figure(figsize=(10,4))

plt.hist(returns.dot(weights), bins=50, density=True, alpha=0.6)

x = np.linspace(-0.1, 0.1, 100)

plt.plot(x, norm.pdf(x, mu, sigma), 'r-')

plt.legend(['正态分布', '实际收益'])

plt.title('收益分布对比');

六、练习题使用yfinance获取标普500指数(^GSPC)过去5年数据,计算其95% VaR比较等权重组合与70%股票+30%债券组合的CVaR差异当置信水平从95%提升到99%时,VaR和CVaR变化幅度有何不同?为什么?提示:债券数据可使用TLT(20年以上美国国债ETF)附:练习合集练习上一篇

第41讲:为什么要对贝塔和行业暴露进行对冲 II (Why Hedge Beta and Sector Exposures II)

下一篇

第43讲:积分、协整和平稳性 (Integration, Cointegration, and Stationarity)

相关文章

风字的笔顺详解
beat365体育亚洲网址

风字的笔顺详解

🌱 12-24 💬 389
涂鸦艺术在中国的发展
旧版彩票365下载

涂鸦艺术在中国的发展

🌱 07-18 💬 710
冷冻卵子能保存多久
beat365体育亚洲网址

冷冻卵子能保存多久

🌱 08-31 💬 588