Análisis y optimización de portafolios con R (I)

4.6
(13)

Esta entrada será la primera que publicaré sobre análisis y optimización de portafolios con R.

Comentaré sobre la conformación de un portafolio de inversión, los rendimientos esperados, volatilidad, varianza, correlación, portafolio eficiente, la frontera eficiente y la cartera óptima con R, siguiendo la misma línea de un artículo publicado en los inicios de haber creado este blog en el año 2011 sobre conformación de un portafolio de inversión con las acciones del S&P Mila 40.

Selección de valores o activos

La cartera que será objeto de estudio está conformada por cinco valores bursátiles, correspondientes a empresas de diferentes sectores, las cuales están dentro de las veinte (20) empresas con mayor peso en el índice S&P 500 (a la fecha de publicación de este post), el cual se utilizará como indicador para analizar el comportamiento del mercado norteamericano.

Para el análisis, tomaré un período de tiempo cualquiera, en este caso, descargaré datos que corresponden al precio de cierre ajustado (diario) entre el 4 de enero de 2010 y el 31 de julio de 2019.

Tabla 1.Valores de la Cartera - Basado en GICS Sectors.

Teoría de Markowitz

La selección de estos cinco valores se realizó siguiendo la idea de la diversificación de la teoría de portafolio de Harry Markowitz, su artículo “Portfolio Selection” publicado en 1952, se basa en la idea de que un inversor racional siempre buscará maximizar sus retornos y asumir el menor riesgo posible, lo cual se puede lograr a través de la diversificación de carteras y principalmente al elegir activos que tengan correlaciones bajas o negativas.

La teoría o modelo de portafolio de Markowitz también es conocido como modelo de media-varianza, debido a que para seleccionar los activos que formarán parte de la cartera o el portafolio sólo se tiene en cuenta la media y la varianza, es decir, la rentabilidad esperada (media) y el riesgo (varianza).

Asimismo, este modelo necesita que se de al menos uno de los siguientes supuestos:

  • Los rendimientos de los activos siguen una distribución normal.
  • Los inversores están representados por una función de utilidad cuadrática.

Aquí los inversores son aversos al riesgo por lo que buscan maximizar la rentabilidad y minimizar el riesgo.

Por lo tanto, la diversificación permite:

  • Limitar el riesgo no sistemático, el cual es propio de cada acción y que no depende de los movimientos del mercado sino de las particularidades de cada empresa, el cual tiende a desaparecer cuando la cartera esta diversificada, permaneciendo solo el riesgo sistemático o de mercado.
  • Que el riego de la cartera sea menor que el riesgo de los activos individuales.

Un portafolio o cartera eficiente, es aquel que proporciona la mayor rentabilidad posible a un nivel de riesgo dado o dicho de otro modo, los portafolios eficientes son los que permiten maximizar la rentabilidad para cada nivel de riesgo; con un conjunto de éstos se podría obtener la frontera eficiente, donde están las mejores rentabilidades con diferentes niveles de riesgos o lo que es lo mismo, el conjunto de todas las carteras eficientes.

El inversor siempre elegirá una cartera que esté en la frontera eficiente, la cual se denominará la cartera óptima para el inversionista. Esta cartera óptima siempre ocurrirá donde la línea de asignación de activos es tangente a la frontera eficiente, y es aquella que le permite conseguir una mayor rentabilidad ajustada al riesgo.

Descargar los datos con R

Descargo los datos de los valores seleccionados y del índice S&P 500, a la vez voy graficando la evolución de los precios de estos activos. En este análisis trabajaré con las librerías tseries y fPortfolio:

library(tseries)
library(fPortfolio)
## Índice S&P 500
Indice<- get.hist.quote(instrument = "^GSPC", 
                        start=as.Date("2010-01-04"), 
                        end=as.Date("2019-07-31"), quote = "AdjClose")
plot(Indice, col="darkgreen", xlab="Fecha", ylab="AdjClose"); title(main="Evolución S&P 5OO") 

plot of chunk unnamed-chunk-1

