La capacidad de anticipar el comportamiento futuro de los precios en los mercados financieros constituye uno de los elementos centrales para la toma de decisiones de inversión estratégicas y la gestión eficiente de portafolios. En el contexto de los mercados bursátiles globales, donde la incertidumbre es inherente y los patrones de precios reflejan complejas dinámicas de oferta y demanda, el desarrollo de modelos predictivos robustos cobra particular relevancia para inversionistas, analistas financieros y gestores de cartera.
El Invesco \(QQQ Trust\) (QQQ) es uno de los fondos cotizados en bolsa (ETF) más negociados a nivel mundial, con activos bajo gestión superiores a los 400 mil millones de dólares. Este instrumento replica el índice \(Nasdaq-100\), compuesto por las 100 empresas no financieras de mayor capitalización bursátil listadas en el mercado Nasdaq, con una fuerte concentración en el sector tecnológico que incluye líderes como \(Apple\), \(Microsoft\), \(NVIDIA\), \(Amazon\) y \(Alphabet\). Entre 2009 y 2019, el \(QQQ\) se benefició significativamente de las economías de escala en software, el auge de los smartphones y el desarrollo de ecosistemas tecnológicos integrados. Esta composición convierte al \(QQQ\) en un referente para analizar el comportamiento del sector tecnológico estadounidense y, por extensión, las tendencias de innovación que impulsan la economía global.
La importancia de modelar series de precios como la del \(QQQ\) radica en múltiples factores. En primer lugar, los pronósticos financieros juegan un papel fundamental en la formación de expectativas de mercado e influyen directamente en las decisiones de inversión, la asignación de activos y la evaluación de riesgos. En segundo lugar, el análisis cuantitativo de series temporales permite identificar patrones y comportamientos que proporcionan información valiosa para diseñar estrategias de inversión más fundamentadas. La predicción específica del \(QQQ\) es particularmente importante porque replica el índice \(Nasdaq-100\), concentrado en empresas tecnológicas líderes en desarrollo de inteligencia artificial, computación en la nube y ecosistemas digitales innovadores. Dado que el sector tecnológico representa uno de los mercados emergentes y con mayor potencial de crecimiento en la economía global, predecir el comportamiento del \(QQQ\) permite anticipar tendencias en innovación, evaluar correctamente la valuación de activos tecnológicos y gestionar la exposición al riesgo en un sector de alta volatilidad que impulsa transformaciones estructurales en la economía mundial.
En este contexto, los modelos \(ARIMA\) (AutoRegressive Integrated Moving Average) se han consolidado como uno de los enfoques más utilizados para el pronóstico de series de tiempo, junto con los modelos de suavizado exponencial. Mientras que los modelos de suavizado exponencial se basan en una descripción de la tendencia y la estacionalidad en los datos, los modelos \(ARIMA\) tienen como objetivo describir las autocorrelaciones presentes en la serie. Estos modelos integran tres componentes fundamentales: el componente autorregresivo (AR), que pronostica la variable de interés utilizando una combinación lineal de sus valores pasados; el componente de integración (I), que transforma series no estacionarias en estacionarias mediante la aplicación de diferencias sucesivas; y el componente de media móvil (MA), que utiliza errores de pronóstico pasados en un modelo similar a la regresión.
Un aspecto fundamental previo al ajuste de modelos \(ARIMA\) es la verificación de la estacionariedad de la serie temporal. Una serie estacionaria es aquella cuyas propiedades no dependen del momento en que se observa; es decir, presenta media aproximadamente horizontal, varianza constante y no muestra patrones predecibles a largo plazo. Las series temporales con tendencias o estacionalidad no son estacionarias. Para identificar series no estacionarias, se emplean tanto herramientas gráficas (la función de autocorrelación ACF de datos no estacionarios decrece lentamente) como pruebas estadísticas formales, entre las que destaca el Test Aumentado de Dickey-Fuller, cuya hipótesis nula establece que los datos son no estacionarios.
El presente estudio emplea datos históricos del ETF \(QQQ\) obtenidos de Yahoo Finance, abarcando el período comprendido entre el 7 de octubre de 2022 y el 2 de diciembre de 2025, con un total de 791 observaciones diarias de precios de cierre. Durante este período, el precio del \(QQQ\) fluctuó entre un mínimo de $260.10 y un máximo de $635.77, con un precio promedio de $435.84 y una desviación estándar de $97.95. El rendimiento acumulado del período alcanzó un notable 131.14%, reflejando la fuerte recuperación del sector tecnológico tras el mercado bajista de 2022 y el impulso generado por desarrollos en inteligencia artificial. La volatilidad anualizada de la serie se ubicó en aproximadamente 21.12%, característica de instrumentos con alta exposición al sector tecnológico.
El análisis incluye la verificación de supuestos estadísticos
fundamentales: evaluación de estacionariedad mediante la prueba de \(Dickey-Fuller\) Aumentada y análisis
gráfico de las funciones de autocorrelación (ACF) y autocorrelación
parcial (PACF), la selección del modelo óptimo utilizando criterios de
información (AICc), y la validación diagnóstica de residuos para
confirmar que se comporten como ruido blanco. Se comparan múltiples
especificaciones \(ARIMA\), incluyendo
el modelo seleccionado automáticamente mediante la función
auto.arima y configuraciones alternativas sugeridas por el
análisis de los gráficos \(ACF\) y
\(PACF\), reconociendo que aunque la
automatización es útil, “cualquier cosa automatizada puede ser un poco
peligrosa, y vale la pena entender algo sobre el comportamiento de los
modelos”.
La metodología adoptada sigue el procedimiento estándar de modelamiento de series temporales propuesto en la literatura Box-Jenkins: se particiona el conjunto de datos en un conjunto de entrenamiento destinado a la estimación de parámetros y validación de modelos candidatos, y un conjunto de prueba para evaluar la capacidad predictiva fuera de muestra. Este diseño respeta la naturaleza secuencial de datos financieros, evitando la fuga de información que comprometería la validez de los pronósticos.
La base de datos utilizada proviene de Yahoo Finance, plataforma reconocida globalmente para obtención de datos financieros históricos de alta calidad y frecuencia diaria. Se extrajo información del ETF Invesco \(QQQ\) Trust (símbolo: QQQ), el cual replica el índice Nasdaq-100 compuesto por las 100 empresas no financieras de mayor capitalización bursátil listadas en el mercado Nasdaq, con fuerte concentración en sector tecnológico (Apple, Microsoft, NVIDIA, Amazon, Alphabet, Tesla, Meta).
La extracción se realizó mediante la función
getSymbols() del paquete quantmod de R,
automatizando la descarga directa desde fuente oficial. El período de
estudio abarca desde 7 de octubre de 2022 hasta 2 de diciembre de 2025,
capturando 791 observaciones diarias de precios de cierre. Este período
es particularmente informativo, debido a que incluye recuperación
post-crisis 2022, impulso del rally de inteligencia artificial
(2023-2025), cambios en política monetaria de la Reserva Federal, y
volatilidad estructural del sector tecnológico.
serie_QQQ <- getSymbols("QQQ", src="yahoo", auto.assign=FALSE, from="2010-01-01")
Precio <- serie_QQQ$`QQQ.Close`
El dataset se centra en una única variable cuantitativa de interés: precio de cierre diario del ETF QQQ. Esta variable representa el último precio de negociación durante cada sesión bursátil y es la medida estándar en análisis técnico y modelización de series financieras.
La elección del precio de cierre se fundamenta en que; primero, refleja el consenso del mercado al finalizar cada sesión, incorporando información completa del día; segundo, es el referente para cálculo de rendimientos y valoración de portafolios; tercero, es utilizado en la mayoría de indicadores técnicos y modelos predictivos; y por último, su disponibilidad es consistente sin interrupciones en días hábiles.
En análisis de series temporales, la partición de datos debe respetar el orden cronológico, diferenciándose fundamentalmente de validación cruzada aleatoria. La estrategia implementada divide la serie en dos subconjuntos contiguos:
Conjunto de Entrenamiento: Comprende la mayoría de observaciones históricas (aproximadamente 95% de datos), utilizado para identificar parámetros óptimos del modelo \(ARIMA\), estimar coeficientes y evaluar criterios de información.
Conjunto de Prueba: Representa período posterior no utilizado durante ajuste (aproximadamente 5% de datos), destinado a evaluar capacidad predictiva en escenario realista de pronóstico.
Esta metodología es esencial porque evita “fuga de información” (data leakage) donde datos futuros influirían en predicción del pasado, mantiene estructura cronológica respetando dependencias temporales inherentes a series financieras, simula condiciones reales donde pronósticos se generan sin conocimiento de valores posteriores, y proporciona métricas objetivas de desempeño ex-post que validan capacidad predictiva genuina.
Los modelos \(ARIMA\) (AutoRegressive Integrated Moving Average), desarrollados por Box y Jenkins en 1970, constituyen metodología sistemática y robusta para análisis y pronóstico de series temporales. Se fundamentan en la idea de que el valor actual de una serie puede explicarse mediante sus valores históricos (componente autorregresivo), transformaciones que alcancen estacionariedad (componente integrador), o errores de pronóstico pasados (componente de media móvil).
A diferencia de modelos de regresión que requieren variables explicativas externas, los modelos \(ARIMA\) son univariados, extrayendo toda información predictiva de la propia historia de la serie. Esta característica los hace especialmente valiosos en contextos financieros donde no se dispone de predictores externos confiables, o donde el objetivo es capturar dinámicas intrínsecas de evolución temporal.
El modelo AR(p) pronostica la variable utilizando combinación lineal de sus valores pasados:
\[y_t = c + \phi_1 y_{t-1} + \phi_2 y_{t-2} + \cdots + \phi_p y_{t-p} + \varepsilon_t\]
donde: - \(y_t\) es el valor de la serie en tiempo \(t\) - \(c\) es constante (intercepto o drift) - \(\phi_1, \phi_2, \ldots, \phi_p\) son coeficientes autorregresivos que miden influencia de cada rezago - \(\varepsilon_t\) es término de error (ruido blanco) con \(E[\varepsilon_t]=0\) y varianza \(\sigma^2\) constante
El coeficiente \(\phi_1\) en AR(1) indica persistencia de la serie: valores cercanos a 1 implican alta persistencia (shocks tienen efectos duraderos), mientras que valores cercanos a 0 indican reversión rápida a media. Para que modelo sea estacionario, los coeficientes deben satisfacer restricciones específicas (raíces del polinomio característico fuera del círculo unitario).
La interpretación económica es que si una serie ha estado elevada en período anterior, tiende a permanecer elevada actualmente, capturando inercia o persistencia en comportamiento de variable.
El modelo MA(q) utiliza errores de pronóstico pasados en lugar de valores históricos de variable:
\[y_t = c + \varepsilon_t + \theta_1 \varepsilon_{t-1} + \theta_2 \varepsilon_{t-2} + \cdots + \theta_q \varepsilon_{t-q}\]
donde \(\theta_1, \ldots, \theta_q\) son coeficientes de media móvil.
La interpretación económica es que shocks o sorpresas en serie tienen efectos transitorios que se disipan gradualmente. Esto captura comportamientos donde precios regresan a nivel promedio tras perturbación, en lugar de permanecer desplazados permanentemente. En contextos financieros, MA modela la reversión a media que caracteriza a mercados relativamente eficientes en corto plazo.
Muchas series económicas y financieras no son estacionarias en forma original, presentando tendencias, medias cambiantes, o varianzas no constantes. Una serie estacionaria tiene propiedades estadísticas (media, varianza, autocovarianzas) invariantes en tiempo; una serie no-estacionaria exhibe comportamientos dependientes del momento observado.
El componente de integración aborda esto mediante diferenciación, transformación que calcula cambios entre observaciones consecutivas:
\[y'_t = y_t - y_{t-1} = \Delta y_t\]
Esta operación (primera diferencia) elimina tendencias lineales y estabiliza media. Si una diferencia es insuficiente para estacionariedad, se aplica segunda diferencia:
\[y''_t = y'_t - y'_{t-1} = \Delta^2 y_t\]
El parámetro \(d\) indica número de diferencias necesarias para que serie se vuelva estacionaria. Una serie que requiere \(d\) diferencias se denomina “integrada de orden \(d\)”, denotada I(d). En práctica, rara vez se requieren más de dos diferencias; para series financieras como precios de activos, típicamente \(d=1\) es suficiente.
Combinando los tres componentes, el modelo \(ARIMA(p,d,q)\) se expresa compactamente usando operador de rezago \(B\) (donde \(B y_t = y_{t-1}\)):
\[\Phi(B)(1-B)^d y_t = c + \Theta(B) \varepsilon_t\]
donde: - \(\Phi(B) = 1 - \phi_1 B - \phi_2 B^2 - \cdots - \phi_p B^p\) es polinomio autorregresivo - \((1-B)^d\) es operador de diferenciación aplicado \(d\) veces - \(\Theta(B) = 1 + \theta_1 B + \theta_2 B^2 + \cdots + \theta_q B^q\) es polinomio de media móvil
Esta representación facilita análisis teórico y derivación de propiedades estadísticas. Su elegancia radica en capturar dinámicas complejas mediante combinación sistemática de componentes que actúan en niveles distintos: AR modela persistencia, MA modela efectos de shocks transitorios, I transforma serie hacia propiedades deseadas.
Para que inferencias y pronósticos derivados de \(ARIMA\) sean válidos y confiables, deben cumplirse supuestos sobre naturaleza de serie y sus residuos:
Estacionariedad: Serie temporal debe presentar estacionariedad en media y varianza, i.e., propiedades estadísticas permanecen aproximadamente constantes en tiempo. Esto asegura que relaciones identificadas entre observaciones son estables y predecibles, en lugar de resultado de tendencias determinísticas no modeladas.
Ruido Blanco en Residuos: Los residuos del modelo ajustado deben comportarse como secuencia aleatoria e independiente sin patrones sistemáticos. Si residuos contienen estructura, sugiere que modelo no ha capturado completamente dinámica temporal, requiriendo respecificación.
Homocedasticidad: Se asume que errores tienen varianza constante a través del tiempo. Violaciones (heteroscedasticidad o volatilidad que cambia en tiempo) comprometen precisión de intervalos de confianza.
Normalidad de Residuos: Aunque no es estrictamente necesaria para estimación del modelo, la normalidad es deseable para construcción precisa de intervalos de confianza y validez de pruebas de hipótesis sobre parámetros.
La estacionariedad es requisito previo fundamental antes de modelización \(ARIMA\). Una serie no-estacionaria produciría inferencias engañosas y pronósticos poco confiables.
La Prueba Aumentada de Dickey-Fuller (ADF) es contraste estadístico estándar para evaluación formal. Contrasta: - \(H_0\): Serie tiene raíz unitaria (no-estacionaria) - \(H_1\): Serie es estacionaria
El resultado de esta prueba determina el orden de integración \(d\): si serie original rechaza \(H_0\) (p-valor < 0.05), se procede a diferenciar y repetir hasta lograr estacionariedad. El estadístico ADF compara contra valores críticos tabulados; si estadístico de prueba es más negativo que valor crítico (mayor en magnitud), se rechaza \(H_0\).
Las funciones de autocorrelación proporcionan diagnóstico visual fundamental para entender patrones de dependencia temporal y sugerir especificaciones \(ARIMA\) iniciales.
Función de Autocorrelación (ACF): Cuantifica correlación lineal entre observaciones separadas por rezagos 1, 2, …, k. Su comportamiento es diagnóstico: - En series estacionarias: ACF decae gradualmente hacia cero - En series no-estacionarias: ACF persiste en valores altos durante muchos rezagos
Para identificación de modelo, ACF es especialmente útil para distinguir procesos MA(q): un corte abrupto después de rezago \(q\) (i.e., autocorrelaciones significativas hasta lag \(q\) luego caen a cero dentro de bandas) sugiere componente MA(q).
Función de Autocorrelación Parcial (PACF): Elimina influencia de rezagos intermedios, aislando efecto directo de cada rezago sobre presente. Es especialmente informativa para identificar procesos AR(p): un corte abrupto después de rezago \(p\) sugiere componente AR(p).
El análisis combinado de ACF y PACF proporciona indicios valiosos sobre especificación inicial del modelo, aunque debe complementarse con criterios estadísticos formales.
En práctica moderna, la función auto.arima() automatiza
gran parte del proceso de identificación mediante algoritmos de búsqueda
sistemática. Realiza búsqueda sobre rango especificado de valores para
\(p\), \(d\) y \(q\), evaluando cada combinación mediante
criterios de información como AICc.
Sin embargo, es importante reconocer limitaciones: un modelo automatizado puede omitir especificaciones que, aunque menos óptimas según criterios puramente estadísticos, podrían ser preferibles bajo consideraciones teóricas o interpretativas. Por ello, resulta valioso complementar búsqueda automática con análisis visual de ACF/PACF, permitiendo que teoría económica y conocimiento del dominio del problema informen especificación final.
Cuando múltiples especificaciones \(ARIMA\) son candidatas, es necesario criterio objetivo para elegir entre ellas. Los criterios de información cumplen este rol al balancear calidad del ajuste con complejidad del modelo.
El AICc (Criterio de Información de Akaike Corregido) es criterio más utilizado en práctica para selección de modelos \(ARIMA\). Evalúa verosimilitud del modelo (qué tan bien se ajusta a datos) y aplica penalización por agregar parámetros adicionales, reduciendo tendencia al sobreajuste. Su fórmula es:
\[\text{AICc} = \text{AIC} + \frac{2(p+q+k+1)(p+q+k+2)}{T-p-q-k-2}\]
donde: - \(T\) es número de observaciones - \(p\) y \(q\) son órdenes del modelo \(ARIMA\) - \(k\) es número de parámetros adicionales (como constante)
El término adicional respecto al AIC clásico corrige sesgo que ocurre en muestras pequeñas. Especificaciones con menor AICc son preferibles, indicando mejor balance entre ajuste y parsimonia.
Criterios de información no son aplicables para seleccionar orden de diferenciación \(d\), pues diferenciación altera escala de datos sobre cual se computa verosimilitud, haciendo valores de AICc no comparables entre modelos con diferente \(d\). Por ello, parámetro \(d\) se determina primero mediante pruebas de estacionariedad (ADF), y AICc se utiliza posteriormente para optimizar órdenes \(p\) y \(q\).
Después de ajustar modelo \(ARIMA\) específico, es necesario verificar que modelo haya capturado adecuadamente estructura temporal.
La Prueba de Ljung-Box es contraste estadístico que evalúa si existe autocorrelación significativa en residuos. Contrasta: - \(H_0\): Residuos son ruido blanco independiente (sin autocorrelación) - \(H_1\): Residuos contienen autocorrelación significativa
Si residuos conservan autocorrelación, es señal de que modelo especificado no ha extraído completamente información temporal disponible, requiriendo respecificación con órdenes más altos. Un p-valor elevado (> 0.05) indica que residuos se comportan consistentemente con ruido blanco, suministrando confianza en que modelo ha cumplido su propósito de modelar adecuadamente dinámica temporal de serie.
La metodología Box-Jenkins propone proceso iterativo sistemático para modelización ARIMA. El procedimiento implementado en este análisis sigue estos pasos secuenciales:
Se evalúa estacionariedad de serie mediante pruebas formales (ADF) y análisis visual de ACF. Se identifica número de diferencias necesarias para que serie se vuelva estacionaria: - Si serie original es estacionaria: \(d=0\) - Si primera diferencia es estacionaria: \(d=1\) - Si segunda diferencia es estacionaria: \(d=2\)
El parámetro \(d\) es determinado independientemente de \(p\) y \(q\), antes de cualquier comparación de criterios de información.
Se examinan gráficos de autocorrelación para serie potencialmente diferenciada, obteniendo sugerencias preliminares sobre órdenes \(p\) y \(q\): - Si ACF corta abruptamente en lag \(q\): sugiere MA(q) - Si PACF corta abruptamente en lag \(p\): sugiere AR(p) - Si ambos decaen gradualmente: sugiere proceso mixto ARMA(p,q)
Se identifican especificaciones \(ARIMA\) plausibles basadas en: - Análisis
visual de ACF/PACF - Búsqueda automática mediante
auto.arima() - Consideraciones de parsimonia (preferir
modelos simples) - Teoría económica/financiera sobre comportamiento de
variable
Se ajustan múltiples modelos candidatos con diferentes combinaciones de \((p,d,q)\).
Se comparan especificaciones mediante: - Criterios de información (AICc, AIC, BIC) - Métricas de precisión en datos de entrenamiento (RMSE, MAE, MAPE) - Principio de parsimonia: preferir modelos más simples si diferencias en ajuste son marginales
Se selecciona modelo que balancéa mejor ajuste con complejidad.
Se examinan residuos del modelo seleccionado mediante: - Análisis gráfico temporal de residuos (verificar media cero, varianza constante) - Gráfico de ACF de residuos (verificar ausencia de autocorrelación) - Q-Q plot (verificar aproximación a normalidad) - Prueba de Ljung-Box (verificar formalmente que residuos son ruido blanco)
Si residuos no se comportan como ruido blanco, se regresa a Paso 3 para respecificación.
Una vez validado modelo, se procede a: - Pronósticos puntuales sobre conjunto de prueba - Intervalos de confianza (típicamente 95%) que cuantifican incertidumbre - Evaluación ex-post comparando predicciones contra valores reales observados
Para evaluar objetivamente precisión de pronósticos generados por modelo \(ARIMA\) en conjunto de prueba, se emplean métricas cuantitativas estándar:
RMSE (Root Mean Squared Error):
\[\text{RMSE} = \sqrt{\frac{1}{n} \sum_{t=1}^{n} (\hat{y}_t - y_t)^2}\]
Amplifica penalizaciones sobre errores grandes, siendo sensible a presencia de valores atípicos en errores de pronóstico. Útil para identificar si modelo comete errores sistemáticamente grandes en algún período.
MAE (Mean Absolute Error):
\[\text{MAE} = \frac{1}{n} \sum_{t=1}^{n} |\hat{y}_t - y_t|\]
Proporciona medida de error promedio menos sensible a outliers que RMSE, ofreciendo perspectiva más robusta de desempeño general. Tiene interpretación directa: en promedio, predicciones desviación esta cantidad del valor real.
MAPE (Mean Absolute Percentage Error):
\[\text{MAPE} = \frac{100}{n} \sum_{t=1}^{n} \left| \frac{y_t - \hat{y}_t}{y_t} \right|\]
Expresa error como porcentaje relativo del valor observado, permitiendo comparabilidad del desempeño independientemente de magnitud absoluta de valores predichos. Especialmente útil en contextos financieros donde escala de precios varía.
Cobertura de Intervalos de Confianza:
Se evalúa proporción de valores reales que caen dentro de intervalos de confianza predichos (típicamente 95%). Una calibración correcta sugiere que incertidumbre fue estimada apropiadamente; demasiadas observaciones fuera del intervalo sugiere que modelo subestimó volatilidad.
En esta sección se presenta un análisis descriptivo exhaustivo de la serie histórica del \(ETF QQQ\) (Invesco QQQ Trust) —utilizado aquí como proxy del desempeño conjunto de las empresas del Nasdaq-100— recuperada programáticamente desde Yahoo Finance. La serie cubre desde el 1 de enero de 2010 hasta 2025 y trabaja en frecuencia diaria; la variable base es el precio de cierre ajustado, a partir del cual se calculan rendimientos, logarítmicos diarios, mensuales y anuales, así como medidas de riesgo y desempeño. El propósito central de este bloque es ofrecer una visión integrada y reproducible de (i) la evolución temporal acumulada del precio del \(QQQ\), (ii) la estructura actual del instrumento —por sectores y principales holdings— y (iii) un conjunto de estadísticas descriptivas y métricas financieras que cuantifiquen nivel, dispersión, asimetría, colas y riesgos extremos. Las visualizaciones incluyen gráficos interactivos para facilitar la exploración temporal, un gráfico de asignación sectorial, un diagrama de empaquetamiento circular para las mayores participaciones, histogramas y densidades de retornos, boxplots por año, heatmap estacional mensual y comparaciones normalizadas frente a otros ETFs de mercado . Además, se presenta un resumen anual con volatilidad y drawdown por año para identificar episodios de estrés y recuperación, así como una cronología de hitos tecnológicos relevantes que permite contextualizar inflexiones recientes en la dinámica del \(QQQ\). La interpretación de los resultados prioriza tres ejes: nivel y tendencia de largo plazo, dinámica de riesgo (volatilidad y drawdowns) y concentración (sectorial y por holdings), con el objetivo de brindar una base sólida para cualquier análisis inferencial o de modelado posterior.
library(dplyr)
library(ggplot2)
library(xts)
library(tidyquant)
library(tidyverse)
library(plotly)
library(viridis)
library(reshape2)
library(zoo)
library(PerformanceAnalytics)
library(quantmod)
library(knitr)
library(moments)
library(packcircles)
library(tidyr)
library(lubridate)
serie <- getSymbols('QQQ', src='yahoo', auto.assign=FALSE, from="2010-01-01")
precios <- serie$QQQ.Close
datos_qqq <- data.frame(
Fecha = index(precios),
Precio = as.numeric(precios)
)
datos_qqq <- datos_qqq %>%
mutate(Corte = as.yearqtr(Fecha))
lista_frames <- lapply(unique(datos_qqq$Corte), function(c) {
dt <- datos_qqq[datos_qqq$Corte <= c, ]
dt$Frame <- format(c, "%Y-%q")
return(dt)
})
datos_animados <- dplyr::bind_rows(lista_frames)
p <- ggplot(datos_animados, aes(x = Fecha, y = Precio)) +
geom_area(aes(frame = Frame), fill = tesla_pal$primary, alpha = 0.1, position = "identity") +
geom_line(aes(frame = Frame), color = tesla_pal$primary, size = 0.8) +
labs(
title = "Evolución Dinámica del QQQ",
subtitle = "Crecimiento histórico acumulado",
x = "",
y = "Precio (USD)"
) +
scale_y_continuous(labels = scales::dollar_format()) +
theme_tesla() +
theme(plot.title = element_text(size = 14))
plotly::ggplotly(p, tooltip = c("x", "y")) %>%
plotly::layout(
paper_bgcolor = 'rgba(0,0,0,0)',
plot_bgcolor = 'rgba(0,0,0,0)',
font = list(family = "Inter, sans-serif", color = tesla_pal$text_gray),
hovermode = "x unified"
) %>%
plotly::animation_opts(
frame = 100,
transition = 0,
redraw = FALSE
) %>%
plotly::animation_slider(
currentvalue = list(prefix = "Periodo: ")
) %>%
plotly::config(displayModeBar = FALSE)