options(repos = "https://cloud.r-project.org")
# ---------------------------------------------------
# Trabajo analisis de cartera
# Master en Analisis para la Inteligencia de Negocios
# ----------------------------------------------------

# 
# Volatilidad
# 
paquetes <- c("RcmdrMisc","rugarch",
              "quantmod","tseries",
              "MTS","ghyp","mvtnorm")
install.packages(paquetes)
## Installing packages into 'C:/Users/Lenovo/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'RcmdrMisc' successfully unpacked and MD5 sums checked
## package 'rugarch' successfully unpacked and MD5 sums checked
## package 'quantmod' successfully unpacked and MD5 sums checked
## package 'tseries' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'tseries'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\Lenovo\AppData\Local\R\win-library\4.3\00LOCK\tseries\libs\x64\tseries.dll
## to
## C:\Users\Lenovo\AppData\Local\R\win-library\4.3\tseries\libs\x64\tseries.dll:
## Permission denied
## Warning: restored 'tseries'
## package 'MTS' successfully unpacked and MD5 sums checked
## package 'ghyp' successfully unpacked and MD5 sums checked
## package 'mvtnorm' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Lenovo\AppData\Local\Temp\RtmpyoxWeG\downloaded_packages
require("RcmdrMisc")
## Loading required package: RcmdrMisc
## Warning: package 'RcmdrMisc' was built under R version 4.3.3
## Loading required package: car
## Loading required package: carData
## Loading required package: sandwich
require("rugarch")
## Loading required package: rugarch
## Warning: package 'rugarch' was built under R version 4.3.3
## Loading required package: parallel
## 
## Attaching package: 'rugarch'
## The following object is masked from 'package:stats':
## 
##     sigma
require("quantmod")
## Loading required package: quantmod
## Warning: package 'quantmod' was built under R version 4.3.3
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
require("tseries")
## Loading required package: tseries
## Warning: package 'tseries' was built under R version 4.3.3
require("MTS")
## Loading required package: MTS
## Warning: package 'MTS' was built under R version 4.3.3
require("ghyp")
## Loading required package: ghyp
## Warning: package 'ghyp' was built under R version 4.3.3
## Loading required package: numDeriv
## Loading required package: MASS
require("mvtnorm")
## Loading required package: mvtnorm
## Warning: package 'mvtnorm' was built under R version 4.3.3

Datos

# Analisis descriptivo: gráfico y analítico.
# ------------------------------------------
# descargar datos de yahoo finance.
Xp <- NULL
tick <- c("^N225","MSFT")
for (i in tick){
  Xp <- cbind(Xp,getSymbols.yahoo(i, 
                                  from="2017-01-01",
                                  to = "2023-01-01",
                                  periodicity = "daily", 
                                  auto.assign=FALSE)[,4])
}
## Warning: ^N225 contains missing values. Some functions will not work if objects
## contain missing values in the middle of the series. Consider using na.omit(),
## na.approx(), na.fill(), etc to remove or replace them.
# eliminar filas con NA
Xp <- na.omit(Xp)
Xp
##            N225.Close MSFT.Close
## 2017-01-04   19594.16      62.30
## 2017-01-05   19520.69      62.30
## 2017-01-06   19454.33      62.84
## 2017-01-10   19301.44      62.62
## 2017-01-11   19364.67      63.19
## 2017-01-12   19134.70      62.61
## 2017-01-13   19287.28      62.70
## 2017-01-17   18813.53      62.53
## 2017-01-18   18894.37      62.50
## 2017-01-19   19072.25      62.30
##        ...                      
## 2022-12-16   27527.12     244.69
## 2022-12-19   27237.64     240.45
## 2022-12-20   26568.03     241.80
## 2022-12-21   26387.72     244.43
## 2022-12-22   26507.87     238.19
## 2022-12-23   26235.25     238.73
## 2022-12-27   26447.87     236.96
## 2022-12-28   26340.50     234.53
## 2022-12-29   26093.67     241.01
## 2022-12-30   26094.50     239.82

Se calcula el rendimiento logarítmico del índice Nikkei 225 (N225) y extrae las fechas asociadas con los precios de cierre de dicho índice.