summary(Indice)
##      Index               Adjusted   
##  Min.   :2010-01-04   Min.   :1023  
##  1st Qu.:2012-05-23   1st Qu.:1366  
##  Median :2014-10-15   Median :1957  
##  Mean   :2014-10-15   Mean   :1915  
##  3rd Qu.:2017-03-08   3rd Qu.:2351  
##  Max.   :2019-07-30   Max.   :3026
## Activo 1: APPLE Inc. 
AAPL<- get.hist.quote(instrument = "AAPL", 
                      start=as.Date("2010-01-04"), 
                      end=as.Date("2019-07-31"), quote = "AdjClose")
plot(AAPL, col="darkgreen", xlab="Fecha", ylab="AdjClose"); title(main="Evolución APPLE")

plot of chunk unnamed-chunk-1

## Activo 2: Exxon Mobil Corporation 
XOM<- get.hist.quote(instrument = "XOM", 
                     start=as.Date("2010-01-04"), 
                     end=as.Date("2019-07-31"), quote = "AdjClose")
plot(XOM, col="darkgreen", xlab="Fecha", ylab="AdjClose"); title(main="Evolución Exxon Mobil")

plot of chunk unnamed-chunk-1

## Activo 3: The Home Depot, Inc
HD<- get.hist.quote(instrument = "HD", 
                    start=as.Date("2010-01-04"), 
                    end=as.Date("2019-07-31"), quote = "AdjClose")
plot(HD, col="darkgreen", xlab="Fecha", ylab="AdjClose"); title(main="Evolución Home Depot")

plot of chunk unnamed-chunk-1

## Activo 4: JP Morgan Chase & Co
JPM <- get.hist.quote(instrument = "JPM", 
                      start=as.Date("2010-01-04"), 
                      end=as.Date("2019-07-31"), quote = "AdjClose")
plot(JPM, col="darkgreen", xlab="Fecha", ylab="AdjClose"); title(main="Evolución JP Morgan")

plot of chunk unnamed-chunk-1

## Activo 5: Johnson & Johnson 
JNJ <- get.hist.quote(instrument = "JNJ", 
                      start=as.Date("2010-01-04"), 
                      end=as.Date("2019-07-31"), quote = "AdjClose")
plot(JNJ, col="darkgreen", xlab="Fecha", ylab="AdjClose"); title(main="Evolución Johnson & Johnson")

plot of chunk unnamed-chunk-1

Construcción de la cartera o portafolio

Construyo el portafolio haciendo que coincidan las fechas con datos no nulos de todas las acciones:

Cartera <- merge(AAPL,XOM,HD,JPM,JNJ, all = FALSE) 
names(Cartera)
## [1] "Adjusted.AAPL" "Adjusted.XOM"  "Adjusted.HD"   "Adjusted.JPM" 
## [5] "Adjusted.JNJ"

Renombro los valores seleccionados:

names(Cartera)<-c("AAPL", "XOM", "HD", "JPM", "JNJ")

A continuación miraremos la evolución de los valores seleccionados, los cuales como se observan en los gráficos aunque han presentado algunas caídas, la tendencia de largo plazo es alcista.:

plot(Cartera, main=" ", col="darkgreen", xlab="Fecha")
title(main="Evolución de la Cartera")

plot of chunk unnamed-chunk-4

Rendimientos de la cartera

Calculo y grafico los rendimientos, aplicando rentabilidad logarítmica, tal y como mencioné en una entrada anterior Cálculo de rentabilidades con R: Rentabilidad aritmética Vs Rentabilidad logarítmica.:

RetornoIndice<-diff(log(Indice))
head(RetornoIndice,10)
##                 Adjusted
## 2010-01-05  0.0031108326
## 2010-01-06  0.0005453718
## 2010-01-07  0.0039932177
## 2010-01-08  0.0028775830
## 2010-01-11  0.0017452316
## 2010-01-12 -0.0094254458
## 2010-01-13  0.0082914563
## 2010-01-14  0.0024234862
## 2010-01-15 -0.0108821266
## 2010-01-19  0.0124221511
plot(RetornoIndice, main=" ", col="darkgreen", xlab="Fecha", ylab="Rendimientos")
title(main="Rendimientos del Indice S&P 500")

plot of chunk unnamed-chunk-5

