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("lubridate" %in% rownames(installed.packages()) == FALSE) {install.packages("lubridate",repos="http://cran.r-project.org")}
try(suppressPackageStartupMessages(library(lubridate, quietly = TRUE,warn.conflicts = FALSE)),silent = TRUE)
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)

#a. Genera una matriz con las siguientes cuatro columnas: fechas (en humano, no en números de R), rendimiento total bonos, rendimiento total acciones y el tipo de cambio. Nota: las dimensiones de ambas bases difieren, pero puedes rellenar con NA los datos faltantes. Para mostrar tus resultados aplica la función de R head y tail a la matriz que construiste.

path <- "C:/Users/00089452/OneDrive - NATURGY INFORMATICA S.A/JR One Drive/Maestría Finanzas/2022/Seminario Finanzas/Tarea 5/"
Fechas_reales <- read_excel(paste0(path, "ie_data_.xls"), sheet ="Data",range = "A8:A1827")

num_char <- nchar(Fechas_reales$Date)
year <- substr(Fechas_reales$Date,1,4)
month <- ifelse(num_char ==7,substr(Fechas_reales$Date,6,7),10)

Fechas_formato <- as.data.frame(floor_date(ISOdate(year,month,1),"month"))

Data_acciones <- as.data.frame(read_excel(paste0(path, "ie_data_.xls"), sheet ="Data",range = "J8:J1827"))

Data_bonos <- as.data.frame(read_excel(paste0(path, "ie_data_.xls"), sheet ="Data",range = "S8:S1827"))

USDMXN <- as.data.frame(read_excel(paste0(path, "USDMXN_.xlsx"), sheet ="Hoja1",range = "A6:B625"))

USDMXN$Fecha <- floor_date(USDMXN$Fecha,"month")

Data_TR <- cbind(Fechas_formato,Data_acciones,Data_bonos)

colnames(Data_TR) <- c("Fecha","Acciones","Bonos")
Data_A <- full_join(Data_TR,USDMXN, by= "Fecha")
head(Data_A)
##        Fecha Acciones     Bonos USDMXN
## 1 1871-01-01 104.9744 1.0000000     NA
## 2 1871-02-01 103.7377 0.9744237     NA
## 3 1871-03-01 105.2139 0.9642090     NA
## 4 1871-04-01 112.7920 1.0049190     NA
## 5 1871-05-01 118.8643 1.0325911     NA
## 6 1871-06-01 120.2812 1.0532486     NA
tail(Data_A)
##           Fecha Acciones    Bonos  USDMXN
## 1814 2022-02-01  2956584 48.72793 20.4692
## 1815 2022-03-01  2891616 47.30423 19.8699
## 1816 2022-04-01  2879003 44.59620 20.4280
## 1817 2022-05-01  2623464 43.64141 19.6571
## 1818 2022-06-01  2521361 42.62300 20.1183
## 1819 2022-07-01  2470974 43.57138 20.3672

#b. Calcula la distribución de rendimientos observada con datos mensuales, trimestrales, semestrales y anuales (“non-overlapping”); utilizando toda la muestra y publica una tabla con los momentos y el número de datos para el S&P 500 y la nota de 10 años del Tesoro de E.E.U.U.

#Rendimientos mensuales
rend_men <- data.frame(Data_A[-1,1],Data_A[-1,-1]/Data_A[-nrow(Data_A),-1]-1)
#Rendimientos trimestrales
aux_tri <- c(rep(c(1,0,0),nrow(Data_A)/3),1)
#Rendimientos semestrales
aux_sem <-c(rep(c(1,0,0,0,0,0),nrow(Data_A)/6),1)
# Rendimientos anuales
aux_anual <-c(rep(c(1,0,0,0,0,0,0,0,0,0,0,0),nrow(Data_A)/12),1)

Data_tri <- Data_A[which(aux_tri==1),]
rend_tri <- data.frame(Data_tri[-1,1],Data_tri[-1,-1]/Data_tri[-nrow(Data_tri),-1]-1)

Data_sem <- Data_A[which(aux_sem==1),]
rend_sem <- data.frame(Data_sem[-1,1],Data_sem[-1,-1]/Data_sem[-nrow(Data_sem),-1]-1)

Data_anual <- Data_A[which(aux_anual==1),]
rend_anual <- data.frame(Data_anual[-1,1],Data_anual[-1,-1]/Data_anual[-nrow(Data_anual),-1]-1)

