R and Python Chapter 5. Implementing Risk Forecasts

# Chapter 5. Implementing Risk Forecasts

### R and Python

Copyright 2011 - 2023 Jon Danielsson. This code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The GNU General Public License is available at: www.gnu.org/licenses.

##### Listing 5.1/5.2
p = read.csv('stocks.csv')
y = apply(log(p),2,diff)
portfolio_value = 1000
p = 0.01

##### Listing 5.1/5.2
import numpy as np
from scipy import stats
p = p[:,[0,1]]      # consider two stocks
y1 = np.diff(np.log(p[:,0]), n=1, axis=0)
y2 = np.diff(np.log(p[:,1]), n=1, axis=0)
y = np.stack([y1,y2], axis = 1)
T = len(y1)
value = 1000 # portfolio value
p = 0.01 # probability


##### Univariate HS in R
y1 = y[,1]                     # select one asset
ys = sort(y1)                  # sort returns
op = ceiling(length(y1)*p)     # p percent smallest, rounded up
VaR1 = -ys[op]*portfolio_value
print(VaR1)

##### Univariate HS in Python
from math import ceil
ys = np.sort(y1) # sort returns
op = ceil(T*p)    # p percent smallest
VaR1 = -ys[op - 1] * value
print(VaR1)


##### Multivariate HS in R
w = matrix(c(0.3,0.2,0.5))   # vector of portfolio weights
yp = y %*% w                 # obtain portfolio returns
yps = sort(yp)
VaR2 = -yps[op]*portfolio_value
print(VaR2)

##### Multivariate HS in Python
w = [0.3, 0.7]               # vector of portfolio weights
yp = np.squeeze(np.matmul(y, w)) # portfolio returns
yps = np.sort(yp)
VaR2= -yps[op - 1] * value
print(VaR2)


##### Univariate ES in R
ES1 = -mean(ys[1:op])*portfolio_value
print(ES1)

##### Univariate ES in Python
ES1 = -np.mean(ys[:op]) * value
print(ES1)


##### Normal VaR in R
sigma = sd(y1) # estimate volatility
VaR3 = -sigma * qnorm(p) * portfolio_value
print(VaR3)

##### Normal VaR in Python
sigma = np.std(y1, ddof=1) # estimate volatility
VaR3 = -sigma * stats.norm.ppf(p) * value
print(VaR3)


##### Portfolio normal VaR in R
sigma = sqrt(t(w) %*% cov(y) %*% w) # portfolio volatility
VaR4 = -sigma * qnorm(p)*portfolio_value
print(VaR4)

##### Portfolio normal VaR in Python
sigma = np.sqrt(np.mat(w)*np.mat(np.cov(y,rowvar=False))*np.transpose(np.mat(w)))[0,0]
VaR4 = -sigma * stats.norm.ppf(p) * value
print(VaR4)


##### Student-t VaR in R
library(QRM)
scy1 = (y1)*100                     # scale the returns
res = fit.st(scy1)
sigma1 = unname(res$par.ests['sigma']/100) # rescale the volatility nu = unname(res$par.ests['nu'])
VaR5 = - sigma1 * qt(df=nu,p=p) *  portfolio_value
print(VaR5)

##### Student-t VaR in Python
scy1 = y1 * 100         # scale the returns
res = stats.t.fit(scy1)
sigma = res/100      # rescale volatility
nu = res
VaR5 = -sigma*stats.t.ppf(p,nu)*value
print(VaR5)


##### Normal ES in R
sigma = sd(y1)
ES2 = sigma*dnorm(qnorm(p))/p * portfolio_value
print(ES2)

##### Normal ES in Python
sigma = np.std(y1, ddof=1)
ES2 = sigma * stats.norm.pdf(stats.norm.ppf(p)) / p * value
print(ES2)