# trabajamos con los precios de cierre diarios
p.n225 <- Xp$N225.Close
r.n225 <- apply(p.n225,2,function(x)diff(log(x),lag=1))
dates <- as.Date(dimnames(as.matrix(p.n225))[[1]])

Visualización de datos

# visualizar los datos.
plot(p.n225)

Se crea un gráfico de líneas del rendimiento logarítmico del índice Nikkei 225 (N225) en función de las fechas.

plot(dates[-1],r.n225,type="l",
     panel.first =grid(nx=NULL,ny=NULL,equilogs=T))

Se puede concluir de forma visual que la gráfica obtenida no tiene patrones de tendencia, estacionalidad o ciclos. Se descarta que existan fenómenos de tendencia que distorsionen el comportamiento de la serie hacia su media.

Se crea un gráfico de caja para mirar la distribución de los datos al cierre del índice de Nikkei (N225).

y <- as.numeric(p.n225$N225.Close)
boxplot(r.n225,
        main="N225 Index boxplot",
        xlab = "Daily returns"
        ,las =2)

Se tienen datos fuera de lo normal de la serie, aunque la media se sigue centrando en cero.

Se realiza un histograma y un gráfico qqnorm para verificar la normalidad de los datos.

hist(r.n225,
     main="N225 Index Histogram",
     xlab = "Daily returns",
     probability = T,
     n=100,
     col="grey")

# simulamos valores de una normal
a <- rnorm(nrow(r.n225),sd=sd(r.n225))
a <- density(a,na.rm = T)
lines(polygon(a$x,
              a$y,
              pch=21L,
              col=rgb(0, 0.41, 0.55,0.46),
              border = NA,
              fillOddEven=T)
)

qqnorm(r.n225,col="gray23",main = "Q-Q Norm")
qqline(r.n225,col="steelblue",lwd=2)

Análisis descriptivo

Se proporcionan una serie de estadísticas descriptivas y el coeficiente de variación para analizar y resumir el vector de rendimientos del índice Nikkei 225.

#con el paquete RcmdrMisc
est <- c("mean","sd", "IQR", "quantiles","cv","skewness", "kurtosis")
numSummary(r.n225,statistics=est)
##          mean         sd        IQR    skewness kurtosis          0%
##  0.0002024685 0.01210262 0.01227486 -0.05576799 3.651388 -0.06273569
##           25%          50%         75%       100%    n
##  -0.005767672 0.0006026994 0.006507193 0.07731376 1415
sd(r.n225)/abs(mean(r.n225))
## [1] 59.77531

Media: El valor promedio de los rendimientos es aproximadamente 0.00020

Desviación estándar: La desviación estándar de los rendimientos es 0.012. Indica la dispersión de los datos alrededor de la media.

Rango intercuartílico: El rango intercuartílico, es 0.012.

Asimetría: El valor de asimetría es -0.055. El valor negativo sugiere una cola más larga a la izquierda de la distribución.

Curtosis: El valor de curtosis es aproximadamente 3.65. La curtosis mide la forma de la distribución de los datos. Un valor mayor que 3 indica una distribución más puntiaguda (más picos y colas pesadas) en comparación con una distribución normal.

Número de observaciones: Hay un total de 1415 observaciones en el vector de datos r.n225.

Coeficiente de variación: El coeficiente de variación es 59.77. Esta medida relativa de dispersión se calcula como la desviación estándar dividida por la media. Un valor alto indica una alta variabilidad en relación con la media de los datos.

Se realiza la prueba KPSS para evaluar la estacionaridad del rendimiento logarítmico del índice N225. El argumento null = “L” especifica que la hipótesis nula es que la serie es tendenciosa y estacional, mientras que la hipótesis alternativa es que no es estacionaria.

## Pruebas de, estacionaridad, 
# hetrocedasticidad y autocorrelación.

