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
  1. 3180
  2. 18800
  3. 24760
  4. 44700

Número de acciones del portafolio de inversión.

numero_acciones = c(180000,5000,12000,20000)
numero_acciones
  1. 180000
  2. 5000
  3. 12000
  4. 20000

Valor de mercado de cada acción.

valor_mercado_acciones = numero_acciones*s
valor_mercado_acciones
  1. 572400000
  2. 9.4e+07
  3. 297120000
  4. 8.94e+08

Valor de mercado del portafolio de inversión.

valor_portafolio = sum(valor_mercado_acciones)
valor_portafolio
1857520000

Proporciones de inversión.

proporciones = valor_mercado_acciones/valor_portafolio
proporciones
  1. 0.308152805891727
  2. 0.0506051078857832
  3. 0.159955209095999
  4. 0.481286877126491

\(\mu:\) Rendimiento esperado de cada acción

mu = apply(rendimientos, 2, mean)
mu
  1. 0.00052818024892044
  2. 0.000817437518458556
  3. 0.000411972791855423
  4. 0.00146604550819807

\(\sigma:\)Volatilidad de cada acción

volatilidades = apply(rendimientos, 2, sd)
volatilidades
  1. 0.0384381803599016
  2. 0.030438809306807
  3. 0.0239949256781827
  4. 0.0292898506777494

Matriz de coeficientes de correlación

correlacion = cor(rendimientos)
correlacion
A matrix: 4 × 4 of type dbl
1.00000000.31506070.29603060.3571087
0.31506071.00000000.40157950.3706462
0.29603060.40157951.00000000.3298657
0.35710870.37064620.32986571.0000000

Descomposición de Cholesky

cholesky = chol(correlacion)
cholesky
A matrix: 4 × 4 of type dbl
10.31506070.29603060.3571087
00.94907150.32485640.2719872
00.00000000.89823950.1511777
00.00000000.00000000.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 sttiene 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
  1. 27250682.5694049
  2. 3580028.41405506
  3. 8942544.84875934
  4. 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
10%: 43906650.7840915

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
  1. 37265944.1349686
  2. 4850952.504194
  3. 12231487.8941014
  4. 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
481061.470750188

¿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 sttiene 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
  1. 68425768.9393525
  2. 8715863.30371035
  3. 22371602.2623771
  4. 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
5%: 109628306.897354

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
  1. 84333805.7509863
  2. 10876579.5113407
  3. 27763643.9843417
  4. 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
6043185.3876385

¿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
  1. 22434687.8014924
  2. 2919082.71606842
  3. 7386222.59359142
  4. 26246899.3793198

VaR diario portafolio de inversión

VaR_portafolio_SM_percentil = abs(quantile(rend_port, 1-NC)*valor_portafolio)
VaR_portafolio_SM_percentil
1%: 36446602.6033561

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
  1. 25585202.4378887
  2. 3353496.1402176
  3. 8392179.62141718
  4. 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
1322962.98293428