mean_men <- apply(rend_men[c(2,3)],2,mean)
sd_men <- apply(rend_men[c(2,3)],2,sd)
bias_men <- apply(rend_men[c(2,3)],2,skewness)
kurtosis_men <- apply(rend_men[c(2,3)],2,kurtosis)

mean_tri <- apply(rend_tri[c(2,3)],2,mean)
sd_tri <- apply(rend_tri[c(2,3)],2,sd)
bias_tri <- apply(rend_tri[c(2,3)],2,skewness)
kurtosis_tri <- apply(rend_tri[c(2,3)],2,kurtosis)

mean_sem <- apply(rend_sem[c(2,3)],2,mean)
sd_sem <- apply(rend_sem[c(2,3)],2,sd)
bias_sem <- apply(rend_sem[c(2,3)],2,skewness)
kurtosis_sem <- apply(rend_sem[c(2,3)],2,kurtosis)

mean_anual <- apply(rend_anual[c(2,3)],2,mean)
sd_anual <- apply(rend_anual[c(2,3)],2,sd)
bias_anual <- apply(rend_anual[c(2,3)],2,skewness)
kurtosis_anual <- apply(rend_anual[c(2,3)],2,kurtosis)

dimension <- data.frame(matrix(ncol=ncol(rend_men)-1,nrow = 0))
dimension_df <- data.frame(matrix(ncol = 2, nrow = 0))


men_df <- t(data.frame(mean_men,sd_men,bias_men,kurtosis_men))
row.names(men_df) <- c("Media Mensual","Desviación Estándar Mensual", "Sesgo Mensual","Curtosis Mensual")

tri_df <- t(data.frame(mean_tri,sd_tri,bias_tri,kurtosis_tri))
row.names(tri_df) <- c("Media Trimestral","Desviación Estándar Trimestral", "Sesgo Trimestral","Curtosis Trimestral")

sem_df <- t(data.frame(mean_sem,sd_sem,bias_sem,kurtosis_sem))
row.names(sem_df) <- c("Media Semestral","Desviación Estándar Semestral", "Sesgo Semestral","Curtosis Semestral")

anual_df <- t(data.frame(mean_anual,sd_anual,bias_anual,kurtosis_anual))
row.names(anual_df) <- c("Media Anual","Desviación Estándar Anual", "Sesgo Anual","Curtosis Anual")

mom_df <- rbind(men_df,tri_df,sem_df,anual_df)
#return(mom_df)
mom_df
##                                    Acciones       Bonos
## Media Mensual                   0.006382513 0.002216161
## Desviación Estándar Mensual     0.040918181 0.016657876
## Sesgo Mensual                   0.574044341 0.397768632
## Curtosis Mensual               21.097760672 7.287790268
## Media Trimestral                0.019963239 0.006838941
## Desviación Estándar Trimestral  0.081336257 0.034743604
## Sesgo Trimestral                0.538616917 0.668884393
## Curtosis Trimestral             8.511390124 6.123885907
## Media Semestral                 0.041051086 0.014088316
## Desviación Estándar Semestral   0.122383842 0.056580401
## Sesgo Semestral                 0.207130083 0.498562991
## Curtosis Semestral              5.194538056 4.746396117
## Media Anual                     0.085727417 0.029975384
## Desviación Estándar Anual       0.178103239 0.089011390
## Sesgo Anual                    -0.118983888 0.533212855
## Curtosis Anual                  2.991107339 3.988745640
  1. Calcular correlación entre ambos activos para cada distribución de rendimientos, publica los resultados e interpreta.
Corr_men <- cor(rend_men[,-1])
Corr_men
##           Acciones     Bonos USDMXN
## Acciones 1.0000000 0.1288503     NA
## Bonos    0.1288503 1.0000000     NA
## USDMXN          NA        NA      1
  1. Ahora, calcula la distribución de rendimientos mensuales, trimestrales, semestrales y anuales de ambos activos; a partir de la distribución con información mensual. Usa el kernel epanechnikov, asume rendimientos i.i.d y obtén por lo menos 10,000 simulaciones para cada distribución. Publica una tabla con los momentos y el número de datos para el S&P y el UST de 10 años. Nota: ambos activos deben ser simulados de manera independiente (i.e. no hagas simulaciones multi variadas).
#Distribuciones

densities_men <- apply(rend_men[,c(2,3)],2, function (x)density(x, kernel= 'epanechnikov' ))
#seleccioné columnas por los #NA de USDMXN

n_sim <- 10000

#Acciones