kpss.test(r.n225,null="L")
## Warning in kpss.test(r.n225, null = "L"): p-value greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  r.n225
## KPSS Level = 0.04188, Truncation lag parameter = 7, p-value = 0.1
b<-sapply(1:32, function(j){
  e.a <- Box.test(r.n225,type="Ljung-Box",lag=j)[c(1,3)]
  e.h <- Box.test(r.n225^2,type="Ljung-Box",lag=j)[c(1,3)]
  a<-cbind(e.a,e.h)
  names(a) <- rep(names(e.a),2)
  return(a)
})
t(b)
##       statistic   p.value    statistic p.value
##  [1,] 0.000685975 0.9791049  193.2152  0      
##  [2,] 6.619665    0.03652229 234.5725  0      
##  [3,] 7.236548    0.06472841 272.3336  0      
##  [4,] 8.152673    0.08614299 294.2997  0      
##  [5,] 8.661294    0.1233609  314.6455  0      
##  [6,] 9.888745    0.1294161  382.8308  0      
##  [7,] 14.88514    0.03750031 462.8192  0      
##  [8,] 14.97932    0.05954884 536.3982  0      
##  [9,] 15.2921     0.0832186  570.6191  0      
## [10,] 15.76987    0.1064123  614.3926  0      
## [11,] 16.03042    0.1400052  656.8911  0      
## [12,] 17.79009    0.1222145  684.0533  0      
## [13,] 20.40524    0.08555621 711.5615  0      
## [14,] 21.54617    0.0884328  719.8172  0      
## [15,] 23.48089    0.07444973 726.3955  0      
## [16,] 23.58691    0.09892304 759.6504  0      
## [17,] 25.49801    0.08410487 778.131   0      
## [18,] 25.5829     0.1096843  781.5365  0      
## [19,] 30.56371    0.04504834 792.8057  0      
## [20,] 33.41621    0.03035589 798.9762  0      
## [21,] 33.44208    0.04153926 799.7412  0      
## [22,] 35.87435    0.03132098 804.7186  0      
## [23,] 35.87892    0.04244192 812.6452  0      
## [24,] 35.90266    0.0560922  817.0506  0      
## [25,] 36.27749    0.06749368 823.6279  0      
## [26,] 39.8117     0.04070296 826.5267  0      
## [27,] 40.19791    0.04909283 829.8986  0      
## [28,] 40.4197     0.06064266 832.3163  0      
## [29,] 40.69079    0.0732603  833.8418  0      
## [30,] 40.76096    0.09094719 840.5374  0      
## [31,] 41.3541     0.1012495  843.457   0      
## [32,] 41.48       0.1217316  845.2559  0

Prueba KPSS para Estacionaridad: El valor calculado del estadístico KPSS es 0.04188.

Parámetro de Retardo de Truncamiento: El parámetro de retraso de truncamiento es 7. Este parámetro es un valor que se utiliza en el cálculo del estadístico KPSS y se determina de manera que el estadístico siga una distribución conocida bajo la hipótesis nula.

Valor p: El valor p asociado con la prueba es 0.1. El valor p es mayor que el nivel de significancia estándar de 0.05, lo que indica que no hay suficiente evidencia para rechazar la hipótesis nula de estacionaridad. Por lo tanto, se puede concluir que la serie es estacionaria.

Prueba de Autocorrelación (Test de Box-Ljung): Para todos los valores de lag, el valor p es menor que el nivel de significancia estándar de 0.05, lo que indica evidencia significativa de autocorrelación en la serie temporal. Esto sugiere que los valores de la serie están correlacionados entre sí en diferentes rezagos de tiempo.

Se calcula y grafica la volatilidad histórica de la serie temporal del rendimiento logarítmico del índice Nikkei 225 (N225) utilizando el método de media móvil. Cada punto en el gráfico representa la volatilidad en un período de tiempo individual.

# Calculo de la volatilidad
# -------------------------

# Volatilidad histórica
m <- 1
t <- seq(1,length(r.n225),by=m)
nh <- length(t)
filh <- sapply(1:nh,function(i){sum(r.n225[(t[i]):(i*m)]^2/m)})
plot(dates[t],filh,type="l",panel.first =grid(nx=NULL,ny=NULL,equilogs=T))

Se calcula la volatilidad utilizando el método RiskMetrics EWMA y grafica la volatilidad resultante en función de las fechas asociadas.

