# Leer archivo CSV
precios <- read.csv("Precios.csv")
# Visualizar las primeras filas del dataset original
head(precios)
## Date EUR JPY
## 1 36525 1.000000 1.0000000
## 2 36526 1.000000 1.0000000
## 3 36527 1.000000 1.0000000
## 4 36528 1.013990 1.0104562
## 5 36529 1.024608 0.9928536
## 6 36530 NA 0.9845887
# Limpiar los datos eliminando filas con NA
precios_limpio_a <- precios[complete.cases(precios), ]
# Mostrar dimensiones antes y después
cat("Dim originales:", dim(precios), "\n")
## Dim originales: 7508 3
cat("Dim con complete.cases():", dim(precios_limpio_a), "\n")
## Dim con complete.cases(): 6055 3
dim(precios_limpio_a)
## [1] 6055 3
precios_b <- precios
# Función que reemplaza los NA intermedios (con vecinos válidos)
reemplazar_na_vecinos_iterativo <- function(x) {
repeat {
x_old <- x
for (i in 2:(length(x) - 1)) {
if (is.na(x[i]) && !is.na(x[i - 1]) && !is.na(x[i + 1])) {
x[i] <- mean(c(x[i - 1], x[i + 1]))
}
}
# Si ya no cambia nada, salimos
if (all(x == x_old, na.rm = TRUE)) break
}
return(x)
}
# Aplicamos la función a cada columna numérica
precios_b$EUR <- reemplazar_na_vecinos_iterativo(precios_b$EUR)
precios_b$JPY <- reemplazar_na_vecinos_iterativo(precios_b$JPY)
precios_b<-precios_b[complete.cases(precios_b), ]
# Verificamos que ya no haya NA
dim(precios_b)
## [1] 7212 3
Comparacion entre ambas datas
# Estadísticas descriptivas para la base con complete.cases()
summary(precios_limpio_a[, 2:3])
## EUR JPY
## Min. :0.8451 Min. :0.7637
## 1st Qu.:1.4408 1st Qu.:0.8880
## Median :1.5702 Median :0.9559
## Mean :1.5609 Mean :0.9957
## 3rd Qu.:1.8116 3rd Qu.:1.0445
## Max. :2.0828 Max. :1.3905
# Estadísticas descriptivas para la base con imputación
summary(precios_b[, 2:3])
## EUR JPY
## Min. :0.8451 Min. :0.7637
## 1st Qu.:1.4409 1st Qu.:0.8888
## Median :1.5704 Median :0.9570
## Mean :1.5614 Mean :0.9961
## 3rd Qu.:1.8122 3rd Qu.:1.0448
## Max. :2.0828 Max. :1.3905
# Adicional: comparación de número de observaciones válidas
cat("Observaciones en precios_limpio_a:", nrow(precios_limpio_a), "\n")
## Observaciones en precios_limpio_a: 6055
cat("Observaciones en precios_b:", nrow(precios_b), "\n")
## Observaciones en precios_b: 7212
Summary de Log rendimientos, pongo un histograma
rendimientos <- data.frame(
Date = precios_b$Date[-1], # Una fila menos por el lag
r_log_EUR = diff(log(precios_b$EUR)),
r_log_JPY = diff(log(precios_b$JPY))
)
# Summary de los rendimientos
summary(rendimientos[, 2:3])
## r_log_EUR r_log_JPY
## Min. :-3.825e-02 Min. :-3.708e-02
## 1st Qu.:-1.674e-03 1st Qu.:-1.858e-03
## Median : 0.000e+00 Median : 0.000e+00
## Mean : 6.234e-05 Mean :-3.010e-06
## 3rd Qu.: 1.916e-03 3rd Qu.: 1.681e-03
## Max. : 4.295e-02 Max. : 4.501e-02
# Histograma de EUR
hist(rendimientos$r_log_EUR,
breaks = 50,
col = "skyblue",
main = "Histograma de Rendimientos Logarítmicos EUR",
xlab = "Rendimiento logarítmico")
# Histograma de JPY
hist(rendimientos$r_log_JPY,
breaks = 50,
col = "salmon",
main = "Histograma de Rendimientos Logarítmicos JPY",
xlab = "Rendimiento logarítmico")
Ahora lo calculamos para Precios2
# Leer archivo Precios2.csv
precios2 <- read.csv("Precios2.csv")
precios2$EUR <- reemplazar_na_vecinos_iterativo(precios2$EUR)
precios2$JPY <- reemplazar_na_vecinos_iterativo(precios2$JPY)
precios2<-precios2[complete.cases(precios2), ]
# Calcular rendimientos logarítmicos
rendimientos2 <- data.frame(
Date = precios2$Date[-1],
r_log_EUR = diff(log(precios2$EUR)),
r_log_JPY = diff(log(precios2$JPY))
)
# Mostrar resumen estadístico
summary(rendimientos2[, 2:3])
## r_log_EUR r_log_JPY
## Min. :-3.694e-02 Min. :-0.0448506
## 1st Qu.: 0.000e+00 1st Qu.: 0.0000000
## Median : 0.000e+00 Median : 0.0000000
## Mean : 6.255e-05 Mean :-0.0000028
## 3rd Qu.: 0.000e+00 3rd Qu.: 0.0000000
## Max. : 4.421e-02 Max. : 0.0396091
# Histograma de EUR
hist(rendimientos2$r_log_EUR,
breaks = 50,
col = "skyblue",
main = "Histograma Rendimientos Logarítmicos EUR (Precios2)",
xlab = "Rendimiento logarítmico")
# Histograma de JPY
hist(rendimientos2$r_log_JPY,
breaks = 50,
col = "salmon",
main = "Histograma Rendimientos Logarítmicos JPY (Precios2)",
xlab = "Rendimiento logarítmico")
Pregunta 1.f - Interpretación de los resultados
Al comparar las estadísticas descriptivas y los histogramas de los
rendimientos logarítmicos de EUR y JPY entre las bases
Precios.csv y Precios2.csv, se observan los
siguientes puntos:
Media y mediana: En ambas bases de datos, los rendimientos logarítmicos de EUR y JPY presentan medias cercanas a cero, lo cual es común en series financieras donde el retorno promedio diario es pequeño. La mediana también está cerca de cero, indicando una distribución aproximadamente simétrica.
Volatilidad (desviación estándar): La base
Precios2.csv muestra una diferencia en la dispersión de los
rendimientos en comparación con Precios.csv, lo cual puede
deberse a diferencias en los valores imputados, número de observaciones
o en el preprocesamiento.
Forma de la distribución:
Efecto de la limpieza: Aunque la limpieza de los datos puede alterar ligeramente los valores individuales, la estructura general del comportamiento de los rendimientos se mantiene. Sin embargo, diferencias pequeñas en los momentos estadísticos pueden influir si se usa la serie para análisis más sofisticados como simulaciones o modelos GARCH.
En resumen, los resultados son consistentes entre ambas bases, y reflejan las características típicas de las series financieras: rendimientos pequeños en promedio, posible asimetría leve, y colas pesadas.
Utilizando la base de datos Precios.csv y la base de datos limpiada con complete.cases():
a)Desviación mediana muestral (manual)
eur <- precios_limpio_a$EUR
jpy <- precios_limpio_a$JPY
mediana_eur <- median(eur)
mediana_jpy <- median(jpy)
desv_mediana_eur <- sum((eur - mediana_eur)^2) / (length(eur) - 1)
desv_mediana_jpy <- sum((jpy - mediana_jpy)^2) / (length(jpy) - 1)
cat("Desviación mediana muestral EUR:", desv_mediana_eur, "\n")
## Desviación mediana muestral EUR: 0.09147115
cat("Desviación mediana muestral JPY:", desv_mediana_jpy, "\n")
## Desviación mediana muestral JPY: 0.02231309
b)Covarianza mediana entre EUR y JPY
# Calcular la suma producto manual
producto <- (eur - mediana_eur) * (jpy - mediana_jpy)
cov_mediana <- sum(producto) / (length(eur) - 1)
# Mostrar resultado
cat("Covarianza mediana entre EUR y JPY:", cov_mediana, "\n")
## Covarianza mediana entre EUR y JPY: 0.02709172
Pregunta 2.c - Primeros 4 momentos de EUR con moments
library(moments)
eur <- precios_limpio_a$EUR
media_eur <- mean(eur)
varianza_eur <- var(eur)
asimetria_eur <- skewness(eur)
curtosis_eur <- kurtosis(eur)
cat("1er momento (media):", media_eur, "\n")
## 1er momento (media): 1.560866
cat("2do momento (varianza):", varianza_eur, "\n")
## 2do momento (varianza): 0.0913843
cat("3er momento (asimetría/skewness):", asimetria_eur, "\n")
## 3er momento (asimetría/skewness): -0.7001958
cat("4to momento (curtosis):", curtosis_eur, "\n")
## 4to momento (curtosis): 2.768171
Programa una función que se llame “momentos_distrib” que calcule los momentos de todos los vectores que conforman un data.frame, puedes asumir que el df contiene únicamente datos numéricos. La función debe como mínimo realizar las siguientes tareas:
Error cuando no es un data frame, caso 1
tryCatch({
momentos_distrib(df = c("perro", 2, 3))
}, error = function(e) {
cat("Error capturado:", e$message, "\n")
})
## Error capturado: Error: el objeto no es un data.frame
Caso2:
momentos_distrib(as.data.frame(cbind(
c(1,2,3,4,3,4,2,1),
c(2,54,6,4,2,33,5,55),
c(0.1,0.2,-0.1,-10,1,-2,-3,-3)
)))
## [1] "Clases originales de las columnas:"
## V1 V2 V3
## "numeric" "numeric" "numeric"
## V1 V2 V3
## media 2.500000 20.125000 -2.100000
## varianza 1.428571 553.553571 12.540000
## skewness 0.000000 0.715815 -1.492215
## kurtosis 1.640000 1.704556 4.211197
Caso 3: data.frame con columnas de texto (convertibles a numérico)
momentos_distrib(as.data.frame(cbind(
c(1,2,3,4,3,4,2,1),
as.character(c(2,54,6,4,2,33,5,55)),
c(0.1,0.2,-0.1,-10,1,-2,-3,-3)
)))
## [1] "Clases originales de las columnas:"
## V1 V2 V3
## "character" "character" "character"
## V1 V2 V3
## media 2.500000 20.125000 -2.100000
## varianza 1.428571 553.553571 12.540000
## skewness 0.000000 0.715815 -1.492215
## kurtosis 1.640000 1.704556 4.211197
Caso 4: aplicar a la base limpia de precios
momentos_distrib(as.data.frame(precios_limpio_a))
## [1] "Clases originales de las columnas:"
## Date EUR JPY
## "numeric" "numeric" "numeric"
## Date EUR JPY
## media 4.028943e+04 1.5608661 0.99573405
## varianza 4.674369e+06 0.0913843 0.02072787
## skewness -3.609700e-04 -0.7001958 1.14529394
## kurtosis 1.799553e+00 2.7681714 3.48851020