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
# 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]])
# 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)
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))
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.
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.
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.
Histórico: Este valor (0.0305) representa el VaR condicional calculado utilizando el enfoque histórico. Indica que, con una probabilidad del 1%, se espera que las pérdidas no superen el 3.05%.
Teórico: Este valor (0.033) representa el VaR condicional calculado utilizando un enfoque teórico, específicamente utilizando la distribución hiperbólica generalizada (GHyp). Con una probabilidad del 1%, se espera que las pérdidas no superen el 3.39%.
Simulado: Este valor (0.037) representa el VaR condicional calculado mediante simulación. Utiliza un enfoque de simulación de Monte Carlo para generar una distribución de pérdidas potenciales y luego calcular el VaR condicional. Con una probabilidad del 1%, se espera que las pérdidas no superen el 3.80%.