if("readxl" %in% rownames(installed.packages()) == FALSE) {install.packages("readxl",repos="http://cran.r-project.org")}
try(suppressPackageStartupMessages(library(readxl, quietly = TRUE,warn.conflicts = FALSE)),silent = TRUE)
if("tidyverse" %in% rownames(installed.packages()) == FALSE) {install.packages("tidyverse",repos="http://cran.r-project.org")}
try(suppressPackageStartupMessages(library(tidyverse, quietly = TRUE,warn.conflicts = FALSE)),silent = TRUE)
if("zoo" %in% rownames(installed.packages()) == FALSE) {install.packages("zoo",repos="http://cran.r-project.org")}
try(suppressPackageStartupMessages(library(zoo, quietly = TRUE,warn.conflicts = FALSE)),silent = TRUE)
path <- "C:/Users/00089452/OneDrive - NATURGY INFORMATICA S.A/JR One Drive/Maestría Finanzas/2022/Seminario Finanzas/Tarea 1/"
Precios <- read.csv(paste0(path,"Precios.csv"),header = T)
Precios$Date <- as.Date(Precios$Date, origin = "1899-12-30")
Precios_limpia <- Precios[complete.cases (Precios),]
reemplaza los NA con el promedio de los dos datos temporales adyacentes. Es decir, un NA deberá ser sustituido por el promedio del nivel del índice del día anterior y del día posterior.
Precios_limpia_2 <- Precios %>% mutate(EUR_limpio = na.approx(Precios$EUR),JPY_limpio = na.approx(Precios$JPY))
Precios_limpia_2 <- Precios_limpia_2 %>%select(c("Date","EUR_limpio","JPY_limpio"))
estadísticas descriptivas que consideres relevantes. Interpreta tus resultados.
summary (Precios_limpia [-1])
## 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
summary (Precios_limpia_2 [-1])
## EUR_limpio JPY_limpio
## Min. :0.8451 Min. :0.7637
## 1st Qu.:1.4383 1st Qu.:0.8886
## Median :1.5696 Median :0.9567
## Mean :1.5594 Mean :0.9958
## 3rd Qu.:1.8114 3rd Qu.:1.0446
## Max. :2.0828 Max. :1.3905
nrow(Precios_limpia)
## [1] 6055
nrow(Precios_limpia_2)
## [1] 7508
los resultados de aplicar la función summary() a tu matriz de rendimientos y grafica la serie tiempo de ambas divisas en gráficas separadas.
Log_ren<-diff(as.matrix(log(Precios_limpia_2[,c("EUR_limpio","JPY_limpio")])))
Date<-Precios_limpia_2$Date[2:nrow(Precios_limpia_2)]
summary(Log_ren)
## EUR_limpio JPY_limpio
## Min. :-3.825e-02 Min. :-3.708e-02
## 1st Qu.:-1.625e-03 1st Qu.:-1.840e-03
## Median : 0.000e+00 Median : 0.000e+00
## Mean : 5.988e-05 Mean :-2.890e-06
## 3rd Qu.: 1.878e-03 3rd Qu.: 1.661e-03
## Max. : 4.295e-02 Max. : 4.501e-02
plot(Date,Log_ren[,1],
main="EUR: Rendimientos diarios",col="red",
ylab="Log-rendimientos")
plot(Date,Log_ren[,2],
main="JPY: Rendimientos diarios",col="blue",
ylab="Log-rendimientos")
# # e) Repite el ejercicio del inciso d) pero utiliza la base de datos
Precios2.csv
path <- "C:/Users/00089452/OneDrive - NATURGY INFORMATICA S.A/JR One Drive/Maestría Finanzas/2022/Seminario Finanzas/Tarea 1/"
Precios2 <- read.csv(paste0(path,"Precios2.csv"),header = T)
Precios2$Date <- as.Date(Precios2$Date, origin = "1899-12-30")
Precios2_limpia <- Precios2[complete.cases (Precios2),]
Precios2_limpia_2 <- Precios2 %>% mutate(EUR2_limpio = na.approx(Precios2$EUR),JPY2_limpio = na.approx(Precios2$JPY))
Precios2_limpia_2 <- Precios2_limpia_2 %>%select(c("Date","EUR2_limpio","JPY2_limpio"))
Log_ren<-diff(as.matrix(log(Precios2_limpia_2[,c("EUR2_limpio","JPY2_limpio")])))
Date<-Precios2_limpia_2$Date[2:nrow(Precios2_limpia_2)]
summary(Log_ren)
## EUR2_limpio JPY2_limpio
## Min. :-3.694e-02 Min. :-4.485e-02
## 1st Qu.: 0.000e+00 1st Qu.: 0.000e+00
## Median : 0.000e+00 Median : 0.000e+00
## Mean : 6.009e-05 Mean :-2.690e-06
## 3rd Qu.: 0.000e+00 3rd Qu.: 0.000e+00
## Max. : 4.421e-02 Max. : 3.961e-02
plot(Date,Log_ren[,1],
main="EUR: Rendimientos diarios",col="red",
ylab="Log-rendimientos")
plot(Date,Log_ren[,2],
main="JPY: Rendimientos diarios",col="blue",
ylab="Log-rendimientos")
Utiliza la base de datos Precios.csv que limpiaste con la función complete.cases(), para calcular el sesgo y la curtosis de los precios del EUR y del JPY. En los incisos a y b sólo puedes utilizar las siguientes funciones predefinidas/paquetes en R: sum(), mean(), variance() y sd(). Nota: si no utilizas un loop, gracias a las ventajas vectoriales de R, la respuesta puede quedar en una línea de código. a) Calcula el sesgo, el cual está dado por la siguiente fórmula:
n <- nrow(Precios_limpia)
factor_1_sesgo <- n/((n-1)*(n-2))
factor_2_sesgo_EUR <- sum(((Precios_limpia$EUR - mean(Precios_limpia$EUR))/sd(Precios_limpia$EUR))**3)
sesgo_EUR <- factor_1_sesgo*factor_2_sesgo_EUR
factor_2_sesgo_JPY <- sum(((Precios_limpia$EUR - mean(Precios_limpia$JPY))/sd(Precios_limpia$JPY))**3)
sesgo_JPY <- factor_1_sesgo*factor_2_sesgo_JPY
print(paste("Sesgo del EUR:", sesgo_EUR))
## [1] "Sesgo del EUR: -0.700369334782409"
print(paste("Sesgo del JPY:", sesgo_JPY))
## [1] "Sesgo del JPY: 105.961704882466"
factor_1 <- n*(n+1)/((n-1)*(n-2)*(n-3))
factor_2_EUR <- sum(((Precios_limpia$EUR - mean(Precios_limpia$EUR))/sd(Precios_limpia$EUR))**4)
factor_3 <- (3*(n-1)**2)/((n-2)*(n-3))
curtosis_EUR <- 3+ factor_1*factor_2_EUR-factor_3
factor_2_JPY <- sum(((Precios_limpia$JPY - mean(Precios_limpia$JPY))/sd(Precios_limpia$JPY))**4)
curtosis_JPY <- 3+ factor_1*factor_2_JPY-factor_3
print(paste("Curtosis del EUR:", curtosis_EUR))
## [1] "Curtosis del EUR: 2.76897145139505"
print(paste("Curtosis del JPY:", curtosis_JPY))
## [1] "Curtosis del JPY: 3.48990540208824"
cuatro momentos de la distribución del EUR utilizando la base de datos limpiada con complete.cases().Hint: utiliza directamente la función skewness() y kurtosis() sin modificar sus argumentos.
if("moments" %in% rownames(installed.packages()) == FALSE) {install.packages("moments",repos="http://cran.r-project.org")}
try(suppressPackageStartupMessages(library(moments, quietly = TRUE,warn.conflicts = FALSE)),silent = TRUE)
sesgo_EUR_mom <- skewness(Precios_limpia$EUR)
sesgo_JPY_mom <- skewness(Precios_limpia$JPY)
curtosis_EUR_mom <- kurtosis(Precios_limpia$EUR)
curtosis_JPY_mom <- kurtosis(Precios_limpia$JPY)
#Falta print paste, promedio, desviación estandar, sesgo y kurtosis
Pregunta 3: funciones [30 pts] Utilizando el código de la pregunta 1 realiza una función que permita limpiar los NA de una base de datos. La función debe cumplir con las siguientes características: * El nombre de tu función deberá ser db.clean() y deberá tener 2 argumentos: Data_frame y tipo_limpieza. * a) La función debe permitirte elegir entre usar limpieza con complete.cases cuando tipo_limpieza=1 o rellenar con el promedio de las observaciones adyacentes cuando tipo_limpieza=2. * b) De ser necesario, deber llamar los paquetes correspondientes correspondientes. * c) Finalmente, debe mandar un mensaje de error si el insumo no es un data.frame. a) Programa la función y publica tu código.
db.clean <- function(Data_frame,tipo_limpieza){
library(tidyverse)
library(zoo)
if(class(Data_frame)=='data.frame'){
if(tipo_limpieza ==1){
Data_frame <- Data_frame[complete.cases(Data_frame),]
}else{
for (i in 2:ncol(Data_frame)){
col_aux <- paste(colnames(Data_frame)[i])
Data_frame[,col_aux] <- na.approx(Data_frame[,col_aux])
}
}
}else{
print("Error. El insumo no es un data.frame")
}
return(Data_frame)
}
prueba <- db.clean(Precios,2)
resultado de la función summary() evaluados en el output de tu función. Imprime los resultados.