Práctica 4: Obtención y Análisis de Rendimientos R

Preparación de librerías

Antes de comenzar, se deben tener instaladas las siguientes librerías para que el código funcione correctamente:

  1. Librería quantmod

  2. Librería fBasics

  3. Librería fPortfolio

install.packages('quantmod')
install.packages('fBasics')
install.packages('fPortfolio')

Siempre que se vaya utilizar una librería debe ser llamada por medio del comando library, en este caso para obtener los datos de los precios de acciones de Yahoo Finance, se llamará a la librería Quantmod

library('quantmod')

Ya con la librería cargada en R, se procede con la obtención de los precios de las acciones con la función getsymbols:

  • Los símbolos de los nombres de las acciones, deben ser extraídos de la página Yahoo Finance

  • Se debe ingresar a la función como una lista de elementos entre comillas y separados por comas (,) dentro de un vector, por ello c('simbolos')

  • Se cambia las fechas según lo deseado, desde el inicio from= y la fecha en formato “AAAA-MM-DD”. Igualmente, con la fecha final to=. en este caso particular la función, Sys.Date(), obtiene la fecha de su sistema.

getSymbols.yahoo(c('BABA','AAPL','WMT', 'WBA', 'TSLA','PEP'),env=globalenv(), from = "2019-02-12",to = Sys.Date())
pausing 1 second between requests for more than 5 symbols

pausing 1 second between requests for more than 5 symbols
  1. 'BABA'
  2. 'AAPL'
  3. 'WMT'
  4. 'WBA'
  5. 'TSLA'
  6. 'PEP'

Una vez obtenidos los datos de cada una de las acciones que se escogen, se procede a crear un objeto de formato DataFrame DF (similar a una matriz) llamado cartera, que incluya los precios ajustados de cada acción, con la función merge.

Para que los nombres de la cartera queden con un mejor formato, se procede a renombrar las columnas del objeto cartera con la función names() e ingresando el vector con la lista de nombres c(" nombre", "nombre").

Por último, se extraen las fechas de los precios de las acciones, para crear un objeto con ellas que mas adelante permita graficar.

cartera= merge(BABA$BABA.Adjusted, AAPL$AAPL.Adjusted, WMT$WMT.Adjusted, WBA$WBA.Adjusted,TSLA$TSLA.Adjusted, PEP$PEP.Adjusted)# el simbolo $ extrae una columna de una matriz
names(cartera)<-c("BABA", "AAPL", "WMT", "WBA", "TSLA", "PEP") #vector de nombres digitados
fechas=index(cartera)

Con el fin de crear una paleta, que ayude a realizar gráficos de distintos colores, se usa la función qualiPalette() perteneciente a la libreria fBasics. El parámetro n=ncol(cartera) crea tantos colores como acciones se tengan en el objeto cartera, y el argumento name = c("Dark2") escoge la paleta de colores a utilizar. Para ver mas colores disponibles visite la librería colorPalette Ver aquí

library('fBasics')
colores= qualiPalette(n=ncol(cartera), name = c("Dark2"))

Creación de la matriz de rendimientos y gráfica de Rdtos

Como ya se creó el objeto cartera como DF, se pueden utilizar las funciones diff() y log(), directamente sobre cartera y de esta forma, obtener los rendimientos logarítmicos sobre los precios ajustados.

Cuando se obtienen los rendimientos, siempre hay un dato menos, dentro de la matriz, por lo que se redefine el objeto Rdtos usando Rdtos=Rdtos[-1,]

Rdtos=diff(log(cartera))
Rdtos=Rdtos[-1,]

Preparación de la ventana de gráficos. (imagen 1)

Con el fin de crear una ventana, que coloque los rendimientos en una matríz gráfica de 6x2, se crean el objeto tamano=c(seq(ncol(cartera))), crea una secuencia de 1 hasta el número total de acciones con el que cuenta cartera, es decir, si se cuentan con 10 acciones en cartera, la secuencia será de 1 hasta 10. de esta forma, la ventana gráfica que se crea con las funciones matrix (filas, columnas), layout(matrix), y layout.show()será de 10x2.

Gráficos de rendimientos (imagen 2)

