程式
根據分佈計算預期短缺/條件 VaR
我想從收益分佈中計算預期短缺。
我的收益分佈沒有封閉的解決方案,所以我想知道我是否可以通過取低於某個分位數的所有值的平均值來簡單地計算 ES。據我了解,這似乎也是解析公式的作用。
但我遇到的問題是,平均值和標準差的所有組合的分析公式的輸出始終是數值近似的加法倒數。我懷疑我以某種方式錯誤地使用了公式。無論如何,我的主要問題是:
- 我可以按照下面程式碼中的方式計算 ES 嗎?即簡單地取低於例如 95% 水平的值的平均值?無論我的退貨分配如何,這都有效嗎?
- 我在分析公式中做錯了什麼?
# imports import numpy as np import matplotlib.pyplot as plt import scipy; from scipy import stats # generating the distribution mean = 6 std = 1 dist = scipy.stats.norm.rvs(loc=mean, scale=std, size=1_000_000) # computing VaR and ES: is this correct? VAR = np.quantile(a=dist, q=0.05) ES = np.mean(dist[np.where(dist < VAR)]) # plotting and printing plt.hist(dist, bins=np.linspace(-20,20,100), density=True) plt.vlines(x=VAR, ymin=0, ymax=.5, label="VAR 95", color="red") plt.vlines(x=ES, ymin=0, ymax=.5, label="ES 95", color="green") plt.legend() plt.show() print(f"VAR: {VAR}") print(f"ES: {ES}") # verifying the ES analytically and printing aswell def analytical_normal_es(mu, sigma, level): return -mu + sigma * scipy.stats.norm.pdf(x=scipy.stats.norm.ppf(level)) / level solES = analytical_normal_es(mean,std,0.05) print(f"solES: {solES}")
輸出
VAR: 4.354602809080357 ES: 3.9394240486966927 solES: -3.9372871924925747
一般來說,VaR和ES可以從兩個不同的角度來看:
- $ R_t $ 是投資組合收益。然後 VaR 為左分位數(例如 0.05),ES 預期回報低於該分位數。
- $ L_t = -R_t $ 是投資組合損失。那麼 VaR 是正確的分位數(例如 0.95),而 ES 是****高於該分位數的預期損失。
只要存在解析公式,它們之間的差異應達到+-號。