Rendimientos<-diff(log(Cartera))
head(Rendimientos,10)
##                    AAPL           XOM           HD          JPM
## 2010-01-05  0.001727197  0.0038969963  0.007297817  0.019184410
## 2010-01-06 -0.016034152  0.0086055609 -0.003468497  0.005480029
## 2010-01-07 -0.001850037 -0.0031467184  0.011744795  0.019614754
## 2010-01-08  0.006626233 -0.0040196431 -0.004819444 -0.002458788
## 2010-01-11 -0.008860693  0.0111575696 -0.028703330 -0.003362955
## 2010-01-12 -0.011440247 -0.0049911956 -0.006412740 -0.023632374
## 2010-01-13  0.014006941 -0.0040108511  0.005346876  0.017324372
## 2010-01-14 -0.005808420  0.0001436706  0.006025122  0.009894465
## 2010-01-15 -0.016853074 -0.0082138806  0.009495367 -0.022859504
## 2010-01-19  0.043287550  0.0023122136  0.010791852 -0.009199614
##                      JNJ
## 2010-01-05 -0.0116632180
## 2010-01-06  0.0081008047
## 2010-01-07 -0.0071628974
## 2010-01-08  0.0034322202
## 2010-01-11  0.0001556729
## 2010-01-12  0.0052803693
## 2010-01-13  0.0063308767
## 2010-01-14  0.0019987644
## 2010-01-15 -0.0083296412
## 2010-01-19  0.0121624710
plot(Rendimientos, main=" ", col="darkgreen", xlab="Fecha")
title(main="Rendimientos de la Cartera")

plot of chunk unnamed-chunk-5

summary(Rendimientos)
##      Index                 AAPL                 XOM            
##  Min.   :2010-01-05   Min.   :-0.1318850   Min.   :-0.0638793  
##  1st Qu.:2012-05-23   1st Qu.:-0.0069375   1st Qu.:-0.0059202  
##  Median :2014-10-15   Median : 0.0008888   Median : 0.0001185  
##  Mean   :2014-10-16   Mean   : 0.0008528   Mean   : 0.0001598  
##  3rd Qu.:2017-03-08   3rd Qu.: 0.0096196   3rd Qu.: 0.0066356  
##  Max.   :2019-07-30   Max.   : 0.0850222   Max.   : 0.0536919  
##        HD                  JPM                  JNJ            
##  Min.   :-0.0606856   Min.   :-0.0988802   Min.   :-0.1057815  
##  1st Qu.:-0.0052321   1st Qu.:-0.0072619   1st Qu.:-0.0040167  
##  Median : 0.0008692   Median : 0.0004286   Median : 0.0003359  
##  Mean   : 0.0009343   Mean   : 0.0005110   Mean   : 0.0004156  
##  3rd Qu.: 0.0074745   3rd Qu.: 0.0087222   3rd Qu.: 0.0055717  
##  Max.   : 0.0621485   Max.   : 0.0810121   Max.   : 0.0524220

Construyo tabla con los rendimientos esperados (medios) y la volatilidad tanto del mercado como de los activos de la Cartera:

RendimientoPromedio = c(mean(RetornoIndice),mean(Rendimientos$AAPL),mean(Rendimientos$XOM),mean(Rendimientos$HD),mean(Rendimientos$JPM),mean(Rendimientos$JNJ))

Volatilidad = c(sd(RetornoIndice),sd(Rendimientos$AAPL),sd(Rendimientos$XOM),sd(Rendimientos$HD),sd(Rendimientos$JPM),sd(Rendimientos$JNJ) )

Tabla1 = data.frame (rbind(RendimientoPromedio,Volatilidad))
colnames(Tabla1)<- c("S&P500","AAPL", "XOM", "HD", "JPM", "JNJ")

Tabla1*100 ##Expresado en %
##                         S&P500       AAPL       XOM         HD        JPM
## RendimientoPromedio 0.04062026 0.08527926 0.0159783 0.09343395 0.05110523
## Volatilidad         0.93597969 1.62910443 1.1626789 1.24578528 1.59226042
##                            JNJ
## RendimientoPromedio 0.04156527
## Volatilidad         0.94019295

