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.
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")
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")
## 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")
## 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")
## 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")
## 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")
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")
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")
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")
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")
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)”
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
¡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
Buenas tardes
Me podrías recomendar algún libro de esto, de finanzas cuantitativas para mí tesis de grado.
Gracias
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!
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