library(tidyquant)
library(tidyverse)
<- tq_get("FPCPITOTLZGESP", get = "economic.data", from = "1960-01-01") datos
Tema 05. Ejercicio 1
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
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))
%>% filter(year(date)>2000) %>%
datos 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”
<- tq_get(c("TEF", "SAN"), get = "stock.prices", complete_cases = FALSE) acciones
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,
Realizar un gráfico de barras para los últimos cuatro años. Incluir información sobre las tendencias mediante medias móviles. Comentar brevemente.
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 detidyverse
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)
<- "http://www.boxofficemojo.com/alltime/weekends/" url
Primero, leemos el contenido de la página en HTML. La función read_html()
proporcionada por rvest
procesa el HTML:
<- read_html(url)
html_bom 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()
:
<- html_bom %>%
tables html_nodes("table")
tables
En este caso, solo hay 1 elementos de tipo tabla en esa página .
1]] tables[[
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.
<- tables[[1]] %>%
movies 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
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).
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