Si analizamos los rendimientos promedios (esperados), la volatilidad del mercado y de los activos que conforman la cartera se tiene que la rentabilidad media diaria del mercado (índice S&P 500) es de 0,041%, por debajo de los rendimientos de las acciones de Apple Inc., Home Depot y JP Morgan, las cuales tienen rendimientos promedios de 0,085%; 0,093% y 0,051% respectivamente. Asimismo, los rendimientos de la acción de Johnson & Johnson son ligeramente superior, al ser de 0.042%. Mientras que el rendimiento de la acción de Exxon Mobil está por debajo del rendimiento del mercado, al ser de 0.016%.

En lo referente a la volatilidad, vemos que la desviación típica del S&P 500 es de 0.94%, por debajo de casi todos los valores que conforman la cartera excepto de la acción de Johnson & Johnson, que presenta la volatilidad más baja de las acciones que conforman la cartea, con una desviación típica de 0,94%. El activo más volátil es a la vez uno de los de mayor rentabilidad (después de la acción de Home Depot, que presenta la rentabilidad más elevada), que es la acción de Apple Inc., con una desviación típica de 1,63%.

Matriz de covarianzas

A partir de los rendimientos diarios calcularemos la matriz de covarianzas, la matriz de correlaciones y la “Heat Matrix” de los activos que conforman la cartera.

## Calculo la varianza (riesgo) de los activos individuales 
var(RetornoIndice)*100
##            Adjusted
## Adjusted 0.00876058
var(Rendimientos$AAPL)*100
## [1] 0.02653981
var(Rendimientos$XOM)*100
## [1] 0.01351822
var(Rendimientos$HD)*100
## [1] 0.01551981
var(Rendimientos$JPM)*100
## [1] 0.02535293
var(Rendimientos$JNJ)*100
## [1] 0.008839628
## Matriz de Varianzas-Covarianzas en %
Cov <- cov(Rendimientos)*100
Cov
##             AAPL         XOM          HD         JPM         JNJ
## AAPL 0.026539812 0.006519073 0.007514204 0.009434867 0.004566579
## XOM  0.006519073 0.013518221 0.006500262 0.010246953 0.005409094
## HD   0.007514204 0.006500262 0.015519810 0.009685543 0.004948912
## JPM  0.009434867 0.010246953 0.009685543 0.025352932 0.006629274
## JNJ  0.004566579 0.005409094 0.004948912 0.006629274 0.008839628

En la matriz de varianzas – covarianzas, los valores que están en la diagonal de la matriz corresponden a las varianzas de los activos de la cartera, esto es, al riesgo individual, donde se observa que el activo más riesgoso es la acción de Apple Inc, con una varianza de 0,026%, mientras que el activo que presenta la menor varianza es la acción de Johnson & Johnson con 0,009%, estando igual que el riesgo individual del mercado, pues el índice S&P 500 tiene una varianza de 0,009%.

Por su parte, la covarianza es una medida estadística simple de los co-movimientos entre dos variables aleatorias. Indica como dos variables aleatorias $latex x_1&s=1$ y $latex x_2&s=1$ se apartan de su media al mismo tiempo, por tanto, la covarianza es positiva si $latex x_2&s=1$ se encuentra por encima de su media cuando $latex x_1&s=1$ también lo está.

Si la covarianza entres dos variables es mayor que cero indicaría que estas variables se mueven en la misma dirección. Por lo anterior y acorde a esta matriz, donde se observa que las covarianzas son positivas aunque toman valores muy bajos, podría indicar que los activos de la cartera tenderían a moverse en el mismo sentido pero de forma muy moderada (como veremos en la matriz de correlaciones, donde la correlación no es muy alta).

La matriz de covarianzas se puede usar para indicar que tan riesgoso es un portafolio.

Matriz de correlaciones

Matriz de Correlaciones en %:

corr <- cor(Rendimientos) * 100
corr
##           AAPL       XOM        HD       JPM       JNJ
## AAPL 100.00000  34.41733  37.02464  36.37247  29.81433
## XOM   34.41733 100.00000  44.87742  55.35041  49.48206
## HD    37.02464  44.87742 100.00000  48.82775  42.25222
## JPM   36.37247  55.35041  48.82775 100.00000  44.28278
## JNJ   29.81433  49.48206  42.25222  44.28278 100.00000