# 2) Volatilidad RiskMetrics
filEWMA<-EWMAvol(r.n225, lambda = 0.96)$Sigma.t^2
nE<-length(filEWMA)
plot(dates[1:nE],filEWMA,type="l",xlab="dates"
     ,panel.first =grid(nx=NULL,ny=NULL,equilogs=T))

Modelado

Se evalúan distintos modelos sGARCH para definir el mejor ajuste a los datos. Se evalúan con el coeficiente Akaike.

#install.packages("rugarch")
library(rugarch)

# Aquí vamos a evaluar tres modelos diferentes: GARCH(1,1), GARCH(1,2) y GARCH(2,1)
especificaciones <- list(
  c(1,1),  # Modelo GARCH(1,1)
  c(1,2),  # Modelo GARCH(1,2)
  c(2,1)   # Modelo GARCH(2,1)
)

# Inicializar una lista para almacenar los resultados de los modelos
resultados <- list()

# Iterar sobre las especificaciones de los modelos y ajustar cada modelo
for (especificacion in especificaciones) {
  modelo <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = especificacion))
  ajuste <- ugarchfit(spec = modelo, data = r.n225, solver = "hybrid")
  resultados[[paste("GARCH", paste(especificacion, collapse = "-"))]] <- ajuste
}

# Evaluar y comparar los modelos con Akaike
for (nombre_modelo in names(resultados)) {
  cat(nombre_modelo, "AIC:", infocriteria(resultados[[nombre_modelo]]), "\n")
}
## GARCH 1-1 AIC: -6.153754 -6.131472 -6.15379 -6.145429 
## GARCH 1-2 AIC: -6.154046 -6.128051 -6.154095 -6.144334 
## GARCH 2-1 AIC: -6.1523 -6.126304 -6.152349 -6.142587

El coeficiente más pequeño es el del GARCH 1-1, por lo tanto ese se utilizará para modelar los datos.

# 3) GARCH
#help("ugarchspec")
#help("ugarchfit")

#Especificamos el modelo
variance.model <- list(model="sGARCH",garchOrder=c(1,1))
mean.model <- list(armaOrder=c(0,0))
distribution.model <- "std"
garch.spec <- ugarchspec(variance.model = variance.model,
                         mean.model = mean.model,
                         distribution.model = distribution.model)
#estimamos los parámetros
garch.fit <- ugarchfit(spec = garch.spec,data = r.n225)
garch.fit
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : sGARCH(1,1)
## Mean Model   : ARFIMA(0,0,0)
## Distribution : std 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000589    0.000242  2.42776 0.015192
## omega   0.000003    0.000007  0.42016 0.674372
## alpha1  0.077921    0.056197  1.38657 0.165572
## beta1   0.906328    0.068347 13.26061 0.000000
## shape   5.518514    0.602527  9.15894 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000589    0.000691 0.851734  0.39436
## omega   0.000003    0.000059 0.048303  0.96147
## alpha1  0.077921    0.505997 0.153995  0.87761
## beta1   0.906328    0.605952 1.495709  0.13473
## shape   5.518514    9.404734 0.586780  0.55735
## 
## LogLikelihood : 4388.61 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.1959
## Bayes        -6.1773
## Shibata      -6.1959
## Hannan-Quinn -6.1890
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                    0.03538  0.8508
## Lag[2*(p+q)+(p+q)-1][2]   1.37828  0.3903
## Lag[4*(p+q)+(p+q)-1][5]   2.38711  0.5302
## d.o.f=0
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                      2.124  0.1450
## Lag[2*(p+q)+(p+q)-1][5]     3.858  0.2723
## Lag[4*(p+q)+(p+q)-1][9]     6.822  0.2145
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]    0.0077 0.500 2.000  0.9301
## ARCH Lag[5]    4.3887 1.440 1.667  0.1420
## ARCH Lag[7]    5.6035 2.315 1.543  0.1702
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  24.9608
## Individual Statistics:              
## mu     0.06261
## omega  5.92220
## alpha1 0.64186
## beta1  0.73825
## shape  1.09742
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.28 1.47 1.88
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value     prob sig
## Sign Bias           0.4317 0.666009    
## Negative Sign Bias  2.7652 0.005762 ***
## Positive Sign Bias  0.9859 0.324357    
## Joint Effect       13.1715 0.004280 ***
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     32.31      0.02885
## 2    30     33.76      0.24830
## 3    40     53.13      0.06518
## 4    50     52.74      0.33162
## 
## 
## Elapsed time : 0.1757581
#help("residuals,uGARCHfilter-method")

