Extraer datos con quantmod

Antecedentes e instalación de quantmod

Las estrategias de inversión se han hecho cada vez más sofisticadas y la aplicación de métodos provenientes de las matemáticas, estadísticas y a la postre la Ciencia de los Datos es más común. Las herramientas actuales y consolas de trading todavía no incorporan estos métodos de forma natural o ameritan programación más avanzada, como por ejemplo Metatrader. Por otra parte R es una plataforma que permite realizar estudios avanzados aplicando técnicas de las estadísticas o inclusive machine learning, además se han desarrollado paquetes interesantes, para extraer los datos, simular, hacer backtesting de estrategias de trading, etc. Uno de los paquetes que sirve en este sentido es quantmod.

quantmod es un paquete de R diseñado para asistir a los operadores cuantitativos (quantitative traders) en el desarrollo, pruebas y despliegue de modelos de trading basados en las estadísticas.”

Ahora bien, el primer paso antes de analizar el precio de una acción, es obtener los datos históricos de una fuente confiable. Existen diversas fuentes de las que se pueden extraer los datos, sin embargo, en este artículo utilizaremos Google Finance, por el hecho de que es público y gratuito.

De esta página podemos obtener el precio de apertura, el precio máximo durante la sesión, el precio mínimo y el volumen. Existen diferentes maneras de importar los datos en R, una de ellas es utilizar el paquete quantmod y a través de la función getSymbols() obtener los datos de manera directa en R.

El punto de atención sobre este método de extracción de los datos son los cambios que Google o Yahoo puedan hacer en sus plataformas y afecten de forma temporal el funcionamiento del método getSymbols().

Lo primero que debemos hacer es instalar el paquete quantmod, utilizando el comando install.packages(). Seguidamente cargamos el paquete en nuestro ambiente.

# Instalación del paquete "quantmod"
install.packages("quantmod")
# Carga del paquete en nuestro ambiente
library(quantmod)

Obtener el historial de precios de las acciones

Una vez cargado el paquete, ahora procedemos a la extracción de los datos utilizando como fuente Google Finance mediante la función getSymbols(). El primer parámetro es el símbolo de la acción (ticker), seguidamente le indicamos a la función la fuente de los datos con la opción src. Con las opciones from y to se establece el rango de fecha de los datos que se desean.

Es importante colocar la opción auto.assign = FALSE para evitar que el paquete quantmod cree nuevos objetos con los nombres del símbolo de la acción y la llamada a getSymbols() devuelva el objeto con los datos y así asignarlo a una variable que podamos manipular.

# Extracción de los datos de la acción de Apple, desde Google Finance
AAPL <- getSymbols("AAPL", src="google", from = "2015-01-01", 
                   to = "2017-08-18", auto.assign = FALSE)

# Visualización de los primeros 6 datos
head(AAPL)

# Visualización de los últimos 6 datos
tail(AAPL)

Luego de obtener los datos y almacenarlos en un objeto, de manera que podamos utilizarlo posteriormente, se pueden realizar algunas pruebas básicas a los datos que obtuvimos, que nos permite asegurarnos que los mismos están completos. La primera y más básica dibujar un gráfico de precios mediante la función plot().

plot(AAPL)

Gráfico de Apple

Este gráfico no muestra nada evidentemente sospechoso con los datos de precios de cierre de AAPL. Parece que hay operaciones cotidianas, rebotes del precio de la acción hacia arriba y hacia abajo sin manchas planas evidentes.

Para ilustrar como sería un gráfico de datos incompletos, vamos a eliminar algunas observaciones.

data.missing <- AAPL[-200:-300,]
plot(data.missing)

Gráfico con data incompleta de Apple

En el gráfico anterior se puede apreciar que hay datos faltantes (denotado por la línea plana).

Otra forma de chequear los datos es observar el número de filas y columnas o la dimensión del objeto. El número de filas y columnas indica cuantos elementos hay en la serie de tiempo y el número variables, en el caso de las acciones usualmente son 5 (apertura, alto, bajo, cierre y volumen). De manera que si encontramos más o menos variables podemos darnos cuenta de que hay algún error en los datos.

En el caso de las series de tiempo, el número de filas representa las fechas de la observación. La mayoría de los precios de las acciones muestran solamente los días de trading. Entonces una buena regla para revisar si la serie de tiempo está completa es revisar si hay aproximadamente 252 elementos durante un año.

Si por ejemplo se está trabajando con los datos de 3 años, se deberían esperar 756 observaciones (252 días de trading * 3 años). Para conocer la dimensión de un objeto utilizamos el comando dim. En el caso de nuestros datos son de 2 años y casi 8 meses, por lo que deberían esperarse poco más de 504 observaciones en la serie de tiempo.

dim(AAPL)

El número de la izquierda nos indica el número de observaciones y el de la derecha el número de columnas, que coincide con el número esperado. La diferencia del número de las observaciones debe corresponder a días feriados.

Vamos a hacer gráficas