rend_men_acc_sim <- sample(x=densities_men$Acciones$x,prob= densities_men$Acciones$y,size =n_sim, replace = T)

rend_men_acc_sim_aux <- matrix(sample(x=densities_men$Acciones$x,prob= densities_men$Acciones$y,size =n_sim*3, replace = T)+1,nrow=3,ncol=n_sim)

rend_tri_acc_sim <- apply(rend_men_acc_sim_aux,2,prod)-1

#Bonos

rend_men_bon_sim <- sample(x=densities_men$Bonos$x,prob= densities_men$Bonos$y,size =n_sim, replace = T)

rend_men_bon_sim_aux <- matrix(sample(x=densities_men$Bonos$x,prob= densities_men$Bonos$y,size =n_sim*3, replace = T)+1,nrow=3,ncol=n_sim)

rend_tri_bon_sim <- apply(rend_men_bon_sim_aux,2,prod)-1

#Data Frame
rend_sim_acc <- cbind(rend_men_acc_sim,rend_tri_acc_sim)

rend_sim_bon <- cbind(rend_men_bon_sim,rend_tri_bon_sim)

densities_sim <- apply(rend_sim_acc,2, function (x)density(x, kernel= 'epanechnikov' ))

mean_rend_sim_acc <- apply(rend_sim_acc,2,mean)
sd_rend_sim_acc <- apply(rend_sim_acc,2,sd)
bias_rend_sim_acc <- apply(rend_sim_acc,2,skewness)
kurtosis_rend_sim_acc <- apply(rend_sim_acc,2,kurtosis)

sim_df <- t(data.frame(mean_rend_sim_acc,sd_rend_sim_acc,bias_rend_sim_acc,kurtosis_rend_sim_acc))
row.names(sim_df) <- c("Media","Desviación Estándar", "Sesgo","Curtosis")
colnames(sim_df) <- c("Rendimiento Mensual","Rendimiento Trimestral")
sim_df
##                     Rendimiento Mensual Rendimiento Trimestral
## Media                        0.00656119             0.01911857
## Desviación Estándar          0.04150044             0.07354787
## Sesgo                        0.73124645             0.47361612
## Curtosis                    23.49083247             9.60983083
  1. Calcula la correlación entre ambos activos para cada distrib., publicar resultados e interpretar.
Corr_acc_bon <- cor(rend_sim_acc,rend_sim_bon)
row.names(Corr_acc_bon) <- c("Rendimiento Mensual Acción","Rendimiento Trimestral Acción")
colnames(Corr_acc_bon) <- c("Rendimiento Mensual Bono","Rendimiento Trimestral Bono")
Corr_acc_bon
##                               Rendimiento Mensual Bono
## Rendimiento Mensual Acción                 0.006079419
## Rendimiento Trimestral Acción              0.006097127
##                               Rendimiento Trimestral Bono
## Rendimiento Mensual Acción                    -0.02035987
## Rendimiento Trimestral Acción                  0.01937818
  1. Compara con una gráfica la distribión simulada con la empírica del S&P 500. Nota: uno por frecuencia, puedes estimar un kernel epanechnikov en ambos grupos de información.
#Data Frame rendimientos mensuales acciones
Rend_men_acc_obs <- data.frame (densities_men$Acciones$x,densities_men$Acciones$y,rep("obs",length(densities_men$Acciones$x)))

colnames(Rend_men_acc_obs) <- c("x","y","classifier")


Rend_men_acc_sim <- data.frame(densities_sim$rend_men_acc_sim$x,densities_sim$rend_men_acc_sim$y,rep("sim",length(densities_sim$rend_men_acc_sim$x)))

colnames(Rend_men_acc_sim) <- c("x","y","classifier")
Rend_men_acc <- rbind(Rend_men_acc_obs,Rend_men_acc_sim)

ggplot(Rend_men_acc, aes(x=x, y= y, color = classifier))+geom_line() + ggtitle ("Rendimientos mensuales acciones")

  1. Compara con una gráfica la distribución simulada con la empírica del UST de 10 años. Nota: uno por frecuencia, puedes estimar un kernel epanechnikov en ambos grupos de información.
  2. Interpreta tus resultados. Nota: una respuesta satisfactoria debe comparar la información obtenida de los datos respecto a la de las simulaciones utilizando los incisos b, c con d, e) y las gráficas.
Rend_men_bon_obs <- data.frame (densities_men$Bonos$x,densities_men$Bonos$y,rep("obs",length(densities_men$Bonos$x)))

colnames(Rend_men_bon_obs) <- c("x","y","classifier")


