El mercado de criptomonedas, liderado por Bitcoin, se ha caracterizado por su alta volatilidad y su capacidad para capturar la atención de inversores y analistas en todo el mundo. En este contexto, el análisis de datos históricos de Bitcoin se convierte en una herramienta fundamental para comprender su comportamiento, identificar patrones y tomar decisiones informadas. Este proyecto tiene como objetivo realizar un análisis exploratorio de datos (EDA) sobre los precios y el volumen de transacciones de Bitcoin, utilizando datos descargados desde Yahoo Finance.
library(quantmod)
Warning: package 'quantmod' was built under R version 4.4.3
Cargando paquete requerido: xts
Warning: package 'xts' was built under R version 4.4.3
Cargando paquete requerido: zoo
Adjuntando el paquete: 'zoo'
The following objects are masked from 'package:base':
as.Date, as.Date.numeric
Cargando paquete requerido: TTR
Warning: package 'TTR' was built under R version 4.4.3
Registered S3 method overwritten by 'quantmod':
method from
as.zoo.data.frame zoo
library(astsa)library(fpp2)
Warning: package 'fpp2' was built under R version 4.4.3
Warning: package 'forecast' was built under R version 4.4.3
Warning: package 'fma' was built under R version 4.4.3
Warning: package 'expsmooth' was built under R version 4.4.3
Adjuntando el paquete: 'fpp2'
The following object is masked from 'package:astsa':
oil
# Descargar datos de Bitcoin desde Yahoo FinancegetSymbols("BTC-USD", from ="2023-12-01", src ="yahoo")
Warning: BTC-USD contains missing values. Some functions will not work if
objects contain missing values in the middle of the series. Consider using
na.omit(), na.approx(), na.fill(), etc to remove or replace them.
[1] "BTC-USD"
# Convertir a data.frame y agregar el índice como una columnadf <-data.frame(Fecha =index(`BTC-USD`), coredata(`BTC-USD`))# Ver los primeros registros para confirmarhead(df)
Fecha BTC.USD.Open BTC.USD.High BTC.USD.Low
Min. :2023-12-01 Min. : 37718 Min. : 38954 Min. : 37629
1st Qu.:2024-03-25 1st Qu.: 58243 1st Qu.: 59718 1st Qu.: 57187
Median :2024-07-19 Median : 65274 Median : 66590 Median : 63830
Mean :2024-07-19 Mean : 68640 Mean : 70037 Mean : 67238
3rd Qu.:2024-11-11 3rd Qu.: 79547 3rd Qu.: 84146 3rd Qu.: 77828
Max. :2025-03-07 Max. :106147 Max. :109115 Max. :105292
NA's :1 NA's :1 NA's :1
BTC.USD.Close BTC.USD.Volume BTC.USD.Adjusted
Min. : 38689 Min. :9.344e+09 Min. : 38689
1st Qu.: 58349 1st Qu.:2.312e+10 1st Qu.: 58349
Median : 65336 Median :3.245e+10 Median : 65336
Mean : 68753 Mean :3.826e+10 Mean : 68753
3rd Qu.: 83379 3rd Qu.:4.563e+10 3rd Qu.: 83379
Max. :106146 Max. :1.492e+11 Max. :106146
NA's :1 NA's :1 NA's :1
Precios de Apertura, Máximo, Mínimo y Cierre:
El precio mínimo de apertura registrado es 37,718 USD, mientras que el máximo alcanza 106,147 USD.
El precio máximo en algún punto llegó a 109,115 USD, lo que sugiere una fuerte volatilidad.
El precio de cierre sigue un comportamiento similar, con un mínimo de 38,689 USD y un máximo de 106,146 USD.
Tendencias centrales:
La mediana del precio de apertura es 65,316 USD, lo que indica que la mitad de los datos están por encima y la otra mitad por debajo de este valor.
El promedio del precio de apertura es 68,686 USD, lo que sugiere una ligera tendencia alcista.
Realizamos un cambio en los nombres de las variables.
library(dplyr)
######################### Warning from 'xts' package ##########################
# #
# The dplyr lag() function breaks how base R's lag() function is supposed to #
# work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or #
# source() into this session won't work correctly. #
# #
# Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
# conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop #
# dplyr from breaking base R's lag() function. #
# #
# Code in packages is not affected. It's protected by R's namespace mechanism #
# Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. #
# #
###############################################################################
Adjuntando el paquete: 'dplyr'
The following objects are masked from 'package:xts':
first, last
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
El gráfico muestra la evolución del precio de Bitcoin desde diciembre de 2023 hasta marzo de 2025. Se observa una tendencia creciente en general:
Inicio en niveles bajos (~40,000 USD): Bitcoin comienza con precios relativamente bajos.
Subida progresiva hasta mediados de 2024 (~70,000 USD): Se ve un crecimiento con algunas fluctuaciones.
Corrección y consolidación (~60,000 - 70,000 USD): Hay un periodo de estabilidad con pequeñas caídas y subidas.
Rally alcista fuerte (~100,000 USD): En la segunda mitad de 2024, Bitcoin alcanza su punto máximo por encima de 100,000 USD.
Retroceso en 2025 (~90,000 USD): Hacia el final del gráfico, se observa una caída desde el máximo, indicando una posible corrección o toma de ganancias.
library(ggplot2)library(scales) # Para formatear los valores del eje Yggplot(df, aes(x = Fecha)) +geom_line(aes(y = Apertura, color ="Apertura")) +geom_line(aes(y = Cierre, color ="Cierre")) +geom_line(aes(y = Maximo, color ="Máximo"), linetype ="dashed") +geom_line(aes(y = Minimo, color ="Mínimo"), linetype ="dashed") +scale_y_continuous(labels =comma_format()) +# Corrige la notación científicalabs(title ="Evolución de los Precios de Bitcoin",x ="Fecha", y ="Precio (USD)") +theme_minimal()
Boxplots de Distribución de los Precios de Bitcoin
# Cargar libreríaslibrary(ggplot2)library(scales)# Crear el boxplot directamente desde dfggplot(df) +geom_boxplot(aes(x ="Apertura", y = Apertura, fill ="Apertura")) +geom_boxplot(aes(x ="Cierre", y = Cierre, fill ="Cierre")) +geom_boxplot(aes(x ="Máximo", y = Maximo, fill ="Máximo")) +geom_boxplot(aes(x ="Mínimo", y = Minimo, fill ="Mínimo")) +geom_boxplot(aes(x ="Cierre Ajustado", y = Cierre_Ajustado, fill ="Cierre Ajustado")) +scale_y_continuous(labels =comma_format()) +# Formato con comas (ej: 60,000 en vez de 6e+04)labs(title ="Distribución de los Precios de Bitcoin",x ="Tipo de Precio", y ="Valor en USD") +theme_minimal()
El boxplot muestra la distribución de los precios de Bitcoin en diferentes categorías (apertura, cierre, cierre ajustado, máximo y mínimo). Se observa que los precios tienen una alta variabilidad, con la mediana rondando los 70,000 - 80,000 USD. Los precios máximos son consistentemente más altos, mientras que los mínimos muestran mayor dispersión. La volatilidad es notable en todas las categorías.
Análisis de la variable Volumen.
ggplot(df, aes(x = Volumen)) +geom_histogram(bins =30, fill ="steelblue", color ="black", alpha =0.7) +scale_x_log10() +# Escala logarítmica para mejor visualizaciónlabs(title ="Distribución del Volumen de Transacciones",x ="Volumen (USD, log)", y ="Frecuencia") +theme_minimal()
Parece seguir una distribución aproximadamente normal, pero con una ligera asimetría hacia la derecha. Esto sugiere que hay algunos días con volúmenes de transacción significativamente más altos que el promedio.
Esto podría estar asociado a eventos específicos del mercado de criptomonedas (picos de interés, noticias relevantes, o movimientos de grandes inversores).
Por esto decidimos revisar donde están mayormente concentrados estos picos en los datos y encontramos lo siguiente.
# Graficar el volumen de transacciones en el tiempoggplot(df, aes(x = Fecha, y = Volumen)) +geom_line(color ="blue") +geom_point(data = outliers, aes(x = Fecha, y = Volumen), color ="red", size =2) +labs(title ="Volumen de Transacciones de Bitcoin",x ="Fecha", y ="Volumen (USD)") +theme_minimal()
El mercado de las criptomonedas experimentó un fuerte repunte en noviembre y diciembre del año pasado, impulsado por factores políticos clave en Estados Unidos. Uno de los eventos más influyentes fue la victoria de Donald Trump en las elecciones presidenciales del 5 de noviembre, lo que generó expectativas de un entorno regulatorio más favorable para los activos digitales.
Desde el día de las elecciones, el precio de Bitcoin aumentó más del 40%, pasando de aproximadamente 75.000 dólares a superar los 100.000 dólares por primera vez en su historia. Este incremento estuvo acompañado de un notable aumento en la volatilidad y el volumen de transacciones, esto se refleja en el aumento que hubo desde entonces, pero especialmente entre el 6 y el 13 de noviembre, fechas en las que se discutía la posibilidad de que la nueva administración flexibilizara las regulaciones sobre criptomonedas.
En diciembre, la tendencia continuó con anuncios clave, como la nominación de Paul Atkins como nuevo presidente de la Comisión de Bolsa y Valores (SEC), quien ha manifestado una postura más amigable con las criptomonedas en comparación con su predecesor, Gary Gensler.
Análisis de la relación entre Volumen y Cierre
Se realizó un análisis de regresión lineal simple con el objetivo de evaluar si existe relación entre el volumen de transacciones y el precio de cierre.
library(ggcorrplot)
Warning: package 'ggcorrplot' was built under R version 4.4.3
matriz_cor <-cor(df %>%select(-Fecha)) # Eliminamos la columna de Fechaggcorrplot(matriz_cor, method ="circle", type ="lower",lab =TRUE, lab_size =3, colors =c("red", "white", "blue"),title ="Matriz de Correlaciones entre Variables")
cor(df$Cierre, df$Volumen, use ="complete.obs")
[1] 0.5444245
Lo que realmente nos interesa es la Relación entre Volumen y Cierre:
Se observa una correlación positiva moderada de 0.54 entre volumen y el precio de cierre, lo que sugiere que a medida que el precio de cierre aumenta, el volumen también tiende a incrementarse, aunque no de manera perfectamente lineal.
ggplot(df, aes(x = Cierre, y = Volumen)) +geom_point(alpha =0.5, color ="blue") +geom_smooth(method ="lm", color ="red", se =FALSE) +labs(title ="Relación entre Precio de Cierre y Volumen",x ="Precio de Cierre (USD)", y ="Volumen (USD)") +theme_minimal()
`geom_smooth()` using formula = 'y ~ x'
modelo <-lm(Volumen ~ Cierre, data = df)summary(modelo)
Call:
lm(formula = Volumen ~ Cierre, data = df)
Residuals:
Min 1Q Median 3Q Max
-4.028e+10 -1.004e+10 -2.658e+09 7.060e+09 9.254e+10
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -7.236e+09 3.383e+09 -2.139 0.033 *
Cierre 6.617e+05 4.753e+04 13.920 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.88e+10 on 460 degrees of freedom
Multiple R-squared: 0.2964, Adjusted R-squared: 0.2949
F-statistic: 193.8 on 1 and 460 DF, p-value: < 2.2e-16
Se realizó un análisis de regresión lineal simple con el objetivo de evaluar la relación entre el volumen transaccionado y el precio de cierre.
Significancia de la variable Cierre:
El coeficiente de la variable Cierre es altamente significativo (p < 2e-16), lo que indica que existe una relación estadísticamente relevante entre el precio de cierre y el volumen.
Coeficiente de determinación R^2:
El modelo explica el 29.64% de la variabilidad en el volumen transaccionado. Esto sugiere que, si bien el precio de cierre influye en el volumen, hay otros factores que también afectan su comportamiento.
Conclusión:
El análisis exploratorio de datos del mercado de Bitcoin permitió identificar tendencias, relaciones y anomalías clave. Se manejaron datos faltantes eliminando filas con valores ausentes y se detectaron valores atípicos en el volumen de transacciones, coincidiendo con periodos de alta volatilidad.
El análisis de precios mostró una alta variabilidad y una tendencia alcista, con un rally en la segunda mitad de 2024 que llevó a máximos históricos. Además, se encontró una correlación moderada (0.54) entre el volumen y el precio de cierre, aunque otros factores también influyen en la actividad transaccional.
Las visualizaciones facilitaron la interpretación de los datos y la identificación de patrones clave. Estos hallazgos proporcionan una base sólida para análisis más avanzados, como modelos predictivos o estudios sobre factores adicionales que impactan el mercado de criptomonedas.