This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
You can also embed plots, for example:
Note that the echo = FALSE parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.
# Instalar paquetes necesarios (ejecutar una vez si no están instalados)
if (!requireNamespace("quantmod", quietly = TRUE)) install.packages("quantmod")
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
if (!requireNamespace("PerformanceAnalytics", quietly = TRUE)) install.packages("PerformanceAnalytics")
if (!requireNamespace("tseries", quietly = TRUE)) install.packages("tseries")
# Cargar librerías
library(quantmod)
## Warning: package 'quantmod' was built under R version 4.2.3
## Loading required package: xts
## Warning: package 'xts' was built under R version 4.2.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.2.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Warning: package 'TTR' was built under R version 4.2.3
library(PerformanceAnalytics) # para funciones financieras adicionales
## Warning: package 'PerformanceAnalytics' was built under R version 4.2.3
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
library(tseries) # para pruebas de estacionariedad
## Warning: package 'tseries' was built under R version 4.2.3
activos <- c("AAPL", "NVDA", "MSFT", "AMZN", "GOOGL", "SPY") # Apple, Nvidia, Microsoft, Amazon, Google, S&P 500 ETF
getSymbols(activos, src = "yahoo", from = "2020-01-01")
## [1] "AAPL" "NVDA" "MSFT" "AMZN" "GOOGL" "SPY"
# Extraer precios de cierre ajustado y combinar en un solo objeto xts
precios <- do.call(merge, lapply(activos, function(x) Ad(get(x))))
colnames(precios) <- activos
# Ver las primeras filas de los datos descargados
head(precios)
## AAPL NVDA MSFT AMZN GOOGL SPY
## 2020-01-02 72.71607 5.972162 153.3233 94.9005 68.10838 300.2915
## 2020-01-03 72.00913 5.876571 151.4141 93.7485 67.75208 298.0177
## 2020-01-06 72.58292 5.901215 151.8055 95.1440 69.55795 299.1547
## 2020-01-07 72.24154 5.972659 150.4214 95.3430 69.42359 298.3134
## 2020-01-08 73.40363 5.983861 152.8173 94.5985 69.91772 299.9034
## 2020-01-09 74.96281 6.049581 154.7265 95.0525 70.65173 301.9369
# Calcular retornos diarios porcentuales (rendimientos) a partir de precios ajustados
retornos <- na.omit(precios / lag(precios) - 1)
# Calcular medidas descriptivas para cada activo
medias <- apply(retornos, 2, mean)
medianas <- apply(retornos, 2, median)
vars <- apply(retornos, 2, var)
sds <- apply(retornos, 2, sd)
medias
## AAPL NVDA MSFT AMZN GOOGL SPY
## 0.0010500597 0.0027995971 0.0008746717 0.0008020260 0.0008435254 0.0005648554
medianas
## AAPL NVDA MSFT AMZN GOOGL SPY
## 0.0011723941 0.0032094965 0.0009582467 0.0007111003 0.0015368322 0.0009000738
sds # (La desviación estándar es la raíz cuadrada de la varianza)
## AAPL NVDA MSFT AMZN GOOGL SPY
## 0.01986875 0.03432835 0.01907799 0.02245878 0.02048273 0.01309886
# Calcular asimetría y curtosis de cada activo
skews <- apply(retornos, 2, PerformanceAnalytics::skewness)
curtosis <- apply(retornos, 2, PerformanceAnalytics::kurtosis)
skews
## AAPL NVDA MSFT AMZN GOOGL SPY
## 0.09063338 0.28412506 -0.02321513 0.06718075 -0.09316830 -0.53322098
curtosis
## AAPL NVDA MSFT AMZN GOOGL SPY
## 5.104889 4.021484 7.022117 3.935149 3.465041 11.363899
# Graficar precios ajustados de cada activo a lo largo del tiempo
# Opción 1: Usar chartSeries de quantmod para cada activo individualmente
chartSeries(AAPL$AAPL.Adjusted, name = "Precio AAPL", theme = chartTheme("white"))
# Graficar precios ajustados de cada activo a lo largo del tiempo
chartSeries(NVDA$NVDA.Adjusted, name = "Precio NVDA", theme = chartTheme("white"))
# Graficar precios ajustados de cada activo a lo largo del tiempo
chartSeries(MSFT$MSFT.Adjusted, name = "Precio MSFT", theme = chartTheme("white"))
# Graficar precios ajustados de cada activo a lo largo del tiempo
chartSeries(AMZN$AMZN.Adjusted, name = "Precio AMZN", theme = chartTheme("white"))
# Graficar precios ajustados de cada activo a lo largo del tiempo
chartSeries(GOOGL$GOOGL.Adjusted, name = "Precio GOOGL", theme = chartTheme("white"))
# Graficar precios ajustados de cada activo a lo largo del tiempo
chartSeries(SPY$SPY.Adjusted, name = "Precio SPY", theme = chartTheme("white"))
hist(retornos$AAPL, breaks = 30, main = "Histograma de retornos diarios AAPL",
xlab = "Retorno diario", col = "lightblue")
boxplot(coredata(retornos), names = colnames(retornos),
main = "Boxplot de retornos diarios (2020-2025)",
las = 2, cex.axis = 0.7) # Reduce tamaño de etiquetas
La curtosis mide qué tan pesadas son las colas de la distribución de los retornos. Según los resultados obtenidos, los activos con valores de curtosis más altos presentan colas más pesadas, lo que indica una mayor frecuencia de retornos extremos.
En este caso, observamos que [NVDA] muestran colas más pesadas, lo que sugiere mayor riesgo de eventos atípicos.
La asimetría indica si los retornos tienen una distribución equilibrada o si tienden a tener más valores extremos en un sentido particular.
Según los resultados, [activo con asimetría positiva] tiene más movimientos alcistas extremos, mientras que [activo con asimetría negativa] presenta mayores caídas abruptas.
Analizando la volatilidad móvil de 21 días, identificamos que los picos más altos ocurrieron en [fechas detectadas], coincidiendo con eventos como la crisis del COVID-19 en marzo de 2020.
El activo más volátil es [activo más volátil], mientras que el más estable es [activo más estable], lo que sugiere diferentes niveles de riesgo.
Los resultados de curtosis y los tests de normalidad indican que la mayoría de los activos no siguen una distribución normal, ya que presentan colas más pesadas y asimetrías significativas.
Este fenómeno es importante en gestión de riesgos, ya que los modelos tradicionales podrían subestimar la probabilidad de caídas severas. Considerar colas pesadas permite tomar mejores decisiones y diseñar estrategias más robustas.
# Cálculo de la media y desviación estándar por activo
media_retornos <- colMeans(retornos, na.rm = TRUE) # Media de retornos diarios
desv_est_retornos <- apply(retornos, 2, sd, na.rm = TRUE) # Desviación estándar
# Identificar activo con mayor media y mayor desviación estándar
activo_mayor_media <- names(which.max(media_retornos))
activo_mayor_desv <- names(which.max(desv_est_retornos))
# Mostrar los resultados en formato Markdown
cat("### Análisis de Retornos Diarios\n\n")
cat("**1. Activo con mayor media de retornos diarios:**", activo_mayor_media, "\n\n")
1. Activo con mayor media de retornos diarios: NVDA
cat("**2. Activo con mayor desviación estándar:**", activo_mayor_desv, "\n\n")
2. Activo con mayor desviación estándar: NVDA
cat("**Interpretación:** Un activo con una media alta sugiere un mejor rendimiento esperado, \n",
"mientras que una mayor desviación estándar indica mayor volatilidad y riesgo.\n\n")
Interpretación: Un activo con una media alta sugiere un mejor rendimiento esperado, mientras que una mayor desviación estándar indica mayor volatilidad y riesgo.
# Análisis de simetría y curtosis
library(moments)
##
## Attaching package: 'moments'
## The following objects are masked from 'package:PerformanceAnalytics':
##
## kurtosis, skewness
asimetria <- apply(retornos, 2, skewness, na.rm = TRUE) # Cálculo de asimetría
curtosis <- apply(retornos, 2, kurtosis, na.rm = TRUE) # Cálculo de curtosis
cat("**3. Asimetría y curtosis en los histogramas:**\n")
3. Asimetría y curtosis en los histogramas:
cat(" - Valores de asimetría: \n", asimetria, "\n")
cat(" - Valores de curtosis: \n", curtosis, "\n\n")
cat("Si la asimetría es distinta de 0, la distribución no es perfectamente simétrica. \n",
"Si la curtosis es alta, la distribución tiene colas más pesadas (eventos extremos más frecuentes).\n\n")
Si la asimetría es distinta de 0, la distribución no es perfectamente simétrica. Si la curtosis es alta, la distribución tiene colas más pesadas (eventos extremos más frecuentes).
# Análisis de mayor volatilidad en el boxplot
rango_intercuartilico <- apply(retornos, 2, IQR, na.rm = TRUE)
activo_mayor_volatilidad <- names(which.max(rango_intercuartilico))
cat("**4. Activo con mayor rango de volatilidad en el boxplot:**", activo_mayor_volatilidad, "\n\n")
4. Activo con mayor rango de volatilidad en el boxplot: NVDA
# Identificación de outliers en los retornos
outliers <- lapply(retornos, function(x) x[which(x < quantile(x, 0.25, na.rm = TRUE) - 1.5 * IQR(x, na.rm = TRUE) |
x > quantile(x, 0.75, na.rm = TRUE) + 1.5 * IQR(x, na.rm = TRUE))])
cat("**5. Outliers detectados en los retornos diarios:**\n")
5. Outliers detectados en los retornos diarios:
outliers_detectados <- sapply(outliers, length)
print(outliers_detectados)
AAPL NVDA MSFT AMZN GOOGL SPY 54 37 65 52 70 67
cat("\nLos outliers pueden corresponder a eventos de mercado extremos, como caídas abruptas o repuntes inusuales.\n")
Los outliers pueden corresponder a eventos de mercado extremos, como caídas abruptas o repuntes inusuales.
# Seleccionar los retornos de NVDA
asset <- retornos$NVDA
# Graficar la densidad de los retornos observados
plot(density(asset, na.rm = TRUE), main = "Densidad de Retornos Diarios NVDA",
xlab = "Retorno Diario", lwd = 2, col = "blue")
# Seleccionar los retornos de NVDA
asset <- retornos$NVDA
# Calcular media y desviación estándar
media_nvda <- mean(asset, na.rm = TRUE)
sd_nvda <- sd(asset, na.rm = TRUE)
# Primero, generar el gráfico vacío para evitar errores
plot.new()
# Graficar la densidad empírica de los retornos
plot(density(asset, na.rm = TRUE), main = "Densidad de Retornos Diarios NVDA",
xlab = "Retorno Diario", lwd = 2, col = "black")
# Superponer la curva normal teórica
curve(dnorm(x, mean = media_nvda, sd = sd_nvda), col = "red", lwd = 2, add = TRUE)
# Agregar la leyenda solo si el gráfico ya está generado
legend("topright", legend = c("Empírica", "Normal teórica"),
lwd = 2, col = c("black", "red"))
# Seleccionar los retornos de NVDA
asset <- retornos$NVDA
# Verificar que no haya valores NA para evitar errores
asset <- na.omit(asset)
# Gráfico Q-Q de los retornos de NVDA contra distribución normal
qqnorm(asset, main="Q-Q Plot de Retornos NVDA", col="blue", pch=16)
qqline(asset, col="red", lwd=2)
# Cargar la librería necesaria
library(zoo)
# Calcular la volatilidad móvil de 21 días para cada activo
vol_mov_21 <- rollapply(retornos, width = 21, FUN = sd, by.column = TRUE, align = "right", na.rm = TRUE)
# Graficar la volatilidad móvil para SPY y NVDA
plot(vol_mov_21$SPY, type = "l", col = "blue", ylim = c(0, max(vol_mov_21, na.rm = TRUE)),
main = "Volatilidad Móvil (21 días) - SPY vs NVDA", ylab = "Desviación Estándar (21 días)", xlab = "Fecha")
# Agregar la volatilidad de NVDA en la misma gráfica
lines(vol_mov_21$NVDA, col = "red")
# Agregar leyenda
legend("topleft", legend = c("SPY", "NVDA"), col = c("blue", "red"), lty = 1)
# Cargar la librería necesaria
library(moments)
# Calcular curtosis para cada activo
curtosis_activos <- apply(retornos, 2, kurtosis)
# Calcular asimetría para cada activo
asimetria_activos <- apply(retornos, 2, skewness)
# Mostrar los resultados en una tabla
curtosis_asimetria <- data.frame(Activo = colnames(retornos),
Curtosis = curtosis_activos,
Asimetría = asimetria_activos)
print(curtosis_asimetria)
## Activo Curtosis Asimetría
## AAPL AAPL 8.104889 0.09063338
## NVDA NVDA 7.021484 0.28412506
## MSFT MSFT 10.022117 -0.02321513
## AMZN AMZN 6.935149 0.06718075
## GOOGL GOOGL 6.465041 -0.09316830
## SPY SPY 14.363899 -0.53322098
La curtosis mide qué tan pesadas son las colas de la distribución de los retornos. Según los resultados obtenidos, los activos con valores de curtosis más altos presentan colas más pesadas, lo que indica una mayor frecuencia de retornos extremos.
En este caso, observamos que [mencionar activos con mayor curtosis] muestran colas más pesadas, lo que sugiere mayor riesgo de eventos atípicos.
La asimetría indica si los retornos tienen una distribución equilibrada o si tienden a tener más valores extremos en un sentido particular.
Según los resultados, [activo con asimetría positiva] tiene más movimientos alcistas extremos, mientras que [activo con asimetría negativa] presenta mayores caídas abruptas.
Analizando la volatilidad móvil de 21 días, identificamos que los picos más altos ocurrieron en [fechas detectadas], coincidiendo con eventos como la crisis del COVID-19 en marzo de 2020.
El activo más volátil es [activo más volátil], mientras que el más estable es [activo más estable], lo que sugiere diferentes niveles de riesgo.
Los resultados de curtosis y los tests de normalidad indican que la mayoría de los activos no siguen una distribución normal, ya que presentan colas más pesadas y asimetrías significativas.
Este fenómeno es importante en gestión de riesgos, ya que los modelos tradicionales podrían subestimar la probabilidad de caídas severas. Considerar colas pesadas permite tomar mejores decisiones y diseñar estrategias más robustas.
# Convertir xts de retornos a data frame
df_ret <- data.frame(fecha = index(retornos), coredata(retornos))
head(df_ret)
## fecha AAPL NVDA MSFT AMZN GOOGL
## 1 2020-01-03 -0.009721918 -0.016006107 -0.012451988 -0.012139035 -0.005231374
## 2 2020-01-06 0.007968210 0.004193503 0.002585086 0.014885574 0.026654092
## 3 2020-01-07 -0.004703273 0.012106747 -0.009117850 0.002091620 -0.001931535
## 4 2020-01-08 0.016086231 0.001875523 0.015928154 -0.007808640 0.007117652
## 5 2020-01-09 0.021241096 0.010982809 0.012492916 0.004799175 0.010498070
## 6 2020-01-10 0.002260643 0.005349223 -0.004626755 -0.009410597 0.006458532
## SPY
## 1 -0.007571987
## 2 0.003815187
## 3 -0.002812184
## 4 0.005329747
## 5 0.006780545
## 6 -0.002877641
# Regresión lineal de retornos de AAPL en función de SPY
modelo_AAPL_SPY <- lm(AAPL ~ SPY, data = df_ret)
summary(modelo_AAPL_SPY)
##
## Call:
## lm(formula = AAPL ~ SPY, data = df_ret)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.045983 -0.006704 -0.000111 0.006005 0.094938
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.0003803 0.0003416 1.113 0.266
## SPY 1.1857650 0.0260648 45.493 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01239 on 1317 degrees of freedom
## Multiple R-squared: 0.6111, Adjusted R-squared: 0.6108
## F-statistic: 2070 on 1 and 1317 DF, p-value: < 2.2e-16
El coeficiente de la pendiente en la regresión AAPL ~ SPY representa cuánto cambia el retorno de Apple en respuesta a un cambio del 1% en SPY.
Según nuestros resultados, la pendiente (beta) es β = [valor]. Esto significa que, si SPY sube un 1% en un día, esperaríamos que Apple suba aproximadamente [β]%, según el modelo.
Para determinar la significancia estadística del coeficiente de la pendiente, observamos su p-valor.
En este caso, el p-valor de la pendiente es [valor], por lo que [sí / no] es estadísticamente significativo.
En cuanto al intercepto, su p-valor es [valor], lo que indica que [sí / no] es estadísticamente significativo.
El R² de la regresión AAPL ~ SPY nos indica qué fracción de la variabilidad en los retornos de Apple puede explicarse por los movimientos del mercado (SPY).
En nuestro modelo, R² = [valor], lo que significa que aproximadamente el [porcentaje]% de la variabilidad de los retornos de Apple está explicada por el mercado.
Si este valor es cercano a 1, indica una relación fuerte entre Apple y el mercado; si está más cerca de 0, la relación es débil o moderada.
En este caso, consideramos que la relación es [fuerte / moderada / débil].
Para comparar la sensibilidad de diferentes acciones al mercado, analizamos sus betas individuales obtenidas al regresarlas contra SPY:
🔹 La acción con beta más alta es [mencionar acción], lo que indica que reacciona con más fuerza a los movimientos del mercado.
🔹 La acción con beta más baja es [mencionar acción], lo que implica que es menos sensible a los cambios del índice SPY.
En la regresión NVDA ~ AAPL, obtenemos un R² de [valor], que es [mayor / menor] que el R² obtenido al regredir NVDA y AAPL contra SPY.
Esto implica que la relación entre dos acciones individuales (Nvidia y Apple) es [más fuerte / más débil] en comparación con su relación con el mercado general.
Este resultado es importante porque nos ayuda a entender si las acciones tecnológicas se mueven de manera más sincronizada entre ellas o si siguen más de cerca el comportamiento del mercado en general.
colnames(df_ret) summary(df_ret) df_ret <- na.omit(df_ret) modelo_AAPL_SPY <- lm(AAPL ~ SPY, data = df_ret) summary(modelo_AAPL_SPY)
modelo_NVDA_AAPL <- lm(NVDA ~ AAPL, data = df_ret) summary(modelo_NVDA_AAPL)
# Autocorrelación de la serie de precios ajustados de Microsoft
acf(precios$MSFT, main="ACF Precios MSFT (nivel)")
# Autocorrelación de la serie de retornos diarios de Microsoft
acf(retornos$MSFT, main="ACF Retornos MSFT (diarios)")
# Cargar librería necesaria
library(tseries)
# Prueba ADF en precios de Amazon
adf_precios <- adf.test(precios$AMZN, k=1)
# Prueba ADF en retornos de Amazon
adf_retornos <- adf.test(retornos$AMZN, k=0)
## Warning in adf.test(retornos$AMZN, k = 0): p-value smaller than printed p-value
# Mostrar resultados
adf_precios
##
## Augmented Dickey-Fuller Test
##
## data: precios$AMZN
## Dickey-Fuller = -1.8488, Lag order = 1, p-value = 0.6423
## alternative hypothesis: stationary
adf_retornos
##
## Augmented Dickey-Fuller Test
##
## data: retornos$AMZN
## Dickey-Fuller = -37.46, Lag order = 0, p-value = 0.01
## alternative hypothesis: stationary
{r respuestas-seccion-4, echo=FALSE}
Durante el periodo 2020-2021, los precios de NVDA mostraron una tendencia alcista significativa, impulsada por el auge del sector tecnológico y la creciente demanda de semiconductores. Sin embargo, en 2022, la acción experimentó una corrección debido a factores como la inflación, el endurecimiento de la política monetaria y la desaceleración del sector tecnológico.
Los gráficos ACF de precios muestran una autocorrelación alta y persistente, lo que indica que los precios dependen fuertemente de sus valores pasados. En cambio, los retornos tienen muy poca autocorrelación, lo que sugiere que los cambios diarios en los precios no siguen un patrón predecible. Esto es consistente con la teoría de mercados eficientes, donde los precios reflejan rápidamente la información disponible.
Las pruebas ADF sugieren que los precios no son estacionarios, ya que no tienen una media y varianza constantes en el tiempo, sino que siguen un proceso de caminata aleatoria. Sin embargo, al diferenciar (tomar retornos), la serie se vuelve estacionaria. Esto significa que los retornos tienen una media cercana a cero y varianza constante, sin una tendencia marcada.
Si los retornos de un activo mostraran autocorrelación significativa en ciertos rezagos, esto indicaría que los retornos pasados pueden predecir los futuros en cierta medida. Esto podría sugerir ineficiencias en el mercado, donde los precios no reflejan toda la información disponible de manera instantánea, permitiendo potencialmente estrategias de trading basadas en patrones de retornos pasados.
Nota: Asegúrate de que estas referencias sean relevantes para tu trabajo. Si has utilizado otros artículos o materiales específicos, puedes reemplazar o agregar fuentes según sea necesario.