Ya verificados los datos, ahora procedemos a trabajar con estos. La forma usual de presentar los precios de las acciones es mediante los gráficos de barra o gráficos de velas japonesas. La función chartSeries() cuenta con una variedad de opciones para generar diversos gráficos. Una de esas opciones es generar un gráfico de velas japonesas.

Dependiendo de la fuente de los datos, se deben convertir los datos en un objeto Apertura-Alto-Bajo-Cierre (OHLC), usando el comando as.quantmod.OHLC. En nuestro caso, que estamos trabajando con los datos de Google Finance, no es necesario realizar este paso, sin embargo, lo presentamos brevemente.

Para ello, hay que indicar los nombres de las variables. Para evitar problemas, eliminamos las columnas adicionales que no corresponden a los datos necesarios para un objeto OHLC, con excepción del volumen que no afecta el resultado.

Una vez eliminada la información adicional, ahora convertiremos los datos en un objeto OHLC.

AAPL.ohlc <-as.quantmod.OHLC(AAPL,col.names=c("Open","High","Low","Close","Volume"))
AAPL.ohlc[c(1:3,nrow(AAPL.ohlc)),]

Ahora realizaremos el plot de AAPL.ohlc usando la función chartSeries. El tema por defecto es un fondo negro, con velas naranjas y verdes. Sin embargo, el tema puede ser modificado con el argumento theme, al igual que el título del gráfico con el argumento name.

chartSeries(AAPL.ohlc, name = "AAPL OHLC")

Gráfico OHLC de Apple

En nuestro caso, que estamos utilizando los datos de Google Finance, estos pasos previos no son necesarios ya que estos vienen en formato OHLC. Simplemente basta con llamar a las funciones para graficar los precios.

A continuación se muestran algunas de ellas:

Las funciones barChart() y chartSeries() nos permiten graficar los datos de maneras diversas.

Utilizando la función barChart(), podemos generar tanto gráficos de barras, de línea, como de velas, estableciendo la opción bar.type.

# Creación de objeto con los precios de cierre
AAPL.Close <- AAPL$AAPL.Close

# Gráfico de línea
barChart(AAPL.Close,theme="black",bar.type="l",subset="2017-05::2017")

# Gráfico de barra
barChart(AAPL,theme="black",bar.type="hlc",subset="2017-05::2017")

Gráfico de línea de Apple

Gráfico de barra de Apple

# Gráfico de velas
barChart(AAPL, theme = "white", up.col = "green",dn.col = "red" ,color.vol = TRUE, multi.col = FALSE)

Gráfico de vela de Apple

Como se puede ver, el eje “x” muestra el período de tiempo, el eje “y” muestra el rango de precios para la acción de Apple, así como también el volumen de negociación de cada sesión. Si establecemos el comando TA = "Null", significa que se incluyan indicadores técnicos.

chartSeries(AAPL, TA = NULL)

Gráfico con TA = NULL

La función candleChart() nos permite crear gráficos de velas japonesas. Si queremos graficar un subconjunto de los datos, debemos especificar el rango de fechas deseados mediante la opción subset.

# Gráficos de velas
candleChart(AAPL,subset="2017-05::2017")

Función candleChart

Indicadores técnicos

También podemos agregar indicadores técnicos, ya sea mediante la opción TA o luego de haber llamado a la función. A continuación se mencionan algunos indicadores técnicos:

  • Medias Móviles Exponenciales (EMA)

Agregando la opción TA

candleChart(AAPL,subset="2017-05::2017", TA = "addEMA(n = 50)")

Agregamos la EMA luego de la llamada a la función y se obtiene el mismo resultado:

candleChart(AAPL,subset="2017-05::2017")
addEMA(n = 50, col = "red")

EMA

  • Average True Range (ATR)
candleChart(AAPL,subset="2017-05::2017", TA = "addEMA(n = 50); addATR(n=14)")

ATR

  • Bandas de Bollinger
candleChart(AAPL,subset="2017-05::2017", TA = "addBBands()")

Bandas de Bollinger

  • MACD
candleChart(AAPL,subset="2017-05::2017", TA = "addEMA(n = 50); addMACD()")

MACD

Stocastic Momentum Index

candleChart(AAPL,subset="2017-05::2017", TA = "addEMA(n = 50); addSMI()")

Stochastic

Ya hemos revisado varias opciones de graficación del paquete quantmod vamos a realizar prácticas para familiarizarnos con su uso.

Práctica

Obtener los datos

