Taller VaR y CVaR método de simulación Monte Carlo#
Importar datos.#
datos = read.csv("Datos primer examen 01-2020.csv", sep = ";")
Matriz de precios.#
precios = datos[,-1]
Matriz de rendimientos.#
rendimientos = matrix(, nrow(precios)-1, ncol(precios))
for(i in 1:ncol(precios)){
rendimientos[,i] = diff(log(precios[,i]))
}
\(S_0:\)Precio actual de cada acción.#
s = tail(precios,1)
s = as.numeric(s)
s
- 3180
- 18800
- 24760
- 44700
Número de acciones del portafolio de inversión.#
numero_acciones = c(180000,5000,12000,20000)
numero_acciones
- 180000
- 5000
- 12000
- 20000
Valor de mercado de cada acción.#
valor_mercado_acciones = numero_acciones*s
valor_mercado_acciones
- 572400000
- 9.4e+07
- 297120000
- 8.94e+08
Valor de mercado del portafolio de inversión.#
valor_portafolio = sum(valor_mercado_acciones)
valor_portafolio
Proporciones de inversión.#
proporciones = valor_mercado_acciones/valor_portafolio
proporciones
- 0.308152805891727
- 0.0506051078857832
- 0.159955209095999
- 0.481286877126491
\(\mu:\) Rendimiento esperado de cada acción#
mu = apply(rendimientos, 2, mean)
mu
- 0.00052818024892044
- 0.000817437518458556
- 0.000411972791855423
- 0.00146604550819807
\(\sigma:\)Volatilidad de cada acción#
volatilidades = apply(rendimientos, 2, sd)
volatilidades
- 0.0384381803599016
- 0.030438809306807
- 0.0239949256781827
- 0.0292898506777494
Matriz de coeficientes de correlación#
correlacion = cor(rendimientos)
correlacion
1.0000000 | 0.3150607 | 0.2960306 | 0.3571087 |
0.3150607 | 1.0000000 | 0.4015795 | 0.3706462 |
0.2960306 | 0.4015795 | 1.0000000 | 0.3298657 |
0.3571087 | 0.3706462 | 0.3298657 | 1.0000000 |
Descomposición de Cholesky#
cholesky = chol(correlacion)
cholesky
1 | 0.3150607 | 0.2960306 | 0.3571087 |
0 | 0.9490715 | 0.3248564 | 0.2719872 |
0 | 0.0000000 | 0.8982395 | 0.1511777 |
0 | 0.0000000 | 0.0000000 | 0.8807052 |
Preguntas#
¿Cuál es el VaR y CVaR semanal con un nivel de confianza del 90% de cada una de las acciones y del portafolio de inversión?#
La frecuencia temporal de los rendimientos es semanal. Se usará
dt=1/5
porque se recomienda que \(\Delta t\) sea pequeño. Así se
podrá realizar saltos diarios en el tiempo debido a que una semana tiene
cinco días bursátiles.
Así con saltos diarios de tiempo, para el VaR semanal, n=5
.
n = 5
dt = 1/5
NC = 0.90
SImulación de precios diarios#
iteraciones = 50000
st = array(dim = c(iteraciones, n+1, ncol(rendimientos)))
for(i in 1:ncol(rendimientos)){
st[,1,i] = s[i] # Con este for se está almacenando el precio actual de cada acción en la columna 1 de las matrices del array.
}
aleatorio_corr = vector()
for(k in 1:ncol(precios)){
for(i in 1:iteraciones){
for(j in 2:(n+1)){
aleatorio = rnorm(ncol(precios))
aleatorio_corr = colSums(aleatorio*cholesky)
st[i,j,k] = st[i,j-1,k]*exp((mu[k]-volatilidades[k]^2/2)*dt+volatilidades[k]*sqrt(dt)*aleatorio_corr[k])
}
}
}
Rendimientos semanales simulados de cada acción#
El array st
tiene seis columnas (n+1
), la última columna tiene
los precios simulados para una semana. Con esta columna se calcularán
los rendimientos semanales simulados.
rend = matrix(,iteraciones,ncol(rendimientos))
for(i in 1:ncol(rendimientos)){
rend[,i] = st[,n+1,i]/s[i]-1 #Rendimientos semanales simulados de cada acción.
}
Rendimientos semanales simulados del portafolio de inversión#
rend_port = vector()
for(i in 1:nrow(rendimientos)){
rend_port[i] = sum(rend[i,]*proporciones)
}
VaR semanal individuales#
VaR_individuales_SM_percentil = vector()
for(i in 1:ncol(rendimientos)){
VaR_individuales_SM_percentil[i] = abs(quantile(rend[,i], 1-NC)*valor_mercado_acciones[i])
}
VaR_individuales_SM_percentil
- 27250682.5694049
- 3580028.41405506
- 8942544.84875934
- 32208722.325042
VaR semanal del portafolio de inversión#
VaR_portafolio_SM_percentil = abs(quantile(rend_port, 1-NC)*valor_portafolio)
VaR_portafolio_SM_percentil
CVaR semanal individuales#
CVaR = vector()
for(i in 1:ncol(rendimientos)){
CVaR[i] = abs(mean(tail(sort(rend[,i], decreasing = T), floor(nrow(rend)*(1-NC))))*valor_mercado_acciones[i])
}
CVaR
- 37265944.1349686
- 4850952.504194
- 12231487.8941014
- 43807904.8354661
CVaR semanal del portafolio de inversión#
CVaR_portafolio = abs(mean(tail(sort(rend_port, decreasing = T), floor(nrow(rend)*(1-NC))))*valor_portafolio)
CVaR_portafolio
¿Cuál es el VaR y CVaR mensual con un nivel de confianza del 95% de cada una de las acciones y del portafolio de inversión?#
La frecuencia temporal de los rendimientos es semanal. Se usará
dt=1/5
porque se recomienda que \(\Delta t\) sea pequeño. Así se
podrá realizar saltos diarios en el tiempo debido a que una semana tiene
cinco días bursátiles.
Así con saltos diarios de tiempo, para el VaR mensual, n=20
.
n = 20
dt = 1/5
NC = 0.95
iteraciones = 50000
st = array(dim = c(iteraciones, n+1, ncol(rendimientos)))
for(i in 1:ncol(rendimientos)){
st[,1,i] = s[i] # Con esto for se está almacenando el precio actual de cada acción en la columna 1 de las matrices del array.
}
aleatorio_corr = vector()
for(k in 1:ncol(precios)){
for(i in 1:iteraciones){
for(j in 2:(n+1)){
aleatorio = rnorm(ncol(precios))
aleatorio_corr = colSums(aleatorio*cholesky)
st[i,j,k] = st[i,j-1,k]*exp((mu[k]-volatilidades[k]^2/2)*dt+volatilidades[k]*sqrt(dt)*aleatorio_corr[k])
}
}
}
Rendimientos mensuales simulados de cada acción#
El array st
tiene 21 columanas (n+1
), la última columna tiene
los precios simulados para un mes. Con esta columna se calcularán los
rendimientos mensuales simulados.
rend = matrix(, iteraciones, ncol(rendimientos))
for(i in 1:ncol(rendimientos)){
rend[,i] = st[,n+1,i]/s[i]-1 #Rendimientos mensuales simulados de cada acción.
}
Rendimientos mensuales simulados del portafolio de inversión#
rend_port = vector()
for(i in 1:nrow(rendimientos)){
rend_port[i] = sum(rend[i,]*proporciones)
}
VaR mensual individuales#
VaR_individuales_SM_percentil = vector()
for(i in 1:ncol(rendimientos)){
VaR_individuales_SM_percentil[i] = abs(quantile(rend[,i], 1-NC)*valor_mercado_acciones[i])
}
VaR_individuales_SM_percentil
- 68425768.9393525
- 8715863.30371035
- 22371602.2623771
- 78647023.9143117
VaR mensual del portafolio de inversión#
VaR_portafolio_SM_percentil = abs(quantile(rend_port, 1-NC)*valor_portafolio)
VaR_portafolio_SM_percentil
CVaR mensual individuales#
CVaR = vector()
for(i in 1:ncol(rendimientos)){
CVaR[i] = abs(mean(tail(sort(rend[,i], decreasing = T), floor(nrow(rend)*(1-NC))))*valor_mercado_acciones[i])
}
CVaR
- 84333805.7509863
- 10876579.5113407
- 27763643.9843417
- 98184468.4514079
CVaR mensual del portafolio de inversión#
CVaR_portafolio = abs(mean(tail(sort(rend_port, decreasing = T), floor(nrow(rend)*(1-NC))))*valor_portafolio)
CVaR_portafolio
¿Cuál es el VaR y CVaR diario con un nivel de confianza del 99% de cada una de las acciones y del portafolio de inversión?#
Como anteriormente se hallaron los precios simulados para 20 días (un mes), no es necesario volverlos a calcularlos porque solo se necesitan los precios simulados del día uno para obtener los rendimientos simulados diarios. Estos valores están en la columna 2 del array ``st``.
NC = 0.99
Rendimientos diarios simulados de cada acción#
st[,2,i]
son los precios simulados de cada acción para el día uno.
rend = matrix(, iteraciones, ncol(rendimientos))
for(i in 1:ncol(rendimientos)){
rend[,i] = st[,2,i]/s[i]-1 #Rendimientos simulados de cada acción para el día 1.
}
Rendimientos diarios simulados del portafolio de inversión#
rend_port = vector()
for(i in 1:nrow(rendimientos)){
rend_port[i] = sum(rend[i,]*proporciones)
}
VaR diario individuales#
VaR_individuales_SM_percentil = vector()
for(i in 1:ncol(rendimientos)){
VaR_individuales_SM_percentil[i] = abs(quantile(rend[,i], 1-NC)*valor_mercado_acciones[i])
}
VaR_individuales_SM_percentil
- 22434687.8014924
- 2919082.71606842
- 7386222.59359142
- 26246899.3793198
VaR diario portafolio de inversión#
VaR_portafolio_SM_percentil = abs(quantile(rend_port, 1-NC)*valor_portafolio)
VaR_portafolio_SM_percentil
CVaR diario individuales#
CVaR = vector()
for(i in 1:ncol(rendimientos)){
CVaR[i] = abs(mean(tail(sort(rend[,i], decreasing = T), floor(nrow(rend)*(1-NC))))*valor_mercado_acciones[i])
}
CVaR
- 25585202.4378887
- 3353496.1402176
- 8392179.62141718
- 29944435.6810667
CVaR diario portafolio de inversión#
CVaR_portafolio = abs(mean(tail(sort(rend_port, decreasing = T), floor(nrow(rend)*(1-NC))))*valor_portafolio)
CVaR_portafolio