Rend_men_bon_sim <- data.frame(densities_sim$rend_men_bon_sim$x,densities_sim$rend_men_bon_sim$y,rep("sim",length(densities_sim$rend_men_bon_sim$x)))

colnames(Rend_men_bon_sim) <- c("x")

Rend_men_bon <- rbind(Rend_men_bon_obs,Rend_men_bon_sim)

ggplot(Rend_men_bon, aes(x=x, y= y, color = classifier))+geom_line() + ggtitle ("Rendimientos mensuales bonos")

  1. Interpreta tus resultados. Nota: una respuesta satisfactoria debe comparar la información obtenida de los datos respecto a la de las simulaciones utilizando los incisos b, c con d, e) y las gráficas.
Comp_plot <-rbind(Rend_men_acc,Rend_men_bon)
  
ggplot(Comp_plot, aes(x=x, y= y, color = classifier))+geom_line() + ggtitle ("Rendimientos mensuales comparados")

Sección 2 Ergodicidad, estacionariedad y bootstrap

  1. Repetir b. de la sección anterior pero con datos de 1871 a 1971 y de 1971 a la fecha.
Data_TR_1 <- Data_TR[which(Data_TR$Fecha<as.Date("1971-01-01")),]
## Warning in base::check_tzones(e1, e2): 'tzone' attributes are inconsistent
Data_TR_2 <- Data_TR[which(Data_TR$Fecha>=as.Date("1971-01-01")),]
## Warning in base::check_tzones(e1, e2): 'tzone' attributes are inconsistent
  1. Compara tus resultados. Nota: una respuesta satisfactoria debe comparar los cambios en la distribución de rendimientos de cada activo en ambos períodos.

  2. Ahora estima la distribución de rendimientos de 1871-2010 del S&P 500 y simula, de acuerdo con esos datos, la distribución terminal del S&P 500 a la fecha. Puedes asumir que el índice empieza en 1 en tu última fecha con datos. Grafica la distribución terminal.

rend_men_c <- rend_men[which(Data_TR$Fecha<as.Date("2011-01-01")),]
## Warning in base::check_tzones(e1, e2): 'tzone' attributes are inconsistent
#Densidades
densities_men_c <- apply(rend_men_c[,c(2,3)],2, function (x)density(x, kernel= 'epanechnikov' ))
#seleccioné columnas por los #NA de USDMXN

n_sim <- 10000

rend_men_acc_sim_aux_c <- matrix(sample(x=densities_men_c$Acciones$x,prob= densities_men_c$Acciones$y,size =n_sim*139, replace = T)+1,nrow=139,ncol=n_sim)

rend_fin_acc_sim <- apply(rend_men_acc_sim_aux_c,2,prod)

#Data Frame

dens_final <- density((rend_fin_acc_sim-1),kernel= 'epanechnikov')

dens_final_df <- data.frame(dens_final$x,dens_final$y)

colnames(dens_final_df) <-  c("x","y")

ggplot(dens_final_df,aes(x=x, y=y))+geom_line()

  1. Ahora calcula el valor realizado (rendimiento bruto del S&P 500 desde tu último dato a la fecha más reciente) y la media, mediana y los percentiles 90,95,99 de la distribución simulada. Grafica nuevamente la distribución terminal y los niveles solicitados con una línea vertical (hint: función de R abline()).
Acc_2010 <- Data_TR[which(Data_TR$Fecha== as.Date("2010-12-01")),2]
## Warning in base::check_tzones(e1, e2): 'tzone' attributes are inconsistent
Acc_last <- Data_TR[nrow(Data_TR),2]

Rend_realizado <- Acc_last/Acc_2010 -1

Median <- median((rend_fin_acc_sim-1))

Percentil_90 <- quantile((rend_fin_acc_sim-1),.9)

Percentil_95 <- quantile((rend_fin_acc_sim-1),.95)

Percentil_99 <- quantile((rend_fin_acc_sim-1),.99)

ggplot(dens_final_df,aes(x=x, y=y))+geom_line()+geom_vline(xintercept = Median, color = 'red')+ geom_vline(xintercept = Percentil_90, color = 'blue') +geom_vline(xintercept = Percentil_95, color = 'green')+geom_vline(xintercept = Percentil_99, color = 'orange')

  1. ¿Qué sugiere lo anterior sobre el supuesto de ergodicidad y estacionariedad hacia adelante?

No cumple el supuesto de ergodicidad al no coincidir promedio estadístico y promedio temporal.