Para el gráfico de los rendimientos se hace uso de un ciclo for, para que recorra el objeto cartera y grafique las acciones que se encuentran en cada una de las columnas. Así lo hará dentro de la ventana gráfica como se muestra en la segunda imagen. la función plot(), permite realizar las gráficas de tipo X contra Y, que en este caso sería el objeto fechascreado anteriormente, contra la matríz de rendimientos en la columna i Rdtos[,i] dentro de los argumentos principales se encuentran: * main=, que corresponde al título, para este caso particular tomará los nombres que tiene el objeto cartera en la posicón i, es decir, el nombre que se le asignó a cada columna anteriormente. * t= es el tipo de gáfico a usar, en este caso es "h", pero puede cambiarse, dependiendo del gusto. * col= pertenece al argumento color del grafico, que se usarán en este caso los colores definidos anteriormente, por la paleta almacenada en el objeto colores. * xlab= es el título del eje x. Para conocer mas argumentos de la función plot() visite la doumentación Ver aquí

#dev.off()
tamano=c(seq(ncol(cartera)))
matriz=matrix(tamano, ncol=2)
C=layout(matriz)
for(i in 1:ncol(cartera)){
plot(fechas[-1],Rdtos[,i],t="h",main = names(cartera[,i]), col=colores[i],lwd=2, xlab="Fecha")
}
../../_images/output_14_03.png

Histograma de los rendimientos

Al igual que con el gráfico anterior, puede crearse la ventana de preparación de gráficos. dev.off() win.graph(15,13) tamano=c(seq(ncol(cartera))) matriz=matrix(tamano, ncol=2) C=layout(matriz) layout.show(C)

Igualmente, para la creación de cada uno de los histogramas, dada la cantidad de acciones , se realizan por medio de un ciclo for, esta vez se hace uso de la función hist(), para los rendimientos en la posición i Rdtos[,i] con 40 intervalos o barras breaks=40, los demás argumentos son iguales a los de la función plot(). * Adicionalmente, al gráfico de histograma se le ajustan las gráficas de densidad distribución empírica de los datos (línea negra) con las funciones lines() density(), el argumento lwd= determina el grosor de la línea. * También, se le ajusta la curva de distribución normal teórica (línea roja) haciendo uso de la función curve=(dnorm(x,...))el resto de argumentos son similares a la función plot()

for (i in 1:ncol(cartera)){
  hist(Rdtos[,i],breaks = 40,col = colores[i],xlab = "Rendimientos",ylab = "Frecuencia",main = names(cartera[,i]),freq =F)
  lines(density(Rdtos[,i]),lwd=3)
  curve(dnorm(x,mean =mean(Rdtos[,i]),sd=sd(Rdtos[,i])),add=T,col="darkred",lwd=3)
  legend(x="topleft",cex = 0.5,c("Distribución empírica","Distribución Normal"),col=c("Black","darkred"),lwd=c(3,3),bty="n")
}
../../_images/output_16_01.png ../../_images/output_16_1.png ../../_images/output_16_2.png ../../_images/output_16_3.png ../../_images/output_16_4.png ../../_images/output_16_5.png

Estadíticas Básicas

Las diversas estadísticas básicas que sirven para el análisis de los redimientos, pueden ser obtenidas con las funciones: 1. sumary()estadíticas descriptivas como el mínimo, el primer cuantil, mediana, media, tercer cuantil y el maximo de cada una de los rendimientos individuales de las acciones. 2. apply(Rdtos,2,mean) aplica la función mean()a la matríz de rendimientos por columnas (2), para encontrar el vector de los rendimientos promedios. 3. apply(Rdtos,2,mean)aplica la función sd()a la matríz de rendimientos por columnas (2), para encontrar el vector de las volatilidades. 4. cor(Rdtos) obtiene la matriz de correlaciones de los rendimientos

# 1. estadisticas básicas
print(summary(Rdtos))
    Index                 BABA                AAPL
