Ejercicio con los componentes del IPC:
#Librerías library(quantmod)
## Warning: package 'quantmod' was built under R version 4.3.2
library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.3.2
#Componentes del IPC Tickers <- c("OMAB.MX", "AC.MX", "GCC.MX", "ASURB.MX", "GMEXICOB.MX", "PINFRA.MX", "GFNORTEO.MX", "GAPB.MX", "TLEVISACPO.MX", "CEMEXCPO.MX", "KIMBERA.MX", "BBAJIOO.MX", "ALPEKA.MX", "BIMBOA.MX", "GENTERA.MX", "GRUMAB.MX", "MEGACPO.MX", "LABB.MX", "FEMSAUBD.MX", "BOLSAA.MX", "ALSEA.MX", "CUERVO.MX", "GCARSOA1.MX") #Datos de los tickers de los últimos 6 meses getSymbols(Tickers, from = as.Date("2023-07-01"), to = as.Date("2023-12-31"))
## [1] "OMAB.MX" "AC.MX" "GCC.MX" "ASURB.MX" ## [5] "GMEXICOB.MX" "PINFRA.MX" "GFNORTEO.MX" "GAPB.MX" ## [9] "TLEVISACPO.MX" "CEMEXCPO.MX" "KIMBERA.MX" "BBAJIOO.MX" ## [13] "ALPEKA.MX" "BIMBOA.MX" "GENTERA.MX" "GRUMAB.MX" ## [17] "MEGACPO.MX" "LABB.MX" "FEMSAUBD.MX" "BOLSAA.MX" ## [21] "ALSEA.MX" "CUERVO.MX" "GCARSOA1.MX"
#Precio ajustado de los tickers Precios_ajustados <- lapply(Tickers, function(ticker) Ad(get(ticker))) #Combinar los precios ajustados Precios <- do.call(merge, Precios_ajustados) #Rendimientos diarios Rends <- Return.calculate(Precios)[-1] #Los mejores y peores rendimientos Rendimientos_totales <- colSums(Rends, na.rm = TRUE) Rendimientos_ordenados <- sort(Rendimientos_totales, decreasing = TRUE) Mejores5 <- head(Rendimientos_ordenados, 5) Mejores5
## GCARSOA1.MX.Adjusted GCC.MX.Adjusted GENTERA.MX.Adjusted ## 0.4482696 0.3312592 0.2856698 ## GFNORTEO.MX.Adjusted FEMSAUBD.MX.Adjusted ## 0.2338400 0.1460326
Peores5 <- tail(Rendimientos_ordenados, 5) Peores5
## MEGACPO.MX.Adjusted BIMBOA.MX.Adjusted CUERVO.MX.Adjusted ## -0.03614286 -0.06198153 -0.19306827 ## ALPEKA.MX.Adjusted TLEVISACPO.MX.Adjusted ## -0.26036959 -0.39381054
#Solo 10 componentes del IPC Tickers <- c("GCARSOA1.MX", "GCC.MX", "GFNORTEO.MX", "FEMSAUBD.MX", "GENTERA.MX", "MEGACPO.MX", "CUERVO.MX", "ALPEKA.MX", "TLEVISACPO.MX", "BIMBOA.MX" ) #Datos de los tickers getSymbols(Tickers, from = as.Date("2023-07-01"), to = as.Date("2023-12-31"))
## [1] "GCARSOA1.MX" "GCC.MX" "GFNORTEO.MX" "FEMSAUBD.MX" ## [5] "GENTERA.MX" "MEGACPO.MX" "CUERVO.MX" "ALPEKA.MX" ## [9] "TLEVISACPO.MX" "BIMBOA.MX"
#Precio ajustado de los tickers Precios_ajustados <- lapply(Tickers, function(ticker) Ad(get(ticker))) #Combinar los precios ajustados Precios <- do.call(merge, Precios_ajustados) #Rendimientos diarios Rends <- Return.calculate(Precios)[-1] #Matriz de varianzas y covarianzas MVC <- cov(Rends) MVC * 100
## GCARSOA1.MX.Adjusted GCC.MX.Adjusted ## GCARSOA1.MX.Adjusted 0.055083377 0.008842775 ## GCC.MX.Adjusted 0.008842775 0.033833555 ## GFNORTEO.MX.Adjusted 0.009484845 0.006929231 ## FEMSAUBD.MX.Adjusted 0.001952526 0.002988795 ## GENTERA.MX.Adjusted 0.013810580 0.011745150 ## MEGACPO.MX.Adjusted 0.010788298 0.002990100 ## CUERVO.MX.Adjusted 0.003465506 -0.003833994 ## ALPEKA.MX.Adjusted 0.016937874 0.001047694 ## TLEVISACPO.MX.Adjusted 0.027884328 0.014440511 ## BIMBOA.MX.Adjusted 0.016248051 0.011182377 ## GFNORTEO.MX.Adjusted FEMSAUBD.MX.Adjusted ## GCARSOA1.MX.Adjusted 0.009484845 0.0019525262 ## GCC.MX.Adjusted 0.006929231 0.0029887953 ## GFNORTEO.MX.Adjusted 0.025898317 0.0061463625 ## FEMSAUBD.MX.Adjusted 0.006146363 0.0185846517 ## GENTERA.MX.Adjusted 0.010203154 0.0028361496 ## MEGACPO.MX.Adjusted 0.004694603 0.0011503867 ## CUERVO.MX.Adjusted 0.006611226 -0.0009941148 ## ALPEKA.MX.Adjusted 0.006440552 0.0020100723 ## TLEVISACPO.MX.Adjusted 0.010480264 0.0045291229 ## BIMBOA.MX.Adjusted 0.003958541 0.0052812864 ## GENTERA.MX.Adjusted MEGACPO.MX.Adjusted ## GCARSOA1.MX.Adjusted 0.013810580 0.010788298 ## GCC.MX.Adjusted 0.011745150 0.002990100 ## GFNORTEO.MX.Adjusted 0.010203154 0.004694603 ## FEMSAUBD.MX.Adjusted 0.002836150 0.001150387 ## GENTERA.MX.Adjusted 0.056478941 0.013587402 ## MEGACPO.MX.Adjusted 0.013587402 0.046850105 ## CUERVO.MX.Adjusted 0.008248493 0.001603587 ## ALPEKA.MX.Adjusted 0.006509059 -0.001871375 ## TLEVISACPO.MX.Adjusted 0.028673734 0.027783250 ## BIMBOA.MX.Adjusted 0.010616191 0.002565828 ## CUERVO.MX.Adjusted ALPEKA.MX.Adjusted ## GCARSOA1.MX.Adjusted 0.0034655059 0.016937874 ## GCC.MX.Adjusted -0.0038339937 0.001047694 ## GFNORTEO.MX.Adjusted 0.0066112257 0.006440552 ## FEMSAUBD.MX.Adjusted -0.0009941148 0.002010072 ## GENTERA.MX.Adjusted 0.0082484935 0.006509059 ## MEGACPO.MX.Adjusted 0.0016035874 -0.001871375 ## CUERVO.MX.Adjusted 0.0505455419 0.020136241 ## ALPEKA.MX.Adjusted 0.0201362413 0.065761485 ## TLEVISACPO.MX.Adjusted 0.0067433884 0.002311176 ## BIMBOA.MX.Adjusted 0.0021204310 0.012346906 ## TLEVISACPO.MX.Adjusted BIMBOA.MX.Adjusted ## GCARSOA1.MX.Adjusted 0.027884328 0.016248051 ## GCC.MX.Adjusted 0.014440511 0.011182377 ## GFNORTEO.MX.Adjusted 0.010480264 0.003958541 ## FEMSAUBD.MX.Adjusted 0.004529123 0.005281286 ## GENTERA.MX.Adjusted 0.028673734 0.010616191 ## MEGACPO.MX.Adjusted 0.027783250 0.002565828 ## CUERVO.MX.Adjusted 0.006743388 0.002120431 ## ALPEKA.MX.Adjusted 0.002311176 0.012346906 ## TLEVISACPO.MX.Adjusted 0.117930243 0.019687744 ## BIMBOA.MX.Adjusted 0.019687744 0.028901192
#Matriz de varianzas y covarianzas invertida MVC_Inv = solve(MVC) MVC_Inv
## GCARSOA1.MX.Adjusted GCC.MX.Adjusted ## GCARSOA1.MX.Adjusted 2567.84858 -38.25992 ## GCC.MX.Adjusted -38.25992 3767.21922 ## GFNORTEO.MX.Adjusted -585.42065 -779.31274 ## FEMSAUBD.MX.Adjusted 372.91406 100.45012 ## GENTERA.MX.Adjusted -97.02010 -459.48222 ## MEGACPO.MX.Adjusted -299.20213 110.74664 ## CUERVO.MX.Adjusted 206.47172 468.41507 ## ALPEKA.MX.Adjusted -488.16841 158.55585 ## TLEVISACPO.MX.Adjusted -314.89233 -130.44598 ## BIMBOA.MX.Adjusted -946.67330 -1202.00281 ## GFNORTEO.MX.Adjusted FEMSAUBD.MX.Adjusted ## GCARSOA1.MX.Adjusted -585.42065 372.91406 ## GCC.MX.Adjusted -779.31274 100.45012 ## GFNORTEO.MX.Adjusted 4979.62791 -1540.09993 ## FEMSAUBD.MX.Adjusted -1540.09993 6194.12160 ## GENTERA.MX.Adjusted -457.30939 50.45454 ## MEGACPO.MX.Adjusted -121.41985 -36.94963 ## CUERVO.MX.Adjusted -571.04957 363.99269 ## ALPEKA.MX.Adjusted -164.97541 -31.35711 ## TLEVISACPO.MX.Adjusted -68.66816 -28.49395 ## BIMBOA.MX.Adjusted 567.94600 -1178.61175 ## GENTERA.MX.Adjusted MEGACPO.MX.Adjusted ## GCARSOA1.MX.Adjusted -97.02010 -299.20213 ## GCC.MX.Adjusted -459.48222 110.74664 ## GFNORTEO.MX.Adjusted -457.30939 -121.41985 ## FEMSAUBD.MX.Adjusted 50.45454 -36.94963 ## GENTERA.MX.Adjusted 2305.40822 -376.55572 ## MEGACPO.MX.Adjusted -376.55572 2610.61064 ## CUERVO.MX.Adjusted -276.15565 17.97252 ## ALPEKA.MX.Adjusted -10.98626 148.37644 ## TLEVISACPO.MX.Adjusted -286.58146 -515.01849 ## BIMBOA.MX.Adjusted -307.48960 341.42160 ## CUERVO.MX.Adjusted ALPEKA.MX.Adjusted ## GCARSOA1.MX.Adjusted 206.47172 -488.16841 ## GCC.MX.Adjusted 468.41507 158.55585 ## GFNORTEO.MX.Adjusted -571.04957 -164.97541 ## FEMSAUBD.MX.Adjusted 363.99269 -31.35711 ## GENTERA.MX.Adjusted -276.15565 -10.98626 ## MEGACPO.MX.Adjusted 17.97252 148.37644 ## CUERVO.MX.Adjusted 2436.66099 -737.71827 ## ALPEKA.MX.Adjusted -737.71827 2019.01188 ## TLEVISACPO.MX.Adjusted -138.92569 201.27912 ## BIMBOA.MX.Adjusted 45.25501 -713.24587 ## TLEVISACPO.MX.Adjusted BIMBOA.MX.Adjusted ## GCARSOA1.MX.Adjusted -314.89233 -946.67330 ## GCC.MX.Adjusted -130.44598 -1202.00281 ## GFNORTEO.MX.Adjusted -68.66816 567.94600 ## FEMSAUBD.MX.Adjusted -28.49395 -1178.61175 ## GENTERA.MX.Adjusted -286.58146 -307.48960 ## MEGACPO.MX.Adjusted -515.01849 341.42160 ## CUERVO.MX.Adjusted -138.92569 45.25501 ## ALPEKA.MX.Adjusted 201.27912 -713.24587 ## TLEVISACPO.MX.Adjusted 1227.18365 -518.65765 ## BIMBOA.MX.Adjusted -518.65765 5332.27659
MVC %*% MVC_Inv
## GCARSOA1.MX.Adjusted GCC.MX.Adjusted ## GCARSOA1.MX.Adjusted 1.000000e+00 5.551115e-17 ## GCC.MX.Adjusted -1.387779e-17 1.000000e+00 ## GFNORTEO.MX.Adjusted -1.387779e-17 5.551115e-17 ## FEMSAUBD.MX.Adjusted -6.938894e-18 1.387779e-17 ## GENTERA.MX.Adjusted 2.775558e-17 5.551115e-17 ## MEGACPO.MX.Adjusted -1.006140e-16 2.428613e-17 ## CUERVO.MX.Adjusted -2.775558e-17 -1.734723e-17 ## ALPEKA.MX.Adjusted -1.804112e-16 2.775558e-17 ## TLEVISACPO.MX.Adjusted -2.498002e-16 0.000000e+00 ## BIMBOA.MX.Adjusted 0.000000e+00 -5.551115e-17 ## GFNORTEO.MX.Adjusted FEMSAUBD.MX.Adjusted ## GCARSOA1.MX.Adjusted -4.163336e-17 0.000000e+00 ## GCC.MX.Adjusted 1.387779e-17 0.000000e+00 ## GFNORTEO.MX.Adjusted 1.000000e+00 -2.775558e-17 ## FEMSAUBD.MX.Adjusted 1.040834e-16 1.000000e+00 ## GENTERA.MX.Adjusted 4.163336e-17 -8.326673e-17 ## MEGACPO.MX.Adjusted 3.295975e-17 0.000000e+00 ## CUERVO.MX.Adjusted 8.673617e-17 -6.591949e-17 ## ALPEKA.MX.Adjusted 6.938894e-17 2.775558e-17 ## TLEVISACPO.MX.Adjusted 8.326673e-17 -2.775558e-17 ## BIMBOA.MX.Adjusted 0.000000e+00 0.000000e+00 ## GENTERA.MX.Adjusted MEGACPO.MX.Adjusted ## GCARSOA1.MX.Adjusted 0.000000e+00 0.000000e+00 ## GCC.MX.Adjusted -1.387779e-17 -6.938894e-18 ## GFNORTEO.MX.Adjusted 3.469447e-17 -1.561251e-17 ## FEMSAUBD.MX.Adjusted 0.000000e+00 0.000000e+00 ## GENTERA.MX.Adjusted 1.000000e+00 -2.081668e-17 ## MEGACPO.MX.Adjusted -5.898060e-17 1.000000e+00 ## CUERVO.MX.Adjusted -3.469447e-17 3.469447e-18 ## ALPEKA.MX.Adjusted -1.387779e-17 -2.775558e-17 ## TLEVISACPO.MX.Adjusted -8.326673e-17 -2.636780e-16 ## BIMBOA.MX.Adjusted 1.387779e-17 -2.775558e-17 ## CUERVO.MX.Adjusted ALPEKA.MX.Adjusted ## GCARSOA1.MX.Adjusted -3.642919e-17 -4.163336e-17 ## GCC.MX.Adjusted 4.857226e-17 -2.775558e-17 ## GFNORTEO.MX.Adjusted 1.517883e-18 -2.428613e-17 ## FEMSAUBD.MX.Adjusted -4.336809e-19 -1.387779e-17 ## GENTERA.MX.Adjusted 2.602085e-18 -1.387779e-17 ## MEGACPO.MX.Adjusted -6.505213e-18 -3.469447e-18 ## CUERVO.MX.Adjusted 1.000000e+00 3.816392e-17 ## ALPEKA.MX.Adjusted -3.122502e-17 1.000000e+00 ## TLEVISACPO.MX.Adjusted -5.030698e-17 0.000000e+00 ## BIMBOA.MX.Adjusted 1.214306e-17 -5.551115e-17 ## TLEVISACPO.MX.Adjusted BIMBOA.MX.Adjusted ## GCARSOA1.MX.Adjusted 1.387779e-17 0.000000e+00 ## GCC.MX.Adjusted 1.387779e-17 0.000000e+00 ## GFNORTEO.MX.Adjusted 1.734723e-17 0.000000e+00 ## FEMSAUBD.MX.Adjusted 3.469447e-18 5.551115e-17 ## GENTERA.MX.Adjusted 1.387779e-17 0.000000e+00 ## MEGACPO.MX.Adjusted 8.673617e-18 2.775558e-17 ## CUERVO.MX.Adjusted 2.428613e-17 -1.387779e-17 ## ALPEKA.MX.Adjusted 4.163336e-17 0.000000e+00 ## TLEVISACPO.MX.Adjusted 1.000000e+00 -2.220446e-16 ## BIMBOA.MX.Adjusted 2.775558e-17 1.000000e+00
#Matriz de unos Unos <- matrix(data = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), nrow = 1) Unos
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] ## [1,] 1 1 1 1 1 1 1 1 1 1
#Formula de Markowitz: w* = (1n * MVC-1) / (1n * MVC-1 * t(1n)) Numerador <- Unos %*% MVC_Inv Numerador
## GCARSOA1.MX.Adjusted GCC.MX.Adjusted GFNORTEO.MX.Adjusted ## [1,] 377.5975 1995.883 1259.318 ## FEMSAUBD.MX.Adjusted GENTERA.MX.Adjusted MEGACPO.MX.Adjusted ## [1,] 4266.421 84.28236 1879.982 ## CUERVO.MX.Adjusted ALPEKA.MX.Adjusted TLEVISACPO.MX.Adjusted ## [1,] 1814.919 380.772 -573.2209 ## BIMBOA.MX.Adjusted ## [1,] 1420.218
Denominador <- Unos %*% MVC_Inv %*% t(Unos) Denominador
## [,1] ## [1,] 12906.17
w <- Numerador / as.numeric(Denominador) w
## GCARSOA1.MX.Adjusted GCC.MX.Adjusted GFNORTEO.MX.Adjusted ## [1,] 0.02925713 0.1546456 0.09757488 ## FEMSAUBD.MX.Adjusted GENTERA.MX.Adjusted MEGACPO.MX.Adjusted ## [1,] 0.3305721 0.006530392 0.1456653 ## CUERVO.MX.Adjusted ALPEKA.MX.Adjusted TLEVISACPO.MX.Adjusted ## [1,] 0.1406241 0.02950309 -0.04441448 ## BIMBOA.MX.Adjusted ## [1,] 0.1100418
sum(w)
## [1] 1
#Varianza del portafolio óptimo: Var(p) = w * MVC * t(w) VarP <- w %*% MVC %*% t(w) VarP * 100
## [,1] ## [1,] 0.007748231
#Rendimiento esperado de la cartera de activos riesgosos E_rp <- colMeans(Rends, na.rm = TRUE) rf <- 0.1119 # Tasa de retorno del activo libre de riesgo (Cetes anual) A <- 26 # Coeficiente de aversión al riesgo (Riesgo moderado - 26) y <- 0.5 # Proporción inicial de activos riesgosos #Función de utilidad utilidad <- function(y) { E_portafolio <- sum(E_rp * y) + (1 - y) * rf U <- E_portafolio - (1/2) * A * VarP return(U) } # Optimización de la proporción de activos riesgosos Resultados_optimizacion <- optimize(utilidad, interval = c(0, 1), maximum = TRUE) Resultados_optimizacion
## $maximum ## [1] 6.610696e-05 ## ## $objective ## [,1] ## [1,] 0.1108856
# Valor óptimo de y y_optimo <- Resultados_optimizacion$maximum #Resultados print(paste("La proporción óptima de activos riesgosos y es:", y_optimo))
## [1] "La proporción óptima de activos riesgosos y es: 6.61069613518961e-05"
print(paste("La utilidad máxima es:", utilidad(y_optimo)))
## [1] "La utilidad máxima es: 0.110885596894181"