Ожидаемый дефицит в Python
Google VAR, и вы найдете много критических замечаний по поводу VAR как меры рыночного риска. И вы неизбежно увидите, что ожидаемый дефицит (ES) выдвигается в качестве альтернативы.
Какая разница между двумя?
Скажем, мы пытаемся оценить нашу VAR (или, проще говоря, потенциальные убытки) с доверительной вероятностью 99%, это означает, что у нас будет ряд результатов потерь (или сценариев) в хвосте 1%, и -
- VAR отвечает на этот вопрос — каковы минимальные потери по всему диапазону исходов в хвосте 1%?
- ES отвечает на этот вопрос — каков средний убыток по всему диапазону исходов в хвосте 1%?
Давайте попробуем вычислить две меры в Python, чтобы увидеть разницу.
Во-первых, ВАР.
h = 10. # horizon of 10 days mu_h = 0.1 # this is the mean of % returns over 10 days - 10% sig = 0.3 # this is the vol of returns over a year - 30% sig_h = 0.3 * np.sqrt(h/252) # this is the vol over the horizon alpha = 0.01 VaR_n = norm.ppf(1-alpha)*sig_h - mu_h print("99% VaR is", round(VaR_n*100,2))
Out: 99% VaR is 3.9
И далее для ES.
# with the same parameters as above CVaR_n = alpha**-1 * norm.pdf(norm.ppf(alpha))*sig_h - mu_h print("99% CVaR/ES is", round(CVaR_n*100,2))
Out: 99% CVaR/ES is 5.93
Нам не нужно предполагать нормальное распределение. Мы также можем предположить t-распределение.
from scipy.stats import t nu = 5 # degree of freedom, the larger, the closer to normal distribution xanu = t.ppf(alpha, nu) VaR_t = np.sqrt(h/252 * (nu-2)/nu) * t.ppf(1-alpha, nu)*sig - mu_h print("99% VaR (Student-t with v=5) is", round(VaR_t*100,2))
Out: 99% VaR (Student-t with v=5) is 5.58
CVaR_t = -1/alpha * (1-nu)**(-1) * (nu-2+xanu**2) * t.pdf(xanu, nu)*sig_h - mu_h print("99% CVaR (Student-t with v=5) is", round(CVaR_t*100,2))
Out: 99% CVaR (Student-t with v=5) is 13.35
Чем больше степень свободы, тем ближе к нормальному распределению.
# to verify that the normal and Student-t VAR will be the same for big v nu = 10000000 # degree of freedom, the larger, the closer to normal distribution xanu = t.ppf(alpha, nu) VaR_t = np.sqrt(h/252 * (nu-2)/nu) * t.ppf(1-alpha, nu)*sig - mu_h print("99% VaR (Student-t with with v->infinity) is", round(VaR_t*100,2))
Out: 99% VaR (Student-t with with v->infinity) is 3.9
CVaR_t = -1/alpha * (1-nu)**(-1) * (nu-2+xanu**2) * t.pdf(xanu, nu)*sig_h - mu_h print("99% CVaR (Student-t with with v->infinity) is", round(CVaR_t*100,2))
Out: 99% CVaR (Student-t with with v->infinity) is 5.93
Мы можем вычислить что-то подобное с реальными рыночными данными. Сначала мы подгоняем данные к нормальному и t-распределению.
mu_norm, sig_norm = norm.fit(returns)
nu, mu_t, sig_t = t.fit(returns)
И соответствующие VAR и ES могут быть вычислены довольно легко.
h = 1
alpha = 0.01
xanu = t.ppf(alpha, nu)
CVaR_n = alpha**-1 * norm.pdf(norm.ppf(alpha))*sig_norm - mu_norm
VaR_n = norm.ppf(1-alpha)*sig_norm - mu_norm
VaR_t = np.sqrt((nu-2)/nu) * t.ppf(1-alpha, nu)*sig_norm - h*mu_norm
CVaR_t = -1/alpha * (1-nu)**(-1) * (nu-2+xanu**2) * t.pdf(xanu, nu)*sig_norm - h*mu_norm
И диаграмма, которая, вероятно, даст хорошее представление о разнице между VAR и ES, выглядит следующим образом.
Полный код можно найти в блокноте здесь.
playgrd.com || facebook.com/playgrdstar || instagram.com/playgrdstar/