Ожидаемый дефицит в 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/