Tema 05. Ejercicio 1

Autor/a

Pedro Albarrán

Apartado 1

tidyquant: obtener datos

La biblioteca tidyquant ofrece varias funcionalidades para obtener, transformar y visualizar datos económicos y financieros fácilmente. Aquí solo utilizaremos unas pocas de sus capacidades; podéis encontrar una descripción completa aquí.

Existen varias funciones para obtener datos: tq_index() (para índices bursátiles), tq_exchange() (para bolsas de valores) y tq_get() para datos económicos y financieros de varias fuentes en la web.

Datos económicos de FRED,

La web de FRED dispone de datos económicos de muchos países.

  • Buscamos un dato concreto: p. e., inflación en España que aparece como “Inflation, consumer prices for Spain; Percent, Annual, Not Seasonally Adjusted”

  • Así, averiguamos el “símbolo” o nombre interno de la variable

library(tidyquant)
library(tidyverse)
datos <- tq_get("FPCPITOTLZGESP", get = "economic.data", from = "1960-01-01")

Obtenemos unos datos ordenados con la fecha y el valor numérico de la variable disponibles para trabajar con las funciones de tidyverse. Podemos representar la evolución temporal de esta variable para todo el periodo o una parte (p.e., usando funciones como year() de lubridate)

ggplot(datos) + geom_line(aes(x=date, y=price))

datos %>% filter(year(date)>2000) %>%       
  ggplot() + geom_line(aes(x=date, y=price))

Datos Financieros

Para obtener datos de acciones, averiguamos el símbolo de una acción en Yahoo Finance; por ejemplo, “Telefonica, Equity - NYQ” y “Banco de Santander, S.A. - NYQ”

acciones <- tq_get(c("TEF", "SAN"), get = "stock.prices", complete_cases = FALSE)

Tenemos los datos ordenados en formato largo para las acciones (primero la serie de una acción y luego la de la otra) con información del precio de apertura, cierre, máximo y mínimo de la sesión, volumen negociado, etc.

Funciones adicionales

Esta biblioteca también incluye funciones de análisis específicos, como geoms de ggplot2 para nuevos tipos de gráficos. Podemos representar los distintos precios de una o de varias empresas (“símbolos”) a la vez.

  • Gráficos de barras
acciones %>%
  filter(symbol == "TEF") %>% 
  ggplot(aes(x = date, y = close)) +
  geom_barchart(aes(open = open, high = high, low = low, close = close))

acciones %>%
  filter(month(date) == 10 & year(date) == 2024) %>% 
  ggplot(aes(x = date, y = close)) +
  geom_barchart(aes(open = open, high = high, low = low, close = close)) +
  facet_wrap(~symbol)
  • Gráficos de velas
acciones %>%
  filter(symbol == "TEF") %>% 
  ggplot(aes(x = date, y = close)) +
  geom_candlestick(aes(open = open, high = high, low = low, close = close)) 

acciones %>%
  filter(symbol == "TEF") %>% 
  filter(date >= "2024-02-01" & date <="2024-03-31") %>% 
  ggplot(aes(x = date, y = close)) +
  geom_candlestick(aes(open = open, high = high, low = low, close = close)) 

También podemos añadir (en ambos tipos de gráficos) tendencias calculadas con distintas formas de medias móviles y bandas:

acciones %>%
  filter(symbol == "TEF") %>% 
  filter(year(date)>2022) %>%  
  ggplot(aes(x = date, y = close)) +
    geom_candlestick(aes(open = open, high = high, low = low, close = close)) +
    geom_ma(ma_fun = SMA, n = 50, color = "black") +
    geom_ma(ma_fun = SMA, n = 200, color = "gray")

acciones %>%
  filter(symbol == "TEF") %>% 
  filter(year(date) > 2022) %>%  
  ggplot(aes(x = date, y = close, open = open, high = high, low = low, close = close)) +
  geom_candlestick() +
  geom_bbands(ma_fun = SMA, sd = 2, n = 20) 

Se pueden incorporar todas las funcionalidades habituales de ggplot2 como escalas logarítmicas, geom_smooth(), etc.

Como hemos visto se pueden utilizar las funciones de transformación de datos de tidyverse; además, tidyquant incluye las funciones tq_mutate() y tq_transmutate() con las que se realizan con mayor facilidad operaciones habituales con este tipo de datos como cambiar la periodicidad, obtener rentabilidades a distintos plazos, cálculos de tendencias mediante medias móviles, cálculos de volatilidad, etc. También se incluye la función tq_performance() para el análisis del comportamiento de una acción o una cartera.

Vuestro ejercicio

Elegid una serie de datos de Yahoo Finance y una serie económica (cuya frecuencia NO sea diaria) de FRED; las series deben ser distintas de las del ejemplo. Debéis escribir un apartado de un documento .qmd que combine código para realizar las siguientes tareas y vuestros comentarios sobre las conclusiones que se derivan.

  • Para la serie financiera,

    1. Realizar un gráfico de barras para los últimos cuatro años. Incluir información sobre las tendencias mediante medias móviles. Comentar brevemente.

    2. Elegid dos periodos diferentes de 2 meses cada uno y separados al menos por un mes que consideréis relevante (dados el gráfico anterior). Realizar un gráfico de velas y breve análisis descriptivo para cada periodo. Comentar brevemente resaltando las diferencias y similitudes entre los periodos.

  • Para la serie económica, realizar un gráfico con su evolución temporal en un perido de al menos 25 años que incluya el periodo de la serie financiera. Comentar brevemente.

  • Finalmente combinar la serie económica y la financiera en un único conjunto de datos. Realizar un análisis gráfico y numérico de la covariación de ambas series. Comentar brevemente.

    NOTA: combinar estas dos series implica poner ambas en la misma frecuencia: la serie financiera es diaria y la económica será, dependiendo de vuestra elección, anual, trimestral o mensual. Aunque se pueden usar funciones de tidyquant para esto, podéis usar funciones de tidyverse que conocemos. Simplemente tenéis que calcular la media mensual, trimestral o anual de los datos diarios.