# Cargar la librería library(quantmod) # Extraer información del precio de las acciones de "The Home Depot" (`HD`) y de "Bank of America" (`BAC`) desde el 01-01-2015 hasta el 18-08-2017 # Extracción de los datos de la acción de "The Home Depot" y "Bank of America", desde Google Finance HD <- BAC <- # Visualización de los primeros 6 datos de `HD` # Visualización de los últimos 6 datos de `BAC` # Verificar que ambas datas estén completas # Extraer información del precio de las acciones de "The Home Depot" (`HD`) y de "Bank of America" (`BAC`) desde el 01-01-2015 hasta el 18-08-2017 # Extracción de los datos de la acción de "The Home Depot" y "Bank of America", desde Google Finance HD <- getSymbols("HD", src="google", from = "2015-01-01", to = "2017-08-18", auto.assign = FALSE) BAC <- getSymbols("BAC", src="google", from = "2015-01-01", to = "2017-08-18", auto.assign = FALSE) # Visualización de los primeros 6 datos de `HD` head(HD) # Visualización de los últimos 6 datos de `BAC` tail(BAC) # Verificar que ambas datas estén completas plot(HD) plot(BAC) test_object("HD", incorrect_msg = "Utilizar la funcion getSymbols y establecer los argumentos correctamente") test_object("BAC", incorrect_msg = "Utilizar la funcion getSymbols y establecer los argumentos correctamente") test_function("head", incorrect_msg = "Llamo correctamente la funcion head?") test_function("tail", incorrect_msg = "Llamo correctamente la funcion tail?") test_function("plot", incorrect_msg = "Llamo correctamente la funcion plot?") success_msg("Muy bien!")
Para obtener los datos del precio de una accion debe utilizar la funcion getSymbols.

Graficación

Ahora vamos a generar algunos gráficos con el paquete quantmod.

# Cargar la librería library(quantmod) # Extracción de los datos de la acción de "The Home Depot" y "Bank of America", desde Google Finance HD <- getSymbols("HD", src="google", from = "2015-01-01", to = "2017-08-18", auto.assign = FALSE) BAC <- getSymbols("BAC", src="google", from = "2015-01-01", to = "2017-08-18", auto.assign = FALSE) # Los objetos `HD` y `BAC` aún se encuentran cargados en la librería. Vamos a generar un gráfico de barra con los datos de `HD` desde mayo 2017. # Generar un gráfico de velas con los datos de `BAC` utilizando la función `chartSeries`, sin mostrar el volumen. # Generar un gráfico de velas con los datos de `HD` utilizando la función `candleChart`, mostrando el volumen de transacciones. Utilizar el mismo rango de fechas del primer gráfico. # Los objetos `HD` y `BAC` aún se encuentran cargados en la librería. Vamos a generar un gráfico de barra con los datos de `HD` desde mayo 2017. barChart(HD,theme="black",bar.type="hlc",subset="2017-05::2017") # Generar un gráfico de velas con los datos de `BAC` utilizando la función `chartSeries`, sin mostrar el volumen. chartSeries(BAC, TA = NULL) # Generar un gráfico de velas con los datos de `HD` utilizando la función `candleChart`, mostrando el volumen de transacciones. Utilizar el mismo rango de fechas del primer gráfico. candleChart(HD,subset="2017-05::2017") test_function("barChart", incorrect_msg = "Llamo correctamente la funcion barChart?") test_function("chartSeries", incorrect_msg = "Llamo correctamente la funcion chartSeries?") test_function("candleChart", incorrect_msg = "Llamo correctamente la funcion candleChart?") success_msg("Excelente!")
Para cada tipo de gráfico hay una función específica.

Indicadores técnicos

Por último vamos a añadir algunos indicadores técnicos a los gráficos.

# Cargar la librería library(quantmod) # Extracción de los datos de la acción de "The Home Depot" y "Bank of America", desde Google Finance HD <- getSymbols("HD", src="google", from = "2015-01-01", to = "2017-08-18", auto.assign = FALSE) BAC <- getSymbols("BAC", src="google", from = "2015-01-01", to = "2017-08-18", auto.assign = FALSE) # Los objetos `HD` y `BAC` aún se encuentran cargados en la librería. Vamos a generar un gráfico de velas con los datos de `HD` y le agregaremos los promedios móviles exponenciales de 50 y de 20. # Generar un gráfico de velas con los datos de `BAC` y agregaremos el `ATR` y una `EMA` de 50. # Generar un gráfico de velas con los datos de `HD` y agregar el `MACD`. # Los objetos `HD` y `BAC` aún se encuentran cargados en la librería. Vamos a generar un gráfico de velas con los datos de `HD` y le agregaremos los promedios móviles exponenciales de 50 y de 20. candleChart(HD, TA = "addEMA(n = 50); addEMA(n = 20)") # Generar un gráfico de velas con los datos de `BAC` y agregaremos el `ATR` y una `EMA` de 50. candleChart(BAC,TA = "addEMA(n = 50); addATR(n=14)") # Generar un gráfico de velas con los datos de `HD` y agregar el `MACD`. candleChart(HD, TA = "addMACD()") test_function("candleChart", incorrect_msg = "Llamo correctamente la funcion candleChart?") success_msg("Excelente!")
Recuerda establecer correctamente el argumento TA.

Como pudimos observar, el paquete quantmod nos ofrece una gran variedad de herramientas para extraer y manipular los datos y a partir de ellos realizar análisis más complejos.

Los comandos en R se pueden descargar para experimentar.

Copyright © 2014-2018 Synergy Vision. Los artículos del Corpus se comparten bajo los términos de la licencia Creative Commons con Reconocimiento, Propósito no comercial, Compartir contenido similar, 4.0 Internacional (CC BY-NC-SA 4.0).

Citar el artículo.