程式

根據分佈計算預期短缺/條件 VaR

  • April 9, 2022

我想從收益分佈中計算預期短缺。

我的收益分佈沒有封閉的解決方案,所以我想知道我是否可以通過取低於某個分位數的所有值的平均值來簡單地計算 ES。據我了解,這似乎也是解析公式的作用。

但我遇到的問題是,平均值和標準差的所有組合的分析公式的輸出始終是數值近似的加法倒數。我懷疑我以某種方式錯誤地使用了公式。無論如何,我的主要問題是:

  1. 我可以按照下面程式碼中的方式計算 ES 嗎?即簡單地取低於例如 95% 水平的值的平均值?無論我的退貨分配如何,這都有效嗎?
  2. 我在分析公式中做錯了什麼?
# 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可以從兩個不同的角度來看:

  1. $ R_t $ 是投資組合收益。然後 VaR 為分位數(例如 0.05),ES 預期回報低於該分位數。
  2. $ L_t = -R_t $ 是投資組合損失。那麼 VaR 是正確的分位數(例如 0.95),而 ES 是****高於該分位數的預期損失。

只要存在解析公式,它們之間的差異應達到+-號。

引用自:https://quant.stackexchange.com/questions/70443