Apartado 2

Scraping con rvest

Internet es un gran lugar para obtener datos. Podemos usar rvest para extraer los datos en tablas HTML de la web, pero a menudo requerirá una limpieza extensa antes de usarlo.

En la web http://www.boxofficemojo.com/alltime/weekends/ tenemos información sobre las películas con más recaudación en su fin de semana de estreno. Usando rvest podemos traer esta tabla a R.

library(tidyverse)
library(rvest)
url <- "http://www.boxofficemojo.com/alltime/weekends/"

Primero, leemos el contenido de la página en HTML. La función read_html() proporcionada por rvest procesa el HTML:

html_bom <- read_html(url)
html_bom

Esto no es muy legible. Además, queremos extraer las tablas dentro del HTML; estas se llaman “table” en html y para esto usamos html_nodes():

tables <- html_bom %>%
  html_nodes("table")
tables

En este caso, solo hay 1 elementos de tipo tabla en esa página .

tables[[1]]

La función html_table() extraerá los datos de esta tabla y los convertirá en un data frame. La opción header = TRUE indica a R que queremos usar la primera fila como nuestros nombres de variable.

movies <- tables[[1]] %>%
  html_table(header = TRUE)
str(movies)

En otrs ocasiones, existen más de una tabla en una página web. Si son pocas se puede determinar cuál nos interesa mediante prueba y error. En particular, en esta caso sabemos que los datos tienen 200 observaciones y 9 columnas; si lo que leemos tiene una dimensiones (obtenidas con str()) muy diferentes no debe ser la tabla que buscamos. En cualquier caso, con muchas tablas en la página web, necesitaremos nuevas herramientas de programación que veremos en breve.

Limpieza de datos

Si bien ahora tenemos los datos, podemos ver que son muy confusos:

  • los nombres de las variables contienen caracteres especiales, como asteriscos, paréntesis y espacios. Esto puede causar problemas, así que queremos cambiarlos.

  • la mayoría de las columnas se almacenan como vectores de caracteres, aunque contienen información cuantitativa. En particular, hay columnas para dólares, porcentajes y fechas que están en el formato equivocado.

Por tanto, no podemos analizar adecuadamente la información. Incluso un simple gráfico, no funcionará como se esperaba.

ggplot(
  data = movies, 
  aes(x = Date, y = Opening)
) + 
  geom_point(aes(size = `% of Total`))

Usaremos parse_number() junto con el verbo mutate() para renombrar las columnas al mismo tiempo.

movies <- movies %>%
  mutate(opening = parse_number(Opening),
         percent_total = parse_number(`% of Total`)/100)

Ahora, cuando dibujamos los datos cuantitativos, obtenemos algo que tiene más sentido.

ggplot(data = movies, aes(x = Date, y = opening)) + 
  geom_point(aes(size = percent_total))

Fechas con lubridate

Las fechas están como caracteres en formato mes/día/año. En tidyverse, la biblioteca lubridate ofrece la función mdy() para convertir a tipo de fecha.

movies <- movies %>%
  mutate(release_date = mdy(Date))
ggplot(data = movies, aes(x = release_date, y = opening/1e6)) + 
  geom_point(aes(color = percent_total)) +
  scale_x_date() +
  labs(y = "Recaudación en el Día de Apertura (en millones de $)",
       x = "Fecha de estreno")

Vuestro Ejercicio

  1. Repetir el ejercicio con la siguiente fuente de información: https://www.the-numbers.com/market/2023/top-grossing-movies. Es decir, debéis extraer los datos relevantes de la web, limpiarlos y dejarlos preparados para trabajar.

    • NOTA: en ese caso, la tabla tiene dos filas al final que NO tienen información útil, sino que incluye totales (es decir, no tenemos inicialmente datos ordenados).
  1. Usando esos datos, realizar un BREVE análisis exploratorio de los datos. Crear las variables adicionales que consideréis necesarias con el tipo de datos adecuado.

    Describid la variación de algunas variables (no todas) y algunas relaciones que consideréis relevantes (p.e., entre género y recaudación o entradas vendidas, entre recaudación y mes o época del años, etc.).

Entrega del ejercicio

Rellenad este FORMULARIO con vuestros datos usando vuestra cuenta institucional de Google Cloud (@gcloud.ua.es) y subid

  • vuestro archivo de .qmd

  • el resultado de compilarlo: bien un archivo .html autocontenido o bien un archivo .html y el directorio relacionado con el mismo nombre; en ambos casos, se recomienda comprimir todo para enviarlo.

IMPORTANTE: el nombre de los ficheros que subáis DEBE seguir el siguiente formato que incluye vuestro número de DNI: ej.,

  • Tema05ej1_123456789.qmd

  • Tema05ej1_123456789.zip