##### Direct integration ES in R
VaR = -qnorm(p)
integrand = function(q){q*dnorm(q)}
ES = -sigma*integrate(integrand,-Inf,-VaR)$value/p*portfolio_value print(ES)  ##### Listing 5.17/5.18 ##### Direct integration ES in Python from scipy.integrate import quad VaR = -stats.norm.ppf(p) integrand = lambda q: q * stats.norm.pdf(q) ES = -sigma * quad(integrand, -np.inf, -VaR) / p * value print(ES)  ##### Listing 5.19/5.20 ##### MA normal VaR in R WE=20 for (t in seq(length(y1)-5,length(y1))){ t1=t-WE+1 window= y1[t1:t] # estimation window sigma=sd(window) VaR6 = -sigma * qnorm(p) * portfolio_value print(VaR6) }  ##### Listing 5.19/5.20 ##### MA normal VaR in Python WE = 20 for t in range(T-5,T+1): t1 = t-WE window = y1[t1:t] # estimation window sigma = np.std(window, ddof=1) VaR6 = -sigma*stats.norm.ppf(p)*value print (VaR6)  ##### Listing 5.21/5.22 ##### EWMA VaR in R lambda = 0.94 s11 = var(y1) # initial variance, using unconditional for (t in 2:length(y1)){ s11 = lambda * s11 + (1-lambda) * y1[t-1]^2 } VaR7 = -qnorm(p) * sqrt(s11) * portfolio_value print(VaR7)  ##### Listing 5.21/5.22 ##### EWMA VaR in Python lmbda = 0.94 s11 = np.var(y1[0:30], ddof = 1) # initial variance for t in range(1, T): s11 = lmbda*s11 + (1-lmbda)*y1[t-1]**2 VaR7 = -np.sqrt(s11)*stats.norm.ppf(p)*value print(VaR7)  ##### Listing 5.23/5.24 ##### Three-asset EWMA VaR in R s = cov(y) # initial covariance for (t in 2:dim(y)){ s = lambda*s + (1-lambda)*y[t-1,] %*% t(y[t-1,]) } sigma = sqrt(t(w) %*% s %*% w) # portfolio vol VaR8 = -sigma * qnorm(p) * portfolio_value print(VaR8)  ##### Listing 5.23/5.24 ##### Two-asset EWMA VaR in Python s = np.cov(y, rowvar = False) for t in range(1,T): s = lmbda*s+(1-lmbda)*np.transpose(np.asmatrix(y[t-1,:]))*np.asmatrix(y[t-1,:]) sigma = np.sqrt(np.mat(w)*s*np.transpose(np.mat(w)))[0,0] VaR8 = -sigma * stats.norm.ppf(p) * value print(VaR8)  ##### Listing 5.25/5.26 ##### Univariate GARCH in R library(rugarch) spec = ugarchspec(variance.model = list( garchOrder = c(1, 1)), mean.model = list( armaOrder = c(0,0),include.mean = FALSE)) res = ugarchfit(spec = spec, data = y1, solver = "hybrid") omega = res@fit$coef['omega']
alpha = res@fit$coef['alpha1'] beta = res@fit$coef['beta1']
sigma2 = omega + alpha * tail(y1,1)^2 + beta * tail(res@fit\$var,1)
VaR9 = -sqrt(sigma2) * qnorm(p) * portfolio_value
names(VaR9)="VaR"
print(VaR9)

##### GARCH VaR in Python
from arch import arch_model
am = arch_model(y1, mean = 'Zero', vol='Garch', p=1, o=0, q=1, dist='Normal', rescale = False)
res = am.fit(update_freq=5, disp = "off")
omega = res.params.loc['omega']
alpha = res.params.loc['alpha']
beta = res.params.loc['beta']
sigma2 = omega + alpha*y1[T-1]**2 + beta * res.conditional_volatility[-1]**2
VaR9 = -np.sqrt(sigma2) * stats.norm.ppf(p) * value
print(VaR9)


##### Financial Risk Forecasting
Market risk forecasting with R, Julia, Python and Matlab. Code, lecture slides, implementation notes, seminar assignments and questions.