Ejercicio con los componentes del IPC:

#Librerías
library(quantmod)
## Warning: package 'quantmod' was built under R version 4.3.2
## 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
library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.3.2
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
#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"