Min.   :2019-02-13   Min.   :-0.081311   Min.   :-0.137708
1st Qu.:2019-06-26   1st Qu.:-0.011150   1st Qu.:-0.006171
Median :2019-11-06   Median : 0.001809   Median : 0.002785
Mean   :2019-11-08   Mean   : 0.001185   Mean   : 0.002576
3rd Qu.:2020-03-23   3rd Qu.: 0.013781   3rd Qu.: 0.013224
Max.   :2020-08-04   Max.   : 0.085728   Max.   : 0.113157
     WMT                  WBA                 TSLA
Min.   :-0.0950917   Min.   :-0.137025   Min.   :-0.205522
1st Qu.:-0.0049237   1st Qu.:-0.011170   1st Qu.:-0.013158
Median : 0.0005883   Median : 0.001138   Median : 0.002658
Mean   : 0.0008993   Mean   :-0.001365   Mean   : 0.004199
3rd Qu.: 0.0063656   3rd Qu.: 0.010254   3rd Qu.: 0.022765
Max.   : 0.1107227   Max.   : 0.118704   Max.   : 0.181445
     PEP
Min.   :-0.1213581
1st Qu.:-0.0051897
Median : 0.0007485
Mean   : 0.0006257
3rd Qu.: 0.0060834
Max.   : 0.1216565
#2. media
media_rdto=apply(Rdtos,2,mean)
print(media_rdto)
        BABA          AAPL           WMT           WBA          TSLA
0.0011852858  0.0025763763  0.0008992570 -0.0013646536  0.0041992525
         PEP
0.0006256733
# 3. volatilidad
volatilidades=apply(Rdtos,2,sd)
print(volatilidades)
      BABA       AAPL        WMT        WBA       TSLA        PEP
0.02111389 0.02330573 0.01615573 0.02572770 0.04492571 0.01935819
#4. matriz de correlaciones
correlacion= cor(Rdtos)
print(correlacion)
          BABA      AAPL       WMT       WBA      TSLA       PEP
BABA 1.0000000 0.6264698 0.2953416 0.3502143 0.4140950 0.3668147
AAPL 0.6264698 1.0000000 0.5030225 0.4846941 0.4505610 0.6683344
WMT  0.2953416 0.5030225 1.0000000 0.4545915 0.1472673 0.6808543
WBA  0.3502143 0.4846941 0.4545915 1.0000000 0.2048999 0.4660967
TSLA 0.4140950 0.4505610 0.1472673 0.2048999 1.0000000 0.2784757
PEP  0.3668147 0.6683344 0.6808543 0.4660967 0.2784757 1.0000000

Matríz de varianzas y covarianzas

Para obtener la matriz de varianzas y covarianzas se hace uso de la función cov(Rdtos).

covarianza= cov(Rdtos)
print(covarianza)
             BABA         AAPL          WMT          WBA         TSLA
BABA 0.0004457962 0.0003082699 0.0001007441 0.0001902405 0.0003927925
AAPL 0.0003082699 0.0005431572 0.0001893987 0.0002906240 0.0004717493
WMT  0.0001007441 0.0001893987 0.0002610077 0.0001889509 0.0001068878
WBA  0.0001902405 0.0002906240 0.0001889509 0.0006619144 0.0002368305
TSLA 0.0003927925 0.0004717493 0.0001068878 0.0002368305 0.0020183194
PEP  0.0001499270 0.0003015237 0.0002129343 0.0002321356 0.0002421849
              PEP
BABA 0.0001499270
AAPL 0.0003015237
WMT  0.0002129343
WBA  0.0002321356
TSLA 0.0002421849
PEP  0.0003747396

Ejercicio práctico:

Haciendo uso del comando getSymbols.yahoo de la librería quantmod, extraiga los datos de los precios de 4 acciones que se encuentren en Yahoo.finance, procure que las acciones tengan una media de rendimientos contínuos positiva. Con estas acciones, aplique el código visto anteriormente, y concluya sobre lo siguiente:

  1. Indique cuales son los cuantiles 1, 2 y 3 para los rendimientos de las acciones. Para todos los casos concluya lo que significa para un inversionista cada uno de estos percentiles.

  2. Saque la media y la volatilidad de los rendimientos e indique que significan.

  3. Reporte el coeficiente de correlación de las acciones y concluya lo que significa.