El coeficiente de correlación de cierta forma “estandariza” la covarianza y arroja valores entre -1 y +1. Una correlación positiva alta indica que los retornos están fuertemente asociados, por lo que tienden a moverse en la misma dirección.

Al observar la matriz de correlaciones (%) se puede decir que todas son positivas. Las correlaciones más bajas las presenta la acción de Apple Inc., seguida de la acción de Johnson & Johnson (excepto con la acción de Exxon Mobil, teniendo en cuenta que después de la correlacion de la acción de Apple Inc., la correlación más baja es la de Home Depot).

Si bien es cierto que correlación no indica causalidad se podría esperar que una fuerte caída en el precio de una de esas acciones necesariamente no implica la caída en el precio de las otras, lo cual se buscaba con el concepto de diversificación tal y como se señaló anteriormente, por lo que los valores seleccionados corresponden a diferentes sectores de la economía y así evitar que crisis en un sector específico afecte el rendimiento total de la cartera.

Así mismo, hay que resaltar que lo ideal es que las correlaciones sean negativas o cercanas a cero, para tener una cartera que realmente esté diversificada. En este caso, las correlaciones entre los valores que conforman la cartera son positivas, aunque para todas (excepto entre XOM y JPM) la correlación no supera el 50%.

Matriz de calor o Heat Matrix

Para una mejor visualización de la matriz de correlaciones generamos la Heat Matrix, donde el color amarillo representa los valores con el coeficiente de correlación más alto, el color naranja las correlaciones intermedias y en los colores rojos se encuentran las correlaciones más bajas, que como se mencionó corresponden a la acción de Apple Inc.

## Heat Matrix
require(gplots)
generate_heat_map <- function(correlationMatrix, title)
{

  heatmap.2(x = correlationMatrix,    
            cellnote = correlationMatrix,   
            main = title,           
            symm = TRUE,            
            dendrogram="none",      
            Rowv = FALSE,           
            trace="none",           
            density.info="none",        
            notecol="black")          
}

corr1 <- round(cor(Rendimientos) * 100, 2)
generate_heat_map(corr1,"Heatmap: Correlaciones")

plot of chunk unnamed-chunk-10

 

Para continuar con el análisis, ve a la entrada donde calculo y analizo la frontera y cartera eficiente. Asimismo, para aprender más casos prácticos de R para finanzas, ve a la página de finanzas cuantitativas.

¿Te ha parecido útil? ¡Puntúa esta entrada!

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 4.6 / 5. Recuento de votos: 13

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

5 comentarios en “Análisis y optimización de portafolios con R (I)”

  1. Gracias por este post. Sería de gran ayuda para los que iniciamos en R
    que indicaras versión del mismo y versión de RStudio utilizado.
    Gracias

    1. Conney Marulanda López

      ¡Hola, Patricio!
      Lamento la demora en responder; he estado reorganizando Finanzas Zone, pero ya está de vuelta.
      ¡Gracias por tu interés y tu comentario!
      Muchas gracias por resaltar la importancia de especificar la versión de R y RStudio en nuestros posts.
      Sin duda, es un detalle crucial, especialmente para quienes se están iniciando. Tendré muy en cuenta tu sugerencia y me aseguraré de incluir esta información en nuestros futuros artículos y análisis de finanzas cuantitativas / programación en R para para finanzas y economía.
      Para cualquier consulta o duda, por favor, escribe a info@finanzaszone.com.
      Un saludo,
      Conney

  2. Gracias por este post. Estaba buscando como construir una cartera eficiente con las emisoras que ya habia seleccionado, asi que, despues de intentar en Excel todos estos calculos, me doy cuenta de lo sencillo que es usando R. No conocia nada de R, asi que con lo que has descrito aqui, he podido replicar todos tus resultados. Estoy emocionado! Mucha gracias!

    1. Conney Marulanda López

      Hola, Miguel.
      ¡Muchas gracias por tu comentario!
      Me alegro que este post te haya sido útil.
      Es muy gratificante saber que la info y los análisis que publico pueden ayudar a más personas interesadas en este campo de las finanzas.
      Un saludo,
      Conney

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Facebook
Twitter
LinkedIn
Scroll al inicio