Coeficiente de la media:

Término de varianza persistente:

Coeficiente del término GARCH:

Coeficiente del término ARCH:

Parámetro de forma:

Se calcula la vida media del shock en el modelo GARCH ajustado, que es una medida de la rapidez con la que la volatilidad de los rendimientos financieros se disipa después de un evento de choque o perturbación en el proceso.

# vida media del sock
log(0.5)/log(persistence(garch.fit))
## [1] 43.65904

Los datos son diarios, la vida media del shock sería de aproximadamente 43.66 días. Esto indica que después de un shock en el proceso, se espera que la volatilidad de los rendimientos financieros se reduzca a la mitad en aproximadamente 43.66 días, según el modelo GARCH.

Volatilidad

Se calcula una estimación del valor de la volatilidad a largo plazo en el modelo GARCH, teniendo en cuenta la media de los rendimientos y el coeficiente de persistencia.

# valor de la volatilidad a largo plazo
coef(garch.fit)["mu"]/(1-persistence(garch.fit))
##         mu 
## 0.03737335
filGA <- sigma(garch.fit)^2
nG <- length(filGA)

La volatilidad a largo plazo de la serie de rendimientos financieros sea aproximadamente del 3.74%

plot(filGA)

#plot(garch.fit)

Se compara la precisión de diferentes métodos de estimación de volatilidad (volatilidad histórica, RiskMetrics y GARCH) al calcular la raíz del error cuadrático medio entre las estimaciones de volatilidad y los rendimientos al cuadrado.

# Raiz del Error Cuadrático Medio
rmseh <- sqrt((1/nh)*sum((r.n225^2-filh)^2))
rmseE <- sqrt((1/nE)*sum((r.n225^2-filEWMA)^2))
rmseG <- sqrt((1/nG)*sum((r.n225^2-filGA))^2)

cat("Volatilidad histórica", rmseh, "\n")
## Volatilidad histórica 0
cat("RiskMetrics", rmseE, "\n")
## RiskMetrics 0.00037691
cat("Volatilidad GARCH", rmseG, "\n")
## Volatilidad GARCH 0.0002249089

Se tiene un sobreajuste en la volatilidad histórica, ya que se tiene un error de 0.

Se proporciona una medida de la magnitud promedio de los errores en la estimación de la volatilidad para cada método considerado.

# Error Absoluto Medio
maeh <- (1/nh)*sum(abs(r.n225^2-filh))
maeE <- (1/nE)*sum(abs(r.n225^2-filEWMA))
maeG <- (1/nG)*sum(abs(r.n225^2-filGA))

cat("EAM histórico", maeh, "\n")
## EAM histórico 0
cat("EAM RiskMetrics", maeE, "\n")
## EAM RiskMetrics 0.0001463766
cat("EAM GARCH", maeG, "\n")
## EAM GARCH 0.0001614973
# Error Medio
eh <- (1/nh)*sum(r.n225^2-filh)
eE <- (1/nE)*sum(r.n225^2-filEWMA^2)
eG <- (1/nG)*sum(r.n225^2-filGA^2)

cat("EM histórico", eh, "\n")
## EM histórico 0
cat("EM RiskMetrics", eE, "\n")
## EM RiskMetrics 0.0001464109
cat("EM GARCH", eG, "\n")
## EM GARCH 0.0001463707
matrix(c(rmseh,rmseE,rmseG,maeh,maeE,maeG,eh,eE,eG),byrow = T,3
       ,dimnames = list(c("RMSE","MAE","ME"),c("Histórico","EWMA","GARCH")))
