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),]

# b) En aras de minimizar la pérdida de datos, vuelve a limpiar la base de datos original pero esta vez

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"))

# Compara las características de las bases de datos obtenidas en el inciso a) y b), publicando las

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

Interpretación

nrow(Precios_limpia)
## [1] 6055
nrow(Precios_limpia_2)
## [1] 7508

d) Calcula la serie de rendimientos logaríticos asociada a la base de datos obtenida en el inciso b). Publica

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")

Pregunta 2: programación vectorial [30 pts]

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"
  1. Calcula la curtosis e imprime tus resultados. Utiliza la siguiente fórmula:
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"

Instala el paquete moments y, utilizando las funciones provistas por este y por R, estima los primeros

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)

# Evalúa las bases de datos Precios.csv y Precios2.csv. Para mostrar su desempeño, imprime los

resultado de la función summary() evaluados en el output de tu función. Imprime los resultados.