##      Histórico         EWMA        GARCH
## RMSE         0 0.0003769100 0.0002249089
## MAE          0 0.0001463766 0.0001614973
## ME           0 0.0001464109 0.0001463707
windows()
layout(matrix(1:4,2))

Los resultados sugieren que tanto RiskMetrics (EWMA) como GARCH proporcionan estimaciones de volatilidad razonablemente precisas en comparación con la volatilidad histórica, que muestra un sobreajute.

VaR

El VaR histórico es una medida de riesgo que indica la pérdida máxima esperada (en valor absoluto) con un nivel de confianza determinado, basado en datos históricos de rendimientos.

## 1) histórico
alpha <- 0.99
l.var <- quantile(r.n225,alpha)
l.var
##        99% 
## 0.03053478

Hay un 99% de confianza de que las pérdidas no superarán el 3.05% del valor de los rendimientos.

## 2) paramétrico

# a: elección de la función de distribución histórica
# estimamos la densidad
ef <- density(r.n225)
# estimamos la distribución teorica mediante
# la hiperbólica generalizada
ghdfit <- fit.ghypuv(r.n225, symmetric = FALSE,
                     control = list(maxit = 1000),
                     silent = T)

Se grafica la densidad estimada de los rendimientos

# b: bondad del ajuste
ghddens <- dghyp(ef$x, ghdfit)
plot(ef, xlab = " ", ylab = expression(f(x)))
lines(ef$x, ghddens, col = "red")

# qqplot
qqghyp(ghdfit, line = TRUE, ghyp.col = "red", plot.legend = FALSE,
       gaussian = FALSE, main = " ", cex = 0.8)

Como los puntos en el gráfico se alinean aproximadamente en una línea diagonal, sugiere una buena concordancia entre los datos observados y la distribución ajustada.

# c: var.
ghd.VaR <- abs(qghyp(alpha, ghdfit))
ghd.VaR
## [1] 0.03221354

Hay un 99% de confianza de que el rendimiento no excederá el valor de 3.38% en el período de tiempo considerado.

## 4) Simulación
simvar<-sapply(.Random.seed[1:30], function(i){
  set.seed(i)
  sim.n225<-ugarchsim(garch.fit, 
                      n.sim=length(r.n225), 
                      m.sim=1)@simulation$seriesSim
  simvar <- quantile(sim.n225,alpha)
  return(simvar)
})

sim.var <- mean(simvar)
## 5) De una cartera

p.nasdq <- Xp$MSFT.Close
r.nasdq <- apply(p.nasdq,2,function(x)diff(log(x),lag=1))
dates2 <- as.Date(dimnames(as.matrix(p.nasdq))[[1]])
# descriptivo
plot(r.n225,r.nasdq)

# correlación
a <- cor.test(r.n225,r.nasdq)
# grados de libertad
D <- a$parameter
# covarianza
S <- cov(r.n225,r.nasdq)
simr <- rmvt(1e4, sigma=S*(D-2)/D, df=D)+
  sum(mean(cbind(r.n225,r.nasdq)))
# var
car.var <- quantile(simr,alpha)
# visualización
plot(x=ef$x,y=ef$y,type="n",xlab="Pérdidas", ylab="Densidad",axes=F)
axis(1,round(seq(min(ef$x),max(ef$x),length= 7),3))
axis(2,round(seq(min(ef$y),max(ef$y),length= 7),1))
lines(ef)
xvar <- ef$x[ef$x>car.var]
x<- c(x=xvar[1], x=xvar, x=xvar[length(x=xvar)])
y<- c(-2.272981, ef$y[(length(ef$y)-length(x)+3):length(ef$y)], -2.272981)
polygon(x,y, col = "blue")

Se resalta el área donde las pérdidas son mayores que el VaR de la cartera. Esto resalta las pérdidas extremas que superan el nivel de VaR especificado.

matrix(c(l.var,ghd.VaR,sim.var),1,dimnames=list("CVaR",c("Historico","Teórico","Simulado")))
##       Historico    Teórico   Simulado
## CVaR 0.03053478 0.03221354 0.03659538

Valores de VaR condicional (CVaR) calculados utilizando tres métodos diferentes: histórico, teórico y simulado.