Gráficos de letras del Tesoro
# Read the Excel file into a variable named datos
datos <- read.xlsx("datos.xlsx")
datos$Tiempo=as.factor(datos$Tiempo)
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
datos_long <- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")grafico1 <-ggplot(datos_long[datos_long$Periodo %in% c("3_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line() +
labs(title = "3 meses",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")grafico2 <-ggplot(datos_long[datos_long$Periodo %in% c("6_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color = "blue") +
labs(title = "6 meses",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")grafico3 <-ggplot(datos_long[datos_long$Periodo %in% c("9_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color = "green") +
labs(title = "9 meses",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")grafico4 <-ggplot(datos_long[datos_long$Periodo %in% c("12_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color = "orange") +
labs(title = "12 meses",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")# Juntar los gráficos
library(gridExtra)
grid.arrange(top = "Retornos de Letras del tesoro 2000-2024",grafico1, grafico2, grafico3, grafico4, ncol = 2)Gráficos de bonos del Estado
grafico5<-ggplot(datos_long[datos_long$Periodo %in% c("3_años"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line() +
labs(title = "3 años",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal()+
theme(legend.position = "none")grafico6<-ggplot(datos_long[datos_long$Periodo %in% c("5_años"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color="blue") +
labs(title = "5 años",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal()+
theme(legend.position = "none")# Juntar los gráficos
library(gridExtra)
grid.arrange(top = "Retornos de Bonos del Estado 2000-2024",grafico5, grafico6, ncol = 2)Gráficos de obligaciones del Estado
grafico7<-ggplot(datos_long[datos_long$Periodo %in% c("10_años"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line() +
labs(title = "10 años",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal()+
theme(legend.position = "none")grafico8<-ggplot(datos_long[datos_long$Periodo %in% c("15_años"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color="blue") +
labs(title = "15 años",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal()+
theme(legend.position = "none")grafico9<-ggplot(datos_long[datos_long$Periodo %in% c("30-50_años"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color="green") +
labs(title = "30-50 años",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal()+
theme(legend.position = "none")# Juntar los gráficos
library(gridExtra)
grid.arrange(top = "Retornos de Obligaciones del estado 2000-2024",grafico7, grafico8,grafico9, ncol = 3)Cálculo de nulos y graficos a 3 meses
datos <- read.xlsx("datos.xlsx")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "3_meses" , ]
datos <- datos[94:nrow(datos), ]
nulos<-sum(is.na(datos));nulos## [1] 1
total<-nrow(datos)
porcentaje<-nulos/total;porcentaje## [1] 0.005376344
GRÁFICO ORIGINAL
# Read the Excel file into a variable named datos
datos <- read.xlsx("datos.xlsx")
datos$Tiempo=as.factor(datos$Tiempo)
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
datos_long_completa <- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")grafico1 <-ggplot(datos_long_completa[datos_long_completa$Periodo %in% c("3_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line() +
labs(title = "Serie inicial",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")GRÁFICO NUEVO
datos_c=read.csv2("Datos_csv.csv", header = TRUE)
datos_c$Tiempo=as.factor(datos_c$Tiempo)
datos_c$Tiempo <- as.Date(paste0(datos_c$Tiempo, "_01"), format = "%B_%Y_%d")
datos_long <- pivot_longer(datos_c, -Tiempo, names_to = "Periodo", values_to = "Valor")
#View(datos_long)
datos_long <- datos_long[838:nrow(datos_long), ]
#View(datos_long)grafico1_c<-ggplot(datos_long[datos_long$Periodo %in% c("X3_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color="blue") +
labs(title = "Serie final",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")UNIÓN DE LOS DOS GRAFICOS
# Juntar los gráficos
library(gridExtra)
library(grid)
citation("ForecastComb")##
## To cite package 'ForecastComb' in publications use:
##
## Weiss CE, Roetzer GR, Raviv E (2018). _ForecastComb: Forecast
## Combination Methods_. R package version 1.3.1,
## <https://CRAN.R-project.org/package=ForecastComb>.
##
## A BibTeX entry for LaTeX users is
##
## @Manual{,
## title = {ForecastComb: Forecast Combination Methods},
## author = {Christoph E. Weiss and Gernot R. Roetzer and Eran Raviv},
## year = {2018},
## note = {R package version 1.3.1},
## url = {https://CRAN.R-project.org/package=ForecastComb},
## }
##
## ATTENTION: This citation information has been auto-generated from the
## package DESCRIPTION file and may need manual editing, see
## 'help("citation")'.
# Personalizar el título
title <- textGrob("Retornos de Letras del tesoro a 3 meses", gp = gpar(fontface = "bold", fontsize = 12))
grid.arrange(top = title ,grafico1,grafico1_c, ncol = 2)Cálculo de nulos y graficos a 6 meses
datos <- read.xlsx("datos.xlsx")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "6_meses" , ]
datos <- datos[95:nrow(datos), ]
nulos<-sum(is.na(datos));nulos## [1] 1
total<-nrow(datos)
porcentaje<-nulos/total;porcentaje## [1] 0.005405405
GRÁFICO ORIGINAL
grafico2 <-ggplot(datos_long_completa[datos_long_completa$Periodo %in% c("6_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line() +
labs(title = "Serie inicial",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")GRÁFICO NUEVO
datos_c=read.csv2("Datos_csv.csv", header = TRUE)
datos_c$Tiempo=as.factor(datos_c$Tiempo)
datos_c$Tiempo <- as.Date(paste0(datos_c$Tiempo, "_01"), format = "%B_%Y_%d")
datos_long <- pivot_longer(datos_c, -Tiempo, names_to = "Periodo", values_to = "Valor")
datos_long <- datos_long[847:nrow(datos_long), ]grafico2_c<-ggplot(datos_long[datos_long$Periodo %in% c("X6_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color="blue") +
labs(title = "Serie final",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")UNIÓN DE LOS DOS GRAFICOS
# Personalizar el título
title <- textGrob("Retornos de Letras del tesoro a 6 meses", gp = gpar(fontface = "bold", fontsize = 12))
grid.arrange(top = title ,grafico2,grafico2_c, ncol = 2)Cálculo de nulos y graficos a 9 meses
datos <- read.xlsx("datos.xlsx")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
datos <- datos[datos$Periodo == "9_meses" , ]
datos <- datos[146:nrow(datos), ]
nulos<-sum(is.na(datos));nulos## [1] 0
total<-nrow(datos)
porcentaje<-nulos/total;porcentaje## [1] 0
GRÁFICO ORIGINAL
grafico3 <-ggplot(datos_long_completa[datos_long_completa$Periodo %in% c("9_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line() +
labs(title = "Serie inicial",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")GRÁFICO NUEVO
datos_long <- pivot_longer(datos_c, -Tiempo, names_to = "Periodo", values_to = "Valor")
datos_long <- datos_long[1306:nrow(datos_long), ]grafico3_c<-ggplot(datos_long[datos_long$Periodo %in% c("X9_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color="blue") +
labs(title = "Serie final",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")UNIÓN DE LOS DOS GRAFICOS
title <- textGrob("Retornos de Letras del tesoro a 9 meses", gp = gpar(fontface = "bold", fontsize = 12))
grid.arrange(top = title ,grafico3,grafico3_c, ncol = 2)Cálculo de nulos y graficos a 12 meses
datos <- read.xlsx("datos.xlsx")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "12_meses" , ]
datos <- datos[1:nrow(datos), ]
nulos<-sum(is.na(datos));nulos## [1] 0
total<-nrow(datos)
porcentaje<-nulos/total;porcentaje## [1] 0
GRÁFICO ORIGINAL
View(datos_long_completa[datos_long_completa$Periodo %in% c("12_meses"), ])
grafico4 <-ggplot(datos_long_completa[datos_long_completa$Periodo %in% c("12_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line() +
labs(title = "Serie inicial",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")GRÁFICO NUEVO
datos_long <- pivot_longer(datos_c, -Tiempo, names_to = "Periodo", values_to = "Valor")
datos_long <- datos_long[1:nrow(datos_long), ]grafico4_c<-ggplot(datos_long[datos_long$Periodo %in% c("X12_meses"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color="blue") +
labs(title = "Serie final",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")UNIÓN DE LOS DOS GRAFICOS
title <- textGrob("Retornos de Letras del tesoro a 12 meses", gp = gpar(fontface = "bold", fontsize = 12))
grid.arrange(top = title ,grafico4,grafico4_c, ncol = 2)Cálculo de nulos y graficos a 3 años
datos <- read.xlsx("datos.xlsx")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_años
datos <- datos[datos$Periodo == "3_años" , ]
datos <- datos[95:nrow(datos), ]
nulos<-sum(is.na(datos));nulos## [1] 23
total<-nrow(datos)
porcentaje<-nulos/total;porcentaje## [1] 0.1243243
GRÁFICO ORIGINAL
grafico5 <-ggplot(datos_long_completa[datos_long_completa$Periodo %in% c("3_años"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line() +
labs(title = "Serie inicial",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")GRÁFICO NUEVO
datos_long <- pivot_longer(datos_c, -Tiempo, names_to = "Periodo", values_to = "Valor")
datos_long <- datos_long[847:nrow(datos_long), ]grafico5_c<-ggplot(datos_long[datos_long$Periodo %in% c("X3_anos"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color="blue") +
labs(title = "Serie final",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")UNIÓN DE LOS DOS GRAFICOS
title <- textGrob("Retornos de Bonos del Estado a 3 años", gp = gpar(fontface = "bold", fontsize = 12))
grid.arrange(top = title ,grafico5,grafico5_c, ncol = 2)Cálculo de nulos y graficos a 5 años
datos <- read.xlsx("datos.xlsx")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 5_años
datos <- datos[datos$Periodo == "5_años" , ]
datos <- datos[94:nrow(datos), ]
nulos<-sum(is.na(datos));nulos## [1] 15
total<-nrow(datos)
porcentaje<-nulos/total;porcentaje## [1] 0.08064516
GRÁFICO ORIGINAL
grafico6 <-ggplot(datos_long_completa[datos_long_completa$Periodo %in% c("5_años"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line() +
labs(title = "Serie inicial",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")GRÁFICO NUEVO
datos_long <- pivot_longer(datos_c, -Tiempo, names_to = "Periodo", values_to = "Valor")
datos_long <- datos_long[838:nrow(datos_long), ]grafico6_c<-ggplot(datos_long[datos_long$Periodo %in% c("X5_anos"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color="blue") +
labs(title = "Serie final",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")UNIÓN DE LOS DOS GRAFICOS
title <- textGrob("Retornos de Bonos del Estado a 5 años", gp = gpar(fontface = "bold", fontsize = 12))
grid.arrange(top = title ,grafico6,grafico6_c, ncol = 2)Cálculo de nulos y graficos a 10 años
datos <- read.xlsx("datos.xlsx")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_años
datos <- datos[datos$Periodo == "10_años" , ]
datos <- datos[98:nrow(datos), ]
nulos<-sum(is.na(datos));nulos## [1] 15
total<-nrow(datos)
porcentaje<-nulos/total;porcentaje## [1] 0.08241758
GRÁFICO ORIGINAL
grafico7 <-ggplot(datos_long_completa[datos_long_completa$Periodo %in% c("10_años"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line() +
labs(title = "Serie inicial",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")GRÁFICO NUEVO
datos_long <- pivot_longer(datos_c, -Tiempo, names_to = "Periodo", values_to = "Valor")
datos_long <- datos_long[874:nrow(datos_long), ]grafico7_c<-ggplot(datos_long[datos_long$Periodo %in% c("X10_anos"), ],
aes(x = Tiempo, y = Valor, color = Periodo)) +
geom_line(color="blue") +
labs(title = "Serie final",
x = "Tiempo",
y = "Valor",
color = "Periodo") +
theme_minimal() +
theme(legend.position = "none")UNIÓN DE LOS DOS GRAFICOS
title <- textGrob("Retornos de Obligaciones del Estado a 10 años", gp = gpar(fontface = "bold", fontsize = 12))
grid.arrange(top = title ,grafico7,grafico7_c, ncol = 2)###Mix 3 meses
library(ggplot2)
library(dplyr)##
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)datos=read.csv2("Datos_csv.csv", header = TRUE)
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X3_meses" , ]
calculated_df <- datos[94:nrow(datos), ]
calculated_df <- calculated_df[,-2 ]
calculated_df <- data.frame(fecha =calculated_df$Tiempo, valor=calculated_df$Valor )
# Leer los datos desde el archivo Excel
datos <- read.xlsx("datos.xlsx")
# Convertir la columna 'Tiempo' a formato de fecha
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
# Pivotar los datos
datos <- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
# Filtrar por el periodo '3_meses'
datos <- filter(datos, Periodo == "3_meses")
original_df <- datos[94:nrow(datos), ]
original_df <- original_df[,-2 ]
original_df <- data.frame(fecha =original_df$Tiempo, valor=original_df$Valor )
original_df$tipo <- 'Original'
calculated_df$tipo <- 'Calculated'
combined_df <- rbind(original_df, calculated_df)# Combinar los data frames para que los valores calculados reemplacen los nulos en los originales
combined_df <- original_df %>%
full_join(calculated_df, by = "fecha", suffix = c("_original", "_calculated")) %>%
mutate(
valor = ifelse(is.na(valor_original), valor_calculated, valor_original),
tipo = ifelse(is.na(valor_original), "Imputado", "Original")
)
combined_df$tamano_punto <- ifelse(combined_df$tipo == "Imputado", 2.5, 1)# Crear el gráfico
mix1<-ggplot(combined_df, aes(x = fecha, y = valor, color = tipo)) +
geom_line(size = 1, aes(group = 1)) +
geom_point(aes(size = tamano_punto)) +
scale_color_manual(values = c("Original" = "blue", "Imputado" = "red")) +
scale_size_identity() +
labs(title = "Letras a 3 meses", x = "Fecha", y = "Valor") +
theme_minimal()+
theme(legend.position = "none")## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
###Mix 6 meses
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X6_meses" , ]
calculated_df <- datos[95:nrow(datos), ]
calculated_df <- calculated_df[,-2 ]
calculated_df <- data.frame(fecha =calculated_df$Tiempo, valor=calculated_df$Valor )
# Leer los datos desde el archivo Excel
datos <- read.xlsx("datos.xlsx")
# Convertir la columna 'Tiempo' a formato de fecha
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
# Pivotar los datos
datos <- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
# Filtrar por el periodo '3_meses'
datos <- filter(datos, Periodo == "6_meses")
original_df <- datos[95:nrow(datos), ]
original_df <- original_df[,-2 ]
original_df <- data.frame(fecha =original_df$Tiempo, valor=original_df$Valor )
original_df$tipo <- 'Original'
calculated_df$tipo <- 'Calculated'
combined_df <- rbind(original_df, calculated_df)# Combinar los data frames para que los valores calculados reemplacen los nulos en los originales
combined_df <- original_df %>%
full_join(calculated_df, by = "fecha", suffix = c("_original", "_calculated")) %>%
mutate(
valor = ifelse(is.na(valor_original), valor_calculated, valor_original),
tipo = ifelse(is.na(valor_original), "Imputado", "Original")
)
combined_df$tamano_punto <- ifelse(combined_df$tipo == "Imputado", 2.5, 1)# Crear el gráfico
mix2<-ggplot(combined_df, aes(x = fecha, y = valor, color = tipo)) +
geom_line(size = 1, aes(group = 1)) +
geom_point(aes(size = tamano_punto)) +
scale_color_manual(values = c("Original" = "blue", "Imputado" = "red")) +
scale_size_identity() +
labs(title = "Letras a 6 meses", x = "Fecha", y = "Valor") +
theme_minimal()+
theme(legend.position = "none")###Mix 9 meses
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X9_meses" , ]
calculated_df <- datos[146:nrow(datos), ]
calculated_df <- calculated_df[,-2 ]
calculated_df <- data.frame(fecha =calculated_df$Tiempo, valor=calculated_df$Valor )
# Leer los datos desde el archivo Excel
datos <- read.xlsx("datos.xlsx")
# Convertir la columna 'Tiempo' a formato de fecha
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
# Pivotar los datos
datos <- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
# Filtrar por el periodo '3_meses'
datos <- filter(datos, Periodo == "9_meses")
original_df <- datos[146:nrow(datos), ]
original_df <- original_df[,-2 ]
original_df <- data.frame(fecha =original_df$Tiempo, valor=original_df$Valor )
original_df$tipo <- 'Original'
calculated_df$tipo <- 'Calculated'
combined_df <- rbind(original_df, calculated_df)# Combinar los data frames para que los valores calculados reemplacen los nulos en los originales
combined_df <- original_df %>%
full_join(calculated_df, by = "fecha", suffix = c("_original", "_calculated")) %>%
mutate(
valor = ifelse(is.na(valor_original), valor_calculated, valor_original),
tipo = ifelse(is.na(valor_original), "Imputado", "Original")
)
combined_df$tamano_punto <- ifelse(combined_df$tipo == "Imputado", 2.5, 1)# Crear el gráfico
mix3<-ggplot(combined_df, aes(x = fecha, y = valor, color = tipo)) +
geom_line(size = 1, aes(group = 1)) +
geom_point(aes(size = tamano_punto)) +
scale_color_manual(values = c("Original" = "blue", "Imputado" = "red")) +
scale_size_identity() +
labs(title = "Letras a 9 meses", x = "Fecha", y = "Valor") +
theme_minimal()+
theme(legend.position = "none")###Mix 12 meses
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X12_meses" , ]
calculated_df <- datos[1:nrow(datos), ]
calculated_df <- calculated_df[,-2 ]
calculated_df <- data.frame(fecha =calculated_df$Tiempo, valor=calculated_df$Valor )
# Leer los datos desde el archivo Excel
datos <- read.xlsx("datos.xlsx")
# Convertir la columna 'Tiempo' a formato de fecha
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
# Pivotar los datos
datos <- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
# Filtrar por el periodo '3_meses'
datos <- filter(datos, Periodo == "12_meses")
original_df <- datos[1:nrow(datos), ]
original_df <- original_df[,-2 ]
original_df <- data.frame(fecha =original_df$Tiempo, valor=original_df$Valor )
original_df$tipo <- 'Original'
calculated_df$tipo <- 'Calculated'
combined_df <- rbind(original_df, calculated_df)# Combinar los data frames para que los valores calculados reemplacen los nulos en los originales
combined_df <- original_df %>%
full_join(calculated_df, by = "fecha", suffix = c("_original", "_calculated")) %>%
mutate(
valor = ifelse(is.na(valor_original), valor_calculated, valor_original),
tipo = ifelse(is.na(valor_original), "Imputado", "Original")
)
combined_df$tamano_punto <- ifelse(combined_df$tipo == "Imputado", 2.5, 1)# Crear el gráfico
mix4<-ggplot(combined_df, aes(x = fecha, y = valor, color = tipo)) +
geom_line(size = 1, aes(group = 1)) +
geom_point(aes(size = tamano_punto)) +
scale_color_manual(values = c("Original" = "blue", "Imputado" = "red")) +
scale_size_identity() +
labs(title = "Letras a 12 meses", x = "Fecha", y = "Valor") +
theme_minimal()+
theme(legend.position = "none")# Juntar los gráficos
library(gridExtra)
grid.arrange(top = " Valores imputados en las Letras del tesoro 2000-2024",mix1, mix2, mix3, mix4, ncol = 2)
###Mix 3 años
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X3_anos" , ]
calculated_df <- datos[95:nrow(datos), ]
calculated_df <- calculated_df[,-2 ]
calculated_df <- data.frame(fecha =calculated_df$Tiempo, valor=calculated_df$Valor )
# Leer los datos desde el archivo Excel
datos <- read.xlsx("datos.xlsx")
# Convertir la columna 'Tiempo' a formato de fecha
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
# Pivotar los datos
datos <- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
# Filtrar por el periodo '3_meses'
datos <- filter(datos, Periodo == "3_años")
original_df <- datos[95:nrow(datos), ]
original_df <- original_df[,-2 ]
original_df <- data.frame(fecha =original_df$Tiempo, valor=original_df$Valor )
original_df$tipo <- 'Original'
calculated_df$tipo <- 'Calculated'
combined_df <- rbind(original_df, calculated_df)# Combinar los data frames para que los valores calculados reemplacen los nulos en los originales
combined_df <- original_df %>%
full_join(calculated_df, by = "fecha", suffix = c("_original", "_calculated")) %>%
mutate(
valor = ifelse(is.na(valor_original), valor_calculated, valor_original),
tipo = ifelse(is.na(valor_original), "Imputado", "Original")
)# Crear el gráfico
mix5<-ggplot(combined_df, aes(x = fecha, y = valor, color = tipo)) +
geom_line(size = 1, aes(group = 1)) +
geom_point() +
scale_color_manual(values = c("Original" = "blue", "Imputado" = "red")) +
scale_size_identity() +
labs(title = "Bonos a 3 años", x = "Fecha", y = "Valor") +
theme_minimal()+
theme(legend.position = "none")###Mix 5 años
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X5_anos" , ]
calculated_df <- datos[94:nrow(datos), ]
calculated_df <- calculated_df[,-2 ]
calculated_df <- data.frame(fecha =calculated_df$Tiempo, valor=calculated_df$Valor )
# Leer los datos desde el archivo Excel
datos <- read.xlsx("datos.xlsx")
# Convertir la columna 'Tiempo' a formato de fecha
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
# Pivotar los datos
datos <- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
# Filtrar por el periodo '3_meses'
datos <- filter(datos, Periodo == "5_años")
original_df <- datos[94:nrow(datos), ]
original_df <- original_df[,-2 ]
original_df <- data.frame(fecha =original_df$Tiempo, valor=original_df$Valor )
original_df$tipo <- 'Original'
calculated_df$tipo <- 'Calculated'
combined_df <- rbind(original_df, calculated_df)# Combinar los data frames para que los valores calculados reemplacen los nulos en los originales
combined_df <- original_df %>%
full_join(calculated_df, by = "fecha", suffix = c("_original", "_calculated")) %>%
mutate(
valor = ifelse(is.na(valor_original), valor_calculated, valor_original),
tipo = ifelse(is.na(valor_original), "Imputado", "Original")
)# Crear el gráfico
mix6<-ggplot(combined_df, aes(x = fecha, y = valor, color = tipo)) +
geom_line(size = 1, aes(group = 1)) +
geom_point() +
scale_color_manual(values = c("Original" = "blue", "Imputado" = "red")) +
scale_size_identity() +
labs(title = "Bonos a 5 años", x = "Fecha", y = "Valor") +
theme_minimal()+
theme(legend.position = "none")###Mix 10 años
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X10_anos" , ]
calculated_df <- datos[98:nrow(datos), ]
calculated_df <- calculated_df[,-2 ]
calculated_df <- data.frame(fecha =calculated_df$Tiempo, valor=calculated_df$Valor )
# Leer los datos desde el archivo Excel
datos <- read.xlsx("datos.xlsx")
# Convertir la columna 'Tiempo' a formato de fecha
datos$Tiempo <- as.Date(paste0(datos$Tiempo, "_01"), format = "%B_%Y_%d")
# Pivotar los datos
datos <- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
# Filtrar por el periodo '3_meses'
datos <- filter(datos, Periodo == "10_años")
original_df <- datos[98:nrow(datos), ]
original_df <- original_df[,-2 ]
original_df <- data.frame(fecha =original_df$Tiempo, valor=original_df$Valor )
original_df$tipo <- 'Original'
calculated_df$tipo <- 'Calculated'
combined_df <- rbind(original_df, calculated_df)# Combinar los data frames para que los valores calculados reemplacen los nulos en los originales
combined_df <- original_df %>%
full_join(calculated_df, by = "fecha", suffix = c("_original", "_calculated")) %>%
mutate(
valor = ifelse(is.na(valor_original), valor_calculated, valor_original),
tipo = ifelse(is.na(valor_original), "Imputado", "Original")
)# Crear el gráfico
mix7<-ggplot(combined_df, aes(x = fecha, y = valor, color = tipo)) +
geom_line(size = 1, aes(group = 1)) +
geom_point() +
scale_color_manual(values = c("Original" = "blue", "Imputado" = "red")) +
scale_size_identity() +
labs(title = "Obligaciones a 10 años", x = "Fecha", y = "Valor") +
theme_minimal()+
theme(legend.position = "none")# Juntar los gráficos
library(gridExtra)
grid.arrange(top = " Valores imputados en las Bonos del Estado 2000-2024", mix5, mix6, ncol = 2)Funciones que utiliza el modelo alPCA
calculo1<-function(j){
# We define the general parameters
serie<-ensayo[j]
n_p<-12
n<-length(datos[[serie]])
estac<-12 #monthly seasonality
comienzo <- start(datos[[serie]])
# We select the period T1(x) T2(x)
x <- ts(datos[[serie]][1:(n-(2*n_p))],start = comienzo, frequency = estac) #T1
if(end(x)[2]==estac)
{comienzo2<-c(end(x)[1]+1,1)
}else
{comienzo2<-c(end(x)[1],end(x)[2]+1)}
x1 <- ts(datos[[serie]][(n-(2*n_p)+1):(n-n_p)], start = comienzo2,frequency = estac) #T2
set.seed(846)
metodos<-list()
#Naïve
metodos[[1]]<-naive(x,h=n_p)
#Naïve with seasonality
metodos[[2]]<-snaive(x,h=n_p)
#Exponential smoothing
metodos[[3]]<-ets(x,model = "ZZZ", opt.crit="lik", damped = NULL)
metodos[[3]]<-predict(metodos[[3]],n_p)
metodos[[4]]<-ets(x,model = "ZZZ", opt.crit="mse", damped = NULL)
metodos[[4]]<-predict(metodos[[4]],n_p)
metodos[[5]]<-ets(x,model = "ZZZ", opt.crit="amse", damped = NULL)
metodos[[5]]<-predict(metodos[[5]],n_p)
metodos[[6]]<-ets(x,model = "ZZZ", opt.crit="sigma", damped = NULL)
metodos[[6]]<-predict(metodos[[6]],n_p)
metodos[[7]]<-ets(x,model = "ZZZ", opt.crit="mae", damped = NULL)
metodos[[7]]<-predict(metodos[[7]],n_p)
metodos[[8]]<-ets(x,model = "ZZZ", opt.crit="lik", damped = TRUE)
metodos[[8]]<-predict(metodos[[8]],n_p)
metodos[[9]]<-ets(x,model = "ZZZ", opt.crit="mse", damped = TRUE)
metodos[[9]]<-predict(metodos[[9]],n_p)
metodos[[10]]<-ets(x,model = "ZZZ", opt.crit="amse", damped = TRUE)
metodos[[10]]<-predict(metodos[[10]],n_p)
metodos[[11]]<-ets(x,model = "ZZZ", opt.crit="sigma", damped = TRUE)
metodos[[11]]<-predict(metodos[[11]],n_p)
metodos[[12]]<-ets(x,model = "ZZZ", opt.crit="mae", damped = TRUE)
metodos[[12]]<-predict(metodos[[12]],n_p)
#ARIMA
a<-NULL
metodos[[13]]<-auto.arima(x, ic="aic",approximation=T, trace=FALSE, allowdrift=F)
a<-predict(metodos[[13]],n_p)
metodos[[13]]$mean<-a$pred
metodos[[14]]<-auto.arima(x, ic="bic",approximation=T, trace=FALSE, allowdrift=F)
a<-predict(metodos[[14]],n_p)
metodos[[14]]$mean<-a$pred
#Theta
metodos[[15]]<-otm.arxiv(x, h=n_p, s= NULL, g= "sAPE")
metodos[[16]]<-dotm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="Nelder-Mead") #Dynamic Optimised Theta Model
metodos[[17]]<-dotm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="L-BFGS-B") #Dynamic Optimised Theta Model
metodos[[18]]<-dotm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="SANN") #Dynamic Optimised Theta Model
metodos[[19]]<-dstm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="Nelder-Mead") #Dynamic Standard Theta Model
metodos[[20]]<-dstm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="L-BFGS-B") #Dynamic Standard Theta Model
metodos[[21]]<-dstm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="SANN") #Dynamic Standard Theta Model
metodos[[22]]<-otm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="Nelder-Mead") #Optimised Theta Model
metodos[[23]]<-otm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="L-BFGS-B") #Optimised Theta Model
metodos[[24]]<-otm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="SANN") #Optimised Theta Model
metodos[[25]]<-stm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="Nelder-Mead") #Standard Theta Model (Fiorucci)
metodos[[26]]<-stm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="L-BFGS-B") #Standard Theta Model (Fiorucci)
metodos[[27]]<-stm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="SANN") #Standard Theta Model (Fiorucci)
metodos[[28]]<-stheta(x, h=n_p, s= NULL) #Standard Theta Model (Assimakopoulos)
#STL (sólo series estacionales)
metodos[[29]]<-stlf(x,h=n_p, method=c("ets"),robust = TRUE,allow.multiplicative.trend = TRUE)
metodos[[30]]<-stlf(x,h=n_p, method=c("arima"),robust = TRUE,allow.multiplicative.trend = TRUE)
metodos[[31]]<-stlf(x,h=n_p, forecastfunction=thetaf,robust = TRUE,allow.multiplicative.trend = TRUE)
#Croston
metodos[[32]]<-crost(x,h=n_p,type = "croston",cost = "mar",init.opt=TRUE)
metodos[[32]]$fitted<-ts(metodos[[32]]$frc.in, start =comienzo,frequency = estac)
metodos[[32]]$mean<- ts(metodos[[32]]$frc.out, start =comienzo2,frequency = estac)
metodos[[33]]<-crost(x,h=n_p,type = "croston",cost = "msr",init.opt=TRUE)
metodos[[33]]$fitted<-ts(metodos[[33]]$frc.in, start =comienzo,frequency = estac)
metodos[[33]]$mean<- ts(metodos[[33]]$frc.out, start =comienzo2,frequency = estac)
metodos[[34]]<-crost(x,h=n_p,type = "croston",cost = "mae",init.opt=TRUE)
metodos[[34]]$fitted<-ts(metodos[[34]]$frc.in, start =comienzo,frequency = estac)
metodos[[34]]$mean<- ts(metodos[[34]]$frc.out, start =comienzo2,frequency = estac)
metodos[[35]]<-crost(x,h=n_p,type = "croston",cost = "mse",init.opt=TRUE)
metodos[[35]]$fitted<-ts(metodos[[35]]$frc.in, start =comienzo,frequency = estac)
metodos[[35]]$mean<- ts(metodos[[35]]$frc.out, start =comienzo2,frequency = estac)
metodos[[36]]<-crost(x,h=n_p,type = "sba",cost = "mar",init.opt=TRUE)
metodos[[36]]$fitted<-ts(metodos[[36]]$frc.in, start =comienzo,frequency = estac)
metodos[[36]]$mean<- ts(metodos[[36]]$frc.out, start =comienzo2,frequency = estac)
metodos[[37]]<-crost(x,h=n_p,type = "sba",cost = "msr",init.opt=TRUE)
metodos[[37]]$fitted<-ts(metodos[[37]]$frc.in, start =comienzo,frequency = estac)
metodos[[37]]$mean<- ts(metodos[[37]]$frc.out, start =comienzo2,frequency = estac)
metodos[[38]]<-crost(x,h=n_p,type = "sba",cost = "mae",init.opt=TRUE)
metodos[[38]]$fitted<-ts(metodos[[38]]$frc.in, start =comienzo,frequency = estac)
metodos[[38]]$mean<- ts(metodos[[38]]$frc.out, start =comienzo2,frequency = estac)
metodos[[39]]<-crost(x,h=n_p,type = "sba",cost = "mse",init.opt=TRUE)
metodos[[39]]$fitted<-ts(metodos[[39]]$frc.in, start =comienzo,frequency = estac)
metodos[[39]]$mean<- ts(metodos[[39]]$frc.out, start =comienzo2,frequency = estac)
metodos[[40]]<-crost(x,h=n_p,type = "sbj",cost = "mar",init.opt=TRUE)
metodos[[40]]$fitted<-ts(metodos[[40]]$frc.in, start =comienzo,frequency = estac)
metodos[[40]]$mean<- ts(metodos[[40]]$frc.out, start =comienzo2,frequency = estac)
metodos[[41]]<-crost(x,h=n_p,type = "sbj",cost = "msr",init.opt=TRUE)
metodos[[41]]$fitted<-ts(metodos[[41]]$frc.in, start =comienzo,frequency = estac)
metodos[[41]]$mean<- ts(metodos[[41]]$frc.out, start =comienzo2,frequency = estac)
metodos[[42]]<-crost(x,h=n_p,type = "sbj",cost = "mae",init.opt=TRUE)
metodos[[42]]$fitted<-ts(metodos[[42]]$frc.in, start =comienzo,frequency = estac)
metodos[[42]]$mean<- ts(metodos[[42]]$frc.out, start =comienzo2,frequency = estac)
metodos[[43]]<-crost(x,h=n_p,type = "sbj",cost = "mse",init.opt=TRUE)
metodos[[43]]$fitted<-ts(metodos[[43]]$frc.in, start =comienzo,frequency = estac)
metodos[[43]]$mean<- ts(metodos[[43]]$frc.out, start =comienzo2,frequency = estac)
#Prophet
set.seed(50)
df<-data.frame(ds = seq(as.Date(paste(start(x)[1],"-",start(x)[2],"-","01",sep="")),
as.Date(paste(end(x)[1],"-",end(x)[2],"-","01",sep="")),by="m"), y = x)
metodos[[44]]<-prophet(df,yearly.seasonality=TRUE,
weekly.seasonality = FALSE,
daily.seasonality = FALSE,seasonality.mode = "additive")
a<-make_future_dataframe(metodos[[44]],periods = 18,freq = "month")
b<-predict(metodos[[44]],a)
metodos[[44]]$fitted <- ts(b$yhat[1:length(x)],start = comienzo,frequency = estac)
metodos[[44]]$mean <- ts(b$yhat[(length(x)+1):(length(x)+n_p)],start = comienzo2,frequency = estac)
metodos[[45]]<-prophet(df,yearly.seasonality=TRUE,
weekly.seasonality = FALSE,
daily.seasonality = FALSE,seasonality.mode = "multiplicative")
a<-make_future_dataframe(metodos[[45]],periods = 18,freq = "month")
b<-predict(metodos[[45]],a)
metodos[[45]]$fitted <- ts(b$yhat[1:length(x)],start = comienzo,frequency = estac)
metodos[[45]]$mean <- ts(b$yhat[(length(x)+1):(length(x)+n_p)],start = comienzo2,frequency = estac)
set.seed(50)
metodos[[46]]<-nnetar(x,p=estac,scale.inputs=T)
a<-forecast(metodos[[46]],h=n_p)
metodos[[46]]$mean<-a$mean
#TBATS model (Exponential smoothing state space model with Box-Cox transformation, ARMA errors, Trend and Seasonal components)
set.seed(50)
metodos[[47]]<-tbats(x, biasadj = TRUE)
metodos[[47]]$fitted<-metodos[[47]]$fitted.values
a<-forecast(metodos[[47]],h=n_p)
metodos[[47]]$mean<-a$mean
#GRNN: general regression neural network
set.seed(50)
metodos[[48]]<-grnn_forecasting(x, h = n_p, transform = "additive")
a<-rolling_origin(metodos[[48]],h = length(x)-estac-1)
metodos[[48]]$fitted<-a$predictions[,1]
metodos[[48]]$mean<-metodos[[48]]$prediction
metodos[[49]]<-grnn_forecasting(x, h = n_p, transform = "multiplicative")
a<-rolling_origin(metodos[[49]],h = length(x)-estac-1)
metodos[[49]]$fitted<-a$predictions[,1]
metodos[[49]]$mean<-metodos[[49]]$prediction
#MLP: multilayer perceptron
set.seed(50)
metodos[[50]]<-mlp.thief(x, h=12)
metodos[[51]]<-mlp(x, m=12, comb = c("median"),hd = c(10,5))
a<-forecast(metodos[[51]],h=12)
metodos[[51]]$mean<-a$mean
metodos[[52]]<-mlp(x, m=12, comb = c("mean"),hd = c(10,5))
a<-forecast(metodos[[52]],h=12)
metodos[[52]]$mean<-a$mean
gc()
return(metodos)
}
calculo2<- function(j) {
# We define the general parameters
serie<-ensayo[j]
n_p<-12
n<-length(datos[[serie]]) #nº de datos
estac<-12
comienzo <- start(datos[[serie]])
# We select the period T1(x) T2(x)
x <- ts(datos[[serie]][1:(n-(2*n_p))],start = comienzo, frequency = estac) #T1
if(end(x)[2]==estac)
{comienzo2<-c(end(x)[1]+1,1)
}else
{comienzo2<-c(end(x)[1],end(x)[2]+1)}
x1 <- ts(datos[[serie]][(n-(2*n_p)+1):(n-n_p)], start = comienzo2,frequency = estac) #T2
#sMAPE in T1: In some cases it is straightforward, but in others we lose initial values.
metodos.T1[[j]][[1]]$sMapeT1 <- 100*Metrics::smape(x[2:length(x)],metodos.T1[[j]][[1]]$fitted[2:length(x)])
metodos.T1[[j]][[2]]$sMapeT1 <- 100*Metrics::smape(x[(estac+1):length(x)],metodos.T1[[j]][[2]]$fitted[(estac+1):length(x)])
for (i in 1:24) {
metodos.T1[[j]][[2+i]]$sMapeT1 <- 100*Metrics::smape(x,metodos.T1[[j]][[2+i]]$fitted)
}
for (i in 1:17) {
metodos.T1[[j]][[26+i]]$sMapeT1 <- 100*Metrics::smape(x[2:length(x)],metodos.T1[[j]][[26+i]]$fitted[2:length(x)])
}
for (i in 1:2) {
metodos.T1[[j]][[43+i]]$sMapeT1 <- 100*Metrics::smape(x,metodos.T1[[j]][[43+i]]$fitted)
}
metodos.T1[[j]][[46]]$sMapeT1 <- 100*Metrics::smape(x[(estac+1):length(x)],metodos.T1[[j]][[46]]$fitted[(estac+1):length(x)])
metodos.T1[[j]][[47]]$sMapeT1 <- 100*Metrics::smape(x,metodos.T1[[j]][[47]]$fitted)
for (i in 1:2) {
metodos.T1[[j]][[47+i]]$sMapeT1 <- 100*Metrics::smape(x[1:(length(x)-estac-1)],metodos.T1[[j]][[47+i]]$fitted)
}
metodos.T1[[j]][[50]]$sMapeT1 <- 100*Metrics::smape(x[(estac+3):length(x)],
metodos.T1[[j]][[50]]$fitted[(estac+3):length(x)])
metodos.T1[[j]][[51]]$sMapeT1 <- 100*Metrics::smape(x,metodos.T1[[j]][[51]]$fitted)
metodos.T1[[j]][[52]]$sMapeT1 <- 100*Metrics::smape(x,metodos.T1[[j]][[52]]$fitted)
#MASE in T1: In some cases it is straightforward, but in others we lose initial values.
metodos.T1[[j]][[1]]$maseT1 <- Metrics::mase(x[2:length(x)],metodos.T1[[j]][[1]]$fitted[2:length(x)],step_size=12)
metodos.T1[[j]][[2]]$maseT1 <- Metrics::mase(x[(estac+1):length(x)],metodos.T1[[j]][[2]]$fitted[(estac+1):length(x)],step_size=12)
for (i in 1:24) {
metodos.T1[[j]][[2+i]]$maseT1 <- Metrics::mase(x,metodos.T1[[j]][[2+i]]$fitted,step_size=12)
}
for (i in 1:17) {
metodos.T1[[j]][[26+i]]$maseT1 <- Metrics::mase(x[2:length(x)],metodos.T1[[j]][[26+i]]$fitted[2:length(x)],step_size=12)
}
for (i in 1:2) {
metodos.T1[[j]][[43+i]]$maseT1 <- Metrics::mase(x,metodos.T1[[j]][[43+i]]$fitted,step_size=12)
}
metodos.T1[[j]][[46]]$maseT1 <- Metrics::mase(x[(estac+1):length(x)],metodos.T1[[j]][[46]]$fitted[(estac+1):length(x)],step_size=12)
metodos.T1[[j]][[47]]$maseT1 <- Metrics::mase(x,metodos.T1[[j]][[47]]$fitted,step_size=12)
for (i in 1:2) {
metodos.T1[[j]][[47+i]]$maseT1 <- Metrics::mase(x[1:(length(x)-estac-1)],metodos.T1[[j]][[47+i]]$fitted,step_size=12)
}
metodos.T1[[j]][[50]]$maseT1 <- Metrics::mase(x[(estac+3):length(x)],metodos.T1[[j]][[50]]$fitted[(estac+3):length(x)])
metodos.T1[[j]][[51]]$maseT1 <- Metrics::mase(x, metodos.T1[[j]][[51]]$fitted)
metodos.T1[[j]][[52]]$maseT1 <- Metrics::mase(x, metodos.T1[[j]][[52]]$fitted)
#sMAPE in T2
for (i in 1:length(metodos.T1[[1]])) {
metodos.T1[[j]][[i]]$sMapeT2 <- 100*Metrics::smape(x1,metodos.T1[[j]][[i]]$mean)
}
#RMSE in T2
for (i in 1:length(metodos.T1[[1]])) {
metodos.T1[[j]][[i]]$rmseT2 <- Metrics::rmse(x1,metodos.T1[[j]][[i]]$mean)
}
#mase en T2
for (i in 1:length(metodos.T1[[1]])) {
metodos.T1[[j]][[i]]$maseT2 <- Metrics::mase(x1,metodos.T1[[j]][[i]]$mean,step_size=1)
}
#OWA in T2
for (i in 1:length(metodos.T1[[1]])) {
metodos.T1[[j]][[i]]$owaT2 <- ((metodos.T1[[j]][[i]]$maseT2 / metodos.T1[[j]][[2]]$maseT2)+(metodos.T1[[j]][[i]]$sMapeT2 / metodos.T1[[j]][[2]]$sMapeT2))/2
}
return(metodos.T1[[j]])
}
calculo3<-function(j){
erroresT2[[j]]<-matrix(NA,nrow = length(metodos.T1[[1]]),ncol = 13)
colnames(erroresT2[[j]])<-c("id","smapeT1","maseT1","rmse","smape",
"mase","owa","CP1","CP2", "dist", "w1","w2","w3")
for (i in 1:length(metodos.T1[[1]])) {
erroresT2[[j]][i,1]<-i
erroresT2[[j]][i,2]<-metodos.T1[[j]][[i]]$sMapeT1
erroresT2[[j]][i,3]<-metodos.T1[[j]][[i]]$maseT1
erroresT2[[j]][i,4]<-metodos.T1[[j]][[i]]$rmseT2
erroresT2[[j]][i,5]<-metodos.T1[[j]][[i]]$sMapeT2
erroresT2[[j]][i,6]<-metodos.T1[[j]][[i]]$maseT2
erroresT2[[j]][i,7]<-metodos.T1[[j]][[i]]$owaT2
}
dat1<-as.data.frame(round(erroresT2[[j]],3))
dat1<-dat1 %>% distinct(smapeT1, .keep_all = TRUE)
dat1<-dat1 %>% distinct(rmse, .keep_all = TRUE)
erroresT2[[j]]<-as.matrix(dat1)
return(erroresT2[[j]])
}
calculo4<-function(j){
pca[[j]] <- prcomp(erroresT2[[j]][,2:7], scale = TRUE)
if(sum(pca[[j]][["rotation"]][,1])<0) {erroresT2[[j]][,8]<- round(-(pca[[j]][["x"]][,1]),3)} else {erroresT2[[j]][,8]<- round(pca[[j]][["x"]][,1],3)}
erroresT2[[j]][,9]<- round(pca[[j]][["x"]][,2],3)
for (i in 1:dim(erroresT2[[j]])[1]) {
erroresT2[[j]][i,10]<- round(abs(erroresT2[[j]][i,8] - min(erroresT2[[j]][,8])),3)
}
resultado[[1]][[j]]<-erroresT2[[j]]
resultado[[2]][[j]]<-pca[[j]]
return(resultado)
}
calculo4.m<-function(j){
pca[[j]] <- prcomp(erroresT2[[j]][,2:7], scale = TRUE)
a<-summary(pca[[j]])
erroresT2[[j]][,8:9]<-round(pca[[j]][["x"]][,1:2],3)
if(a[["importance"]][2,1]>0.80) {
if(sum(pca[[j]][["rotation"]][3:6,1])<0) {for (i in 1:nrow(erroresT2[[j]])) {erroresT2[[j]][i,10]<- round(abs(erroresT2[[j]][i,8] - max(erroresT2[[j]][,8])),3)} }
else { for (i in 1:nrow(erroresT2[[j]])) {erroresT2[[j]][i,10]<- round(abs(erroresT2[[j]][i,8] - min(erroresT2[[j]][,8])),3)} }
} else {
if(sum(pca[[j]][["rotation"]][3:6,1])>0 & sum(pca[[j]][["rotation"]][1:2,2])>0) {
m1 <- min(erroresT2[[j]][,8])
m2 <- min(erroresT2[[j]][,9])} else if(sum(pca[[j]][["rotation"]][3:6,1])>0 & sum(pca[[j]][["rotation"]][1:2,2])<0) {
m1 <- min(erroresT2[[j]][,8])
m2 <- max(erroresT2[[j]][,9])} else if(sum(pca[[j]][["rotation"]][3:6,1])<0 & sum(pca[[j]][["rotation"]][1:2,2])>0) {
m1 <- max(erroresT2[[j]][,8])
m2 <- min(erroresT2[[j]][,9])} else {
m1 <- max(erroresT2[[j]][,8])
m2 <- max(erroresT2[[j]][,9])}
#Manhattan distance
for (i in 1:nrow(erroresT2[[j]])) {
erroresT2[[j]][i,10]<- round(abs(erroresT2[[j]][i,8] - m1)+abs(erroresT2[[j]][i,9] - m2),3)
}
}
resultado[[1]][[j]]<-erroresT2[[j]]
resultado[[2]][[j]]<-pca[[j]]
#If they exist, distances 0 must be replaced by distances 0.001
for (i in 1:nrow(resultado[[1]][[j]])) {
resultado[[1]][[j]][i,10]<-ifelse(resultado[[1]][[j]][i,10]==0.000, 0.001,resultado[[1]][[j]][i,10])
}
comparacion_bic <- BIC(
mlexp(resultado[[1]][[j]][,10]),
mlinvgamma(resultado[[1]][[j]][,10]),
mlgamma(resultado[[1]][[j]][,10])
)
resultado[[3]][[j]]<- comparacion_bic %>% rownames_to_column(var = "distribucion") %>% arrange(BIC)
return(resultado)
}
calculo5<-function(j,i){
if(dis.ajust[j] ==1) {obj<-mlexp(resultado[[1]][[j]][,10])} else
if(dis.ajust[j]==2) {obj<-mlgamma(resultado[[1]][[j]][,10])} else {obj<-mlinvgamma(resultado[[1]][[j]][,10])}
dat<-subset(resultado[[1]][[j]],resultado[[1]][[j]][,10]<=round(qml(cota[i], obj = obj),4) )
if(nrow(dat)<1) {dat<-subset(resultado[[1]][[j]], resultado[[1]][[j]][,1]==1)}
a<-NULL
b<-NULL
for (m in 1:nrow(dat)) {
a[m]<-round(1/dat[m,2],4)
b[m]<-round(1/dat[m,5],4)
}
for (m in 1:nrow(dat)) {
dat[m,11]<- round(abs(dat[m,8])/sum(abs(dat[,8])),4) #w1
dat[m,12]<- round(a[m] / sum(a),4) #w2
dat[m,13]<- round(b[m] / sum(b),4) #w3
}
resultado[[4]][[j]][[i]]<-dat
return(resultado)
}
calculo6<-function(j){
# We define the general parameters
serie<-ensayo[j]
n_p<-12
n<-length(datos[[serie]])
estac<-12
comienzo <- start(datos[[serie]])
# Select the period T1(x) + T2(x)
x <- ts(datos[[serie]][1:(n-n_p)],start = comienzo, frequency = estac) #T1
if(end(x)[2]==estac)
{comienzo2<-c(end(x)[1]+1,1)
}else
{comienzo2<-c(end(x)[1],end(x)[2]+1)}
x2 <- ts(datos[[serie]][(n-n_p+1):n],start = comienzo2,frequency = estac) #T2
set.seed(846)
metodos<-list()
#Naïve
metodos[[1]]<-naive(x,h=n_p)
#Naïve with seasonality
metodos[[2]]<-snaive(x,h=n_p)
#Exponential smoothing
metodos[[3]]<-ets(x,model = "ZZZ", opt.crit="lik", damped = NULL)
metodos[[3]]<-predict(metodos[[3]],n_p)
metodos[[4]]<-ets(x,model = "ZZZ", opt.crit="mse", damped = NULL)
metodos[[4]]<-predict(metodos[[4]],n_p)
metodos[[5]]<-ets(x,model = "ZZZ", opt.crit="amse", damped = NULL)
metodos[[5]]<-predict(metodos[[5]],n_p)
metodos[[6]]<-ets(x,model = "ZZZ", opt.crit="sigma", damped = NULL)
metodos[[6]]<-predict(metodos[[6]],n_p)
metodos[[7]]<-ets(x,model = "ZZZ", opt.crit="mae", damped = NULL)
metodos[[7]]<-predict(metodos[[7]],n_p)
metodos[[8]]<-ets(x,model = "ZZZ", opt.crit="lik", damped = TRUE)
metodos[[8]]<-predict(metodos[[8]],n_p)
metodos[[9]]<-ets(x,model = "ZZZ", opt.crit="mse", damped = TRUE)
metodos[[9]]<-predict(metodos[[9]],n_p)
metodos[[10]]<-ets(x,model = "ZZZ", opt.crit="amse", damped = TRUE)
metodos[[10]]<-predict(metodos[[10]],n_p)
metodos[[11]]<-ets(x,model = "ZZZ", opt.crit="sigma", damped = TRUE)
metodos[[11]]<-predict(metodos[[11]],n_p)
metodos[[12]]<-ets(x,model = "ZZZ", opt.crit="mae", damped = TRUE)
metodos[[12]]<-predict(metodos[[12]],n_p)
#ARIMA
a<-NULL
metodos[[13]]<-auto.arima(x, ic="aic",approximation=T, trace=FALSE, allowdrift=F)
a<-predict(metodos[[13]],n_p)
metodos[[13]]$mean<-a$pred
metodos[[14]]<-auto.arima(x, ic="bic",approximation=T, trace=FALSE, allowdrift=F)
a<-predict(metodos[[14]],n_p)
metodos[[14]]$mean<-a$pred
#Theta
metodos[[15]]<-otm.arxiv(x, h=n_p, s= NULL, g= "sAPE")
metodos[[16]]<-dotm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="Nelder-Mead") #Dynamic Optimised Theta Model
metodos[[17]]<-dotm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="L-BFGS-B") #Dynamic Optimised Theta Model
metodos[[18]]<-dotm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="SANN") #Dynamic Optimised Theta Model
metodos[[19]]<-dstm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="Nelder-Mead") #Dynamic Standard Theta Model
metodos[[20]]<-dstm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="L-BFGS-B") #Dynamic Standard Theta Model
metodos[[21]]<-dstm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="SANN") #Dynamic Standard Theta Model
metodos[[22]]<-otm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="Nelder-Mead") #Optimised Theta Model
metodos[[23]]<-otm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="L-BFGS-B") #Optimised Theta Model
metodos[[24]]<-otm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="SANN") #Optimised Theta Model
metodos[[25]]<-stm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="Nelder-Mead") #Standard Theta Model (Fiorucci)
metodos[[26]]<-stm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="L-BFGS-B") #Standard Theta Model (Fiorucci)
metodos[[27]]<-stm(x, h=n_p, s= NULL, estimation=TRUE, opt.method="SANN") #Standard Theta Model (Fiorucci)
metodos[[28]]<-stheta(x, h=n_p, s= NULL) #Standard Theta Model (Assimakopoulos)
#STL (seasonal series only)
metodos[[29]]<-stlf(x,h=n_p, method=c("ets"),robust = TRUE,allow.multiplicative.trend = TRUE)
metodos[[30]]<-stlf(x,h=n_p, method=c("arima"),robust = TRUE,allow.multiplicative.trend = TRUE)
metodos[[31]]<-stlf(x,h=n_p, forecastfunction=thetaf,robust = TRUE,allow.multiplicative.trend = TRUE)
#Croston
metodos[[32]]<-crost(x,h=n_p,type = "croston",cost = "mar",init.opt=TRUE)
metodos[[32]]$fitted<-ts(metodos[[32]]$frc.in, start =comienzo,frequency = estac)
metodos[[32]]$mean<- ts(metodos[[32]]$frc.out, start =comienzo2,frequency = estac)
metodos[[33]]<-crost(x,h=n_p,type = "croston",cost = "msr",init.opt=TRUE)
metodos[[33]]$fitted<-ts(metodos[[33]]$frc.in, start =comienzo,frequency = estac)
metodos[[33]]$mean<- ts(metodos[[33]]$frc.out, start =comienzo2,frequency = estac)
metodos[[34]]<-crost(x,h=n_p,type = "croston",cost = "mae",init.opt=TRUE)
metodos[[34]]$fitted<-ts(metodos[[34]]$frc.in, start =comienzo,frequency = estac)
metodos[[34]]$mean<- ts(metodos[[34]]$frc.out, start =comienzo2,frequency = estac)
metodos[[35]]<-crost(x,h=n_p,type = "croston",cost = "mse",init.opt=TRUE)
metodos[[35]]$fitted<-ts(metodos[[35]]$frc.in, start =comienzo,frequency = estac)
metodos[[35]]$mean<- ts(metodos[[35]]$frc.out, start =comienzo2,frequency = estac)
metodos[[36]]<-crost(x,h=n_p,type = "sba",cost = "mar",init.opt=TRUE)
metodos[[36]]$fitted<-ts(metodos[[36]]$frc.in, start =comienzo,frequency = estac)
metodos[[36]]$mean<- ts(metodos[[36]]$frc.out, start =comienzo2,frequency = estac)
metodos[[37]]<-crost(x,h=n_p,type = "sba",cost = "msr",init.opt=TRUE)
metodos[[37]]$fitted<-ts(metodos[[37]]$frc.in, start =comienzo,frequency = estac)
metodos[[37]]$mean<- ts(metodos[[37]]$frc.out, start =comienzo2,frequency = estac)
metodos[[38]]<-crost(x,h=n_p,type = "sba",cost = "mae",init.opt=TRUE)
metodos[[38]]$fitted<-ts(metodos[[38]]$frc.in, start =comienzo,frequency = estac)
metodos[[38]]$mean<- ts(metodos[[38]]$frc.out, start =comienzo2,frequency = estac)
metodos[[39]]<-crost(x,h=n_p,type = "sba",cost = "mse",init.opt=TRUE)
metodos[[39]]$fitted<-ts(metodos[[39]]$frc.in, start =comienzo,frequency = estac)
metodos[[39]]$mean<- ts(metodos[[39]]$frc.out, start =comienzo2,frequency = estac)
metodos[[40]]<-crost(x,h=n_p,type = "sbj",cost = "mar",init.opt=TRUE)
metodos[[40]]$fitted<-ts(metodos[[40]]$frc.in, start =comienzo,frequency = estac)
metodos[[40]]$mean<- ts(metodos[[40]]$frc.out, start =comienzo2,frequency = estac)
metodos[[41]]<-crost(x,h=n_p,type = "sbj",cost = "msr",init.opt=TRUE)
metodos[[41]]$fitted<-ts(metodos[[41]]$frc.in, start =comienzo,frequency = estac)
metodos[[41]]$mean<- ts(metodos[[41]]$frc.out, start =comienzo2,frequency = estac)
metodos[[42]]<-crost(x,h=n_p,type = "sbj",cost = "mae",init.opt=TRUE)
metodos[[42]]$fitted<-ts(metodos[[42]]$frc.in, start =comienzo,frequency = estac)
metodos[[42]]$mean<- ts(metodos[[42]]$frc.out, start =comienzo2,frequency = estac)
metodos[[43]]<-crost(x,h=n_p,type = "sbj",cost = "mse",init.opt=TRUE)
metodos[[43]]$fitted<-ts(metodos[[43]]$frc.in, start =comienzo,frequency = estac)
metodos[[43]]$mean<- ts(metodos[[43]]$frc.out, start =comienzo2,frequency = estac)
#Prophet
set.seed(50)
df<-data.frame(ds = seq(as.Date(paste(start(x)[1],"-",start(x)[2],"-","01",sep="")),
as.Date(paste(end(x)[1],"-",end(x)[2],"-","01",sep="")),by="m"), y = x)
metodos[[44]]<-prophet(df,yearly.seasonality=TRUE,
weekly.seasonality = FALSE,
daily.seasonality = FALSE,seasonality.mode = "additive")
a<-make_future_dataframe(metodos[[44]],periods = 18,freq = "month")
b<-predict(metodos[[44]],a)
metodos[[44]]$fitted <- ts(b$yhat[1:length(x)],start = comienzo,frequency = estac)
metodos[[44]]$mean <- ts(b$yhat[(length(x)+1):(length(x)+n_p)],start = comienzo2,frequency = estac)
metodos[[45]]<-prophet(df,yearly.seasonality=TRUE,
weekly.seasonality = FALSE,
daily.seasonality = FALSE,seasonality.mode = "multiplicative")
a<-make_future_dataframe(metodos[[45]],periods = 18,freq = "month")
b<-predict(metodos[[45]],a)
metodos[[45]]$fitted <- ts(b$yhat[1:length(x)],start = comienzo,frequency = estac)
metodos[[45]]$mean <- ts(b$yhat[(length(x)+1):(length(x)+n_p)],start = comienzo2,frequency = estac)
#NNAR: neural network autoregression
set.seed(50)
metodos[[46]]<-nnetar(x,p=estac,scale.inputs=T)
a<-forecast(metodos[[46]],h=n_p)
metodos[[46]]$mean<-a$mean
#TBATS model (Exponential smoothing state space model with Box-Cox transformation, ARMA errors, Trend and Seasonal components)
set.seed(50)
metodos[[47]]<-tbats(x, biasadj = TRUE)
metodos[[47]]$fitted<-metodos[[47]]$fitted.values
a<-forecast(metodos[[47]],h=n_p)
metodos[[47]]$mean<-a$mean
#GRNN: general regression neural network
set.seed(50)
metodos[[48]]<-grnn_forecasting(x, h = n_p, transform = "additive")
a<-rolling_origin(metodos[[48]],h = length(x)-estac-1)
metodos[[48]]$fitted<-a$predictions[,1]
metodos[[48]]$mean<-metodos[[48]]$prediction
metodos[[49]]<-grnn_forecasting(x, h = n_p, transform = "multiplicative")
a<-rolling_origin(metodos[[49]],h = length(x)-estac-1)
metodos[[49]]$fitted<-a$predictions[,1]
metodos[[49]]$mean<-metodos[[49]]$prediction
#MLP: multilayer perceptron
# En fitted del 14:n, las primeras n_p+2 son NA
set.seed(50)
metodos[[50]]<-mlp.thief(x, h=12)
# En fitted del 5:n, las primeras 4 son vacías
metodos[[51]]<-mlp(x, m=12, comb = c("median"),hd = c(10,5))
a<-forecast(metodos[[51]],h=12)
metodos[[51]]$mean<-a$mean
metodos[[52]]<-mlp(x, m=12, comb = c("mean"),hd = c(10,5))
a<-forecast(metodos[[52]],h=12)
metodos[[52]]$mean<-a$mean
return(metodos)
}Calculamos predicciones para cada tipo Letras, en primer lugar calcularemos las de a 3 meses.
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 0.49 | 0.44 | 0.56 |
| 0.49 | 0.45 | 0.53 |
| 0.49 | 0.45 | 0.57 |
| 0.49 | 0.51 | 0.62 |
| 0.49 | 0.47 | 0.58 |
| 0.49 | 0.46 | 0.56 |
| 0.50 | 0.42 | 0.55 |
| 0.50 | 0.43 | 0.56 |
| 0.50 | 0.44 | 0.57 |
| 0.50 | 0.45 | 0.63 |
| 0.50 | 0.46 | 0.67 |
| 0.50 | 0.47 | 0.63 |
serie_12 <- c(datos$Valor, result_alPCA$percentile.95)
y=ts((serie_12),
start=c(2008,10),
frequency = 12)
ultimo_12 <- tail(y, 12)
# Crear el gráfico utilizando autoplot de ggplot2
ggplot() +
# Agregar la línea completa en color azul
geom_line(data = data.frame(tiempo = time(y), y = y), aes(x = tiempo, y = y), color = "#4C72B0") +
# Agregar solo los últimos 12 puntos en color rojo
geom_line(data = tail(data.frame(tiempo = time(y), y = y), 12), aes(x = tiempo, y = y), color = "red") +
# Personalizar el aspecto del gráfico
theme_minimal() + # Establecer un tema minimalista
theme(
panel.grid.major = element_blank(), # Eliminar las líneas de la cuadrícula mayor
panel.grid.minor = element_blank(), # Eliminar las líneas de la cuadrícula menor
axis.title = element_text(size = 12), # Tamaño del texto de los ejes
plot.title = element_text(size = 16, face = "bold"), # Tamaño y estilo del título
plot.caption = element_text(size = 10, hjust = 0.5), # Tamaño y alineación del pie de página
legend.title = element_blank(), # Eliminar el título de la leyenda
legend.position = "bottom", # Posicionar la leyenda en la parte inferior
legend.text = element_text(size = 10) # Tamaño del texto de la leyenda
) +
labs(
x = "Tiempo", # Etiqueta del eje x
y = "Índice nominal", # Etiqueta del eje y
title = "Letras a 3 meses", # Título del gráfico
# Texto de la fuente de datos
)
#### 6 meses Ahora predecimos con las letras de 6 meses.
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 1 | 0.88 | 0.91 |
| 1 | 0.87 | 0.87 |
| 1 | 0.85 | 0.83 |
| 1 | 0.85 | 0.83 |
| 1 | 0.84 | 0.84 |
| 1 | 0.82 | 0.74 |
| 1 | 0.80 | 0.75 |
| 1 | 0.79 | 0.74 |
| 1 | 0.79 | 0.74 |
| 1 | 0.79 | 0.74 |
| 1 | 0.79 | 0.76 |
| 1 | 0.79 | 0.78 |
#### 9 meses A continuación predecimos con las letras de 9 meses.
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 0.49 | 0.47 | 0.37 |
| 0.51 | 0.49 | 0.39 |
| 0.54 | 0.50 | 0.39 |
| 0.56 | 0.54 | 0.42 |
| 0.58 | 0.55 | 0.42 |
| 0.60 | 0.55 | 0.41 |
| 0.62 | 0.56 | 0.42 |
| 0.65 | 0.56 | 0.43 |
| 0.67 | 0.58 | 0.45 |
| 0.70 | 0.59 | 0.45 |
| 0.72 | 0.61 | 0.46 |
| 0.74 | 0.65 | 0.48 |
#### 12 meses Por último en el apartado de letras predecimos las de 12
meses.
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 3.55 | 3.39 | 3.42 |
| 3.54 | 3.38 | 3.34 |
| 3.90 | 3.51 | 3.45 |
| 4.37 | 3.68 | 3.58 |
| 4.51 | 3.70 | 3.58 |
| 4.52 | 3.70 | 3.65 |
| 4.65 | 3.77 | 3.71 |
| 4.44 | 3.65 | 3.57 |
| 4.50 | 3.67 | 3.53 |
| 4.69 | 3.70 | 3.63 |
| 4.05 | 3.55 | 3.50 |
| 4.47 | 3.69 | 3.59 |
#### 3 años Bonos a 3 años
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 0.6 | 0.83 | 1.24 |
| 0.6 | 0.77 | 1.50 |
| 0.6 | 0.87 | 2.05 |
| 0.6 | 0.75 | 1.41 |
| 0.6 | 0.81 | 1.53 |
| 0.6 | 0.58 | 1.31 |
| 0.6 | 0.62 | 1.47 |
| 0.6 | 0.52 | 1.18 |
| 0.6 | 0.62 | 1.31 |
| 0.6 | 0.47 | 1.01 |
| 0.6 | 0.61 | 1.46 |
| 0.6 | 0.43 | 0.97 |
#### 5 años
Bonos a 5 años
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 2.61 | 5.08 | 4.69 |
| 2.76 | 4.06 | 3.79 |
| 2.23 | 6.16 | 5.64 |
| 2.21 | 2.01 | 2.06 |
| 2.44 | 4.62 | 4.29 |
| 2.09 | 4.44 | 4.12 |
| 1.97 | 5.16 | 4.73 |
| 2.06 | 2.72 | 2.67 |
| 1.97 | 2.76 | 2.73 |
| 2.11 | 9.88 | 8.29 |
| 2.30 | 4.62 | 4.31 |
| 2.35 | 4.12 | 3.89 |
#### 10 años
Bonos a 10 años
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 3.94 | 4.08 | 4.05 |
| 3.91 | 4.06 | 3.95 |
| 3.90 | 4.05 | 3.92 |
| 3.88 | 4.03 | 3.85 |
| 3.87 | 4.03 | 3.83 |
| 3.86 | 4.04 | 3.84 |
| 3.85 | 4.06 | 3.93 |
| 3.85 | 4.04 | 3.95 |
| 3.84 | 4.01 | 3.85 |
| 3.84 | 4.01 | 3.86 |
| 3.83 | 4.02 | 3.79 |
| 3.83 | 4.02 | 3.81 |
### Cálculos
Union de predicciones
indices_alPCA<-data.frame(result_alPCA_3meses,result_alPCA_6meses,result_alPCA_9meses,result_alPCA_12meses)Programa
calcular_neto_corto <- function(retorno_bruto) {
# Calcula la comisión bancaria
if (retorno_bruto <= 600) {
Comision_banco <- 0.9
} else {
Comision_banco <- retorno_bruto * 0.0015
}
# Calcula el neto después de impuestos y comisiones
neto <- retorno_bruto - Comision_banco
# Retorna el valor neto
return(neto)
}beneficio<-0
beneficio_total <- 0
inversion<-1000000
inversion_inicial<-1000000
posiciones <- c(1, 4, 7, 10)
resultados_3meses <- data.frame(Beneficio_Total = numeric(),Beneficio_operacion = numeric(),Beneficio_residual=numeric() )
# Iteramos sobre las columnas del dataframe
for (i in posiciones) {
# Obtenemos el beneficio multiplicando el primer elemento de la columna por el valor introducido por el usuario
beneficio_operacion<-indices_alPCA[i, 1]/100 * inversion * 3/12
beneficio_neto<-calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio+beneficio_neto
beneficio_total<-beneficio_total+beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_3meses<-data.frame( Beneficio_Total_Acumulado = beneficio_total,Beneficio_Operacion_Neto = beneficio_neto)
}
resultados_3meses| Beneficio_Total_Acumulado | Beneficio_Operacion_Neto |
|---|---|
| 5901.734 | 1578.928 |
tres_meses<-resultados_3meses[nrow(resultados_3meses), 1]beneficio <- 0
beneficio_total <- 0
inversion <- 1000000
inversion_inicial <- 1000000
posiciones <- c(1, 7)
resultados_6meses <- data.frame(Beneficio_Total_Acumulado = numeric(), Beneficio_Operacion_Neto = numeric(), Beneficio_residual = numeric())
# Iteramos sobre las posiciones específicas
for (i in posiciones) {
# Obtenemos el beneficio multiplicando el primer elemento de la columna por el valor introducido por el usuario
beneficio_operacion <- indices_alPCA[i, 2] / 100 * inversion * 6 / 12
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_6meses <- data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto)
if (nrow(resultados_6meses) == 2) break
}
resultados_6meses| Beneficio_Total_Acumulado | Beneficio_Operacion_Neto |
|---|---|
| 8302.528 | 3759.352 |
seis_meses<-resultados_6meses[nrow(resultados_6meses), 1]beneficio <- 0
beneficio_total <- 0
inversion <- 1000000
inversion_inicial <- 1000000
resultados_9_3_meses <- data.frame(Beneficio_Total_Acumulado = numeric(), Beneficio_Operacion_Neto = numeric(), Beneficio_residual = numeric())
# Iteramos sobre las posiciones específicas
# Obtenemos el beneficio multiplicando el primer elemento de la columna por el valor introducido por el usuario
beneficio_operacion <- indices_alPCA[1, 3] / 100 * inversion * 9 / 12
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_9_3_meses <- rbind(resultados_9_3_meses, data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto))
beneficio_operacion <- indices_alPCA[10, 1] / 100 * inversion * 3 / 12
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_9_3_meses <- rbind(resultados_9_3_meses, data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto))
resultados_9_3_meses| Beneficio_Total_Acumulado | Beneficio_Operacion_Neto |
|---|---|
| 2770.838 | 2770.838 |
| 4346.620 | 1575.783 |
nueve_tres_meses<-resultados_9_3_meses[nrow(resultados_9_3_meses), 1]beneficio <- 0
beneficio_total <- 0
inversion <- 1000000
inversion_inicial <- 1000000
resultados_3_9_meses <- data.frame(Beneficio_Total_Acumulado = numeric(), Beneficio_Operacion_Neto = numeric(), Beneficio_residual = numeric())
# Iteramos sobre las posiciones específicas
# Obtenemos el beneficio multiplicando el primer elemento de la columna por el valor introducido por el usuario
beneficio_operacion <- indices_alPCA[1, 1] / 100 * inversion * 3 / 12
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_3_9_meses <- rbind(resultados_3_9_meses, data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto, Beneficio_residual = beneficio))
beneficio_operacion <- indices_alPCA[4, 3] / 100 * inversion * 9 / 12
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_3_9_meses <- data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto)
resultados_3_9_meses| Beneficio_Total_Acumulado | Beneficio_Operacion_Neto |
|---|---|
| 4546.32 | 3148.42 |
tres_nueve_meses<-resultados_3_9_meses[nrow(resultados_3_9_meses), 1]beneficio <- 0
beneficio_total <- 0
inversion <- 1000000
inversion_inicial <- 1000000
resultados_12meses <- data.frame(Beneficio_Total_Acumulado = numeric(), Beneficio_Operacion_Neto = numeric(), Beneficio_residual = numeric())
# Iteramos sobre las posiciones específicas
# Obtenemos el beneficio multiplicando el primer elemento de la columna por el valor introducido por el usuario
beneficio_operacion <- indices_alPCA[1, 4] / 100 * inversion
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
resultados_12meses <- data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto)
resultados_12meses| Beneficio_Total_Acumulado | Beneficio_Operacion_Neto |
|---|---|
| 34148.7 | 34148.7 |
doce_meses<-resultados_12meses[nrow(resultados_12meses), 1]# Crear un vector con los valores de las variables
rentabilidades <- c(tres_meses, seis_meses, tres_nueve_meses, nueve_tres_meses, doce_meses)
# Crear un vector con los nombres de las variables
nombres_variables <- c("4 inversiones a 3 meses", "2 inversiones a 6 meses", "1 inversión a 3 meses y otra a 9 meses", "1 inversión a 9 meses y otra a 3 meses", "1 inversión a 12 meses ")
# Ordenar los valores de las rentabilidades de mayor a menor
ranking <- sort(rentabilidades, decreasing = TRUE)
# Imprimir el ranking
cat("Ranking de rentabilidad:\n")## Ranking de rentabilidad:
for (i in 1:length(ranking)) {
cat(i, ": ", nombres_variables[which(rentabilidades == ranking[i])], " - ", format(ranking[i], big.mark = ".", decimal.mark = ",", nsmall = 2), "€\n")
}## 1 : 1 inversión a 12 meses - 34.148,70 €
## 2 : 2 inversiones a 6 meses - 8.302,528 €
## 3 : 4 inversiones a 3 meses - 5.901,734 €
## 4 : 1 inversión a 3 meses y otra a 9 meses - 4.546,32 €
## 5 : 1 inversión a 9 meses y otra a 3 meses - 4.346,62 €
ranking <- sort(rentabilidades, decreasing = FALSE)
nombres_variables <- c("1 inversión a 12 meses ","1 inversión a 3 meses y otra a 9", "2 inversiones a 6 meses","4 inversiones a 3 meses", "1 inversión a 9 meses y otra a 3")
colores_azules <- colorRampPalette(c("#00688B", "#009ACD", "#00BFFF", "lightblue", "darkslategray1"))(length(ranking))
colores_azules_2 <- colorRampPalette(c("darkslategray1", "lightblue", "#00BFFF", "#009ACD", "#00688B"))(length(ranking))
par(mar = c(5, 4, 4, 5))
bp <-barplot(ranking,
names.arg = rep("", length(ranking)),
horiz = TRUE,
col = colores_azules,
xlab = "Beneficio neto",
ylab = "Inversiones",
main = "Beneficios de las inversiones según alPCA",
las = 1,
xlim = c(0, max(ranking) * 1.98))
valores_formateados <- sprintf("%.2f €", round(ranking, 2))
text(ranking, bp, labels = valores_formateados, pos = 4, cex = 0.8, col = "black")
legend(x = max(ranking) * 1.3, y = max(bp), legend = nombres_variables, fill = colores_azules_2, title = "Inversiones", xpd = TRUE)library(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X3_meses" , ]
datos <- datos[94:nrow(datos), ]
y=ts(rev(datos$Valor),
start=c(2008,10),
frequency = 12)
autoplot(y)f<-window(y,start=c(2011,1),end=c(2020,5))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=46,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 46, level = 95)
predicciones_holt<-holt$mean
###ARIMA nuevas
auto.arima(y)## Series: y
## ARIMA(0,1,1)(0,0,1)[12]
##
## Coefficients:
## ma1 sma1
## -0.2033 0.2327
## s.e. 0.0783 0.0736
##
## sigma^2 = 0.1786: log likelihood = -102.53
## AIC=211.06 AICc=211.19 BIC=220.72
actividad_arima<-Arima(y,
order=c(0,1,1), # arma estacional diferenciacion estacional
seasonal =c(0,0,1), # baja cada 4= decimos que es estacional
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(y)## Series: y
## ARIMA(0,1,1)(0,0,1)[12]
##
## Coefficients:
## ma1 sma1
## -0.2033 0.2327
## s.e. 0.0783 0.0736
##
## sigma^2 = 0.1786: log likelihood = -102.53
## AIC=211.06 AICc=211.19 BIC=220.72
actividad_arima<-Arima(f,
order=c(0,1,1), # arma estacional diferenciacion estacional
seasonal =c(0,0,1), # baja cada 4= decimos que es estacional
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=46)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
# Ajustar el modelo nnetar
modelo <- nnetar(y)
# Generar pronósticos
pronosticos <- forecast(modelo, h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
accuracy(modelo) #para los errores## ME RMSE MAE MPE MAPE MASE
## Training set -0.0006989074 0.1074329 0.07578087 -23.91274 49.57177 0.3987012
## ACF1
## Training set -0.105779
# Generar pronósticos
pronosticos <- forecast(modelo, h=46)
# Imprimir los pronósticos
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
# Ajustar el modelo DOT
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
# Ajustar el modelo DOT
modelo_dot <- dotm(f , h=46)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)## Warning: package 'ForecastComb' was built under R version 4.2.3
citation('ForecastComb')##
## To cite package 'ForecastComb' in publications use:
##
## Weiss CE, Roetzer GR, Raviv E (2018). _ForecastComb: Forecast
## Combination Methods_. R package version 1.3.1,
## <https://CRAN.R-project.org/package=ForecastComb>.
##
## A BibTeX entry for LaTeX users is
##
## @Manual{,
## title = {ForecastComb: Forecast Combination Methods},
## author = {Christoph E. Weiss and Gernot R. Roetzer and Eran Raviv},
## year = {2018},
## note = {R package version 1.3.1},
## url = {https://CRAN.R-project.org/package=ForecastComb},
## }
##
## ATTENTION: This citation information has been auto-generated from the
## package DESCRIPTION file and may need manual editing, see
## 'help("citation")'.
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 46 5
preds<-matrix(preds,46,5)
obs<-window(y,start=c(2020,6), end=c(2024,3))
length(obs)## [1] 46
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:40]
train_p <- preds[1:40,]
test_o <- obs[41:46]
test_p <- preds[41:46,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Test
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test
indices_tres_meses<-newpreds%*%modelo_InvW$Weights ####################### guardamos índice
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test
predict(modelo_MED,newpreds)## [1] 3.137445 3.138417 3.139535 3.140794 3.142190 3.143718 3.145373 3.147153
## [9] 3.149052 3.151067 3.153194 3.155431
## attr(,"tsp")
## [1] 2024.250 2025.167 12.000
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0.4
accuracy_TA <- modelo_TA$Accuracy_Test
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0.5
accuracy_WA <- modelo_WA$Accuracy_Testlibrary(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X6_meses" , ]
datos <- datos[95:nrow(datos), ]
y=ts(rev(datos$Valor),
start=c(2008,11),
frequency = 12)
autoplot(y)f<-window(y,start=c(2011,1),end=c(2020,11))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=41,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 41, level = 95)
predicciones_holt<-holt$mean
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1574: log likelihood = -90.96
## AIC=183.92 AICc=183.94 BIC=187.14
actividad_arima<-Arima(y,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1574: log likelihood = -90.96
## AIC=183.92 AICc=183.94 BIC=187.14
actividad_arima<-Arima(f,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=41)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
# Ajustar el modelo nnetar
modelo <- nnetar(y)
# Generar pronósticos
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
# Generar pronósticos
pronosticos <- forecast(modelo, h=41)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
# Ajustar el modelo DOT
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
# Ajustar el modelo DOT
modelo_dot <- dotm(f , h=41)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
preds<-matrix(preds,41,5)
obs<-window(y,start=c(2020,11), end=c(2024,3))
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:35]
length(train_o)## [1] 35
train_p <- preds[1:35,]
test_o <- obs[36:41]
test_p <- preds[36:41,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)## Training set prediction matrix is not full rank. Algorithm to remove linearly dependent models started.
## The input matrix is not full rank. The indices of the linearly dependent models are: 1, 2, 3
## Of these models, model 2 had the highest RMSE and was removed.
## Checking if the revised matrix is full rank.
## The revised matrix is now full rank.
# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Test
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test###################
indices_seis_meses<-modelo_MED$Predict(modelo_MED,newpreds = newpreds)
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_TA <- modelo_TA$Accuracy_Test###################
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0.1
accuracy_WA <- modelo_WA$Accuracy_Testlibrary(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
datos <- datos[datos$Periodo == "X9_meses" , ]
datos <- datos[146:nrow(datos), ]
y=ts((datos$Valor),
start=c(2013,2),
frequency = 12)
autoplot(y)f<-window(y,start=c(2013,2),c(2020,11))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=41,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 41, level = 95)
predicciones_holt<-holt$mean
###ARIMA nuevas
auto.arima(y)## Series: y
## ARIMA(0,2,1)
##
## Coefficients:
## ma1
## -0.8463
## s.e. 0.0592
##
## sigma^2 = 0.02679: log likelihood = 51.48
## AIC=-98.97 AICc=-98.88 BIC=-93.2
actividad_arima<-Arima(y,
order=c(0,1,1),
seasonal =c(0,0,1),
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(f)## Series: f
## ARIMA(0,1,2) with drift
##
## Coefficients:
## ma1 ma2 drift
## -0.2812 -0.2313 -0.0176
## s.e. 0.0993 0.0925 0.0060
##
## sigma^2 = 0.01429: log likelihood = 66.99
## AIC=-125.98 AICc=-125.53 BIC=-115.85
actividad_arima<-Arima(f,
order=c(0,1,1),
seasonal =c(0,0,1),
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=41)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
modelo <- nnetar(y)
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
pronosticos <- forecast(modelo, h=41)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
modelo_dot <- dotm(f , h=41)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
preds<-matrix(preds,41,5)
obs<-window(y,start=c(2020,11), end=c(2024,3))
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:35]
length(train_o)## [1] 35
train_p <- preds[1:35,]
test_o <- obs[36:41]
test_p <- preds[36:41,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Tes;accuracy_EIG2## ME RMSE MAE MPE MAPE
## Test set -0.9121069 0.9962732 0.9121069 -25.64722 25.64722
newpreds%*%modelo$Weights## [,1]
## [1,] 2.8437909
## [2,] 2.1796053
## [3,] 1.2404066
## [4,] -0.1543918
## [5,] -1.3923615
## [6,] -2.7535799
## [7,] -4.3587457
## [8,] -5.9394642
## [9,] -7.4064050
## [10,] -8.9797760
## [11,] -10.6659590
## [12,] -12.4860437
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test;accuracy_BG## ME RMSE MAE MPE MAPE
## Test set 4.507365 4.508774 4.507365 125.0534 125.0534
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test;accuracy_InvW ## ME RMSE MAE MPE MAPE
## Test set 4.35519 4.356745 4.35519 120.8242 120.8242
indices_nueve_meses<-newpreds%*%modelo_InvW$Weights
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test;accuracy_MED## ME RMSE MAE MPE MAPE
## Test set 4.877956 4.879064 4.877956 135.3531 135.3531
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test;accuracy_SA## ME RMSE MAE MPE MAPE
## Test set 4.575235 4.576582 4.575235 126.9397 126.9397
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_TA <- modelo_TA$Accuracy_Test;accuracy_TA## ME RMSE MAE MPE MAPE
## Test set 4.575235 4.576582 4.575235 126.9397 126.9397
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_WA <- modelo_WA$Accuracy_Test;accuracy_WA## ME RMSE MAE MPE MAPE
## Test set 4.575235 4.576582 4.575235 126.9397 126.9397
library(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
datos <- datos[datos$Periodo == "X12_meses" , ]
datos <- datos[1:nrow(datos), ]
y=ts((datos$Valor),
start=c(2001,1),
frequency = 12)
autoplot(y)f<-window(y,end=c(2014,1))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=123,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 123, level = 95)
predicciones_holt<-holt$mean
###ARIMA nuevas
auto.arima(y)## Series: y
## ARIMA(3,1,3)(0,0,2)[12]
##
## Coefficients:
## ar1 ar2 ar3 ma1 ma2 ma3 sma1 sma2
## -0.4979 0.0513 0.3097 0.6469 0.0614 -0.4913 0.1218 0.0810
## s.e. 0.4235 0.4942 0.2770 0.4113 0.5353 0.3501 0.0641 0.0558
##
## sigma^2 = 0.1022: log likelihood = -73.78
## AIC=165.56 AICc=166.23 BIC=198.21
actividad_arima<-Arima(y,
order=c(3,1,3),
seasonal =c(0,0,2),
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(f)## Series: f
## ARIMA(0,1,0)(0,0,1)[12]
##
## Coefficients:
## sma1
## 0.1391
## s.e. 0.0722
##
## sigma^2 = 0.1741: log likelihood = -84.61
## AIC=173.22 AICc=173.3 BIC=179.32
actividad_arima<-Arima(f,
order=c(3,1,3),
seasonal =c(0,0,2),
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=123)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
modelo <- nnetar(y)
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
pronosticos <- forecast(modelo, h=123)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
modelo_dot <- dotm(f , h=123)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 123 5
preds<-matrix(preds,123,5)
obs<-window(y,start=c(2014,1), end=c(2024,3))
length(obs)## [1] 123
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:100]
length(train_o)## [1] 100
train_p <- preds[1:100,]
test_o <- obs[101:123]
test_p <- preds[101:123,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Tes;accuracy_EIG2## ME RMSE MAE MPE MAPE
## Test set 5.644442 5.966122 5.644442 286.3536 286.3536
newpreds%*%modelo$Weights## [,1]
## [1,] 107816689
## [2,] 32195061
## [3,] -46190975
## [4,] -54351409
## [5,] -33451643
## [6,] -64393511
## [7,] -59748611
## [8,] -8079544
## [9,] -127280086
## [10,] -99677470
## [11,] -75037102
## [12,] -152427201
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test;accuracy_BG## ME RMSE MAE MPE MAPE
## Test set 4.091971 4.283664 4.091971 223.3733 223.3733
indices_doce_meses<-newpreds%*%modelo_BG$Weights
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test;accuracy_InvW ## ME RMSE MAE MPE MAPE
## Test set 3.727384 3.943813 3.727384 180.659 180.659
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test;accuracy_MED## ME RMSE MAE MPE MAPE
## Test set 2.734071 2.998076 2.734814 95.79174 96.62703
predict(modelo_MED,newpreds)## [1] 3.507592 3.505201 3.599402 3.615292 3.498027 3.495635 3.493244 3.484849
## [9] 3.488461 3.478561 3.475417 3.481287
## attr(,"tsp")
## [1] 2024.250 2025.167 12.000
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test;accuracy_SA## ME RMSE MAE MPE MAPE
## Test set 3.020494 3.294187 3.02953 102.6736 112.8265
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0.2
accuracy_TA <- modelo_TA$Accuracy_Test;accuracy_TA## ME RMSE MAE MPE MAPE
## Test set 3.09407 3.327819 3.09407 131.3187 131.3187
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0.25
accuracy_WA <- modelo_WA$Accuracy_Test;accuracy_WA## ME RMSE MAE MPE MAPE
## Test set 3.16607 3.394527 3.16607 138.4241 138.4241
indices<-cbind( indices_tres_meses,indices_seis_meses, indices_nueve_meses, indices_doce_meses)
indices<-data.frame(indices) ###poner nombres a las columnas
colnames(indices) <- c("Tres meses", "Seis meses", "Nueve meses", "Doce meses")beneficio<-0
beneficio_total <- 0
inversion<-1000000
inversion_inicial<-1000000
posiciones <- c(1, 4, 7, 10)
resultados_3meses <- data.frame(Beneficio_Total = numeric(),Beneficio_operacion = numeric(),Beneficio_residual=numeric() )
# Iteramos sobre las columnas del dataframe
for (i in posiciones) {
# Obtenemos el beneficio multiplicando el primer elemento de la columna por el valor introducido por el usuario
beneficio_operacion<-indices[i, 1]/100 * inversion * 3/12
beneficio_neto<-calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio+beneficio_neto
beneficio_total<-beneficio_total+beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_3meses<- data.frame( Beneficio_Total_Acumulado = beneficio_total,Beneficio_Operacion_Neto = beneficio_neto)
}
resultados_3meses| Beneficio_Total_Acumulado | Beneficio_Operacion_Neto |
|---|---|
| 31071.66 | 7967.01 |
tres_meses<-resultados_3meses[nrow(resultados_3meses), 1]beneficio <- 0
beneficio_total <- 0
inversion <- 1000000
inversion_inicial <- 1000000
posiciones <- c(1, 7)
resultados_6meses <- data.frame(Beneficio_Total_Acumulado = numeric(), Beneficio_Operacion_Neto = numeric(), Beneficio_residual = numeric())
# Iteramos sobre las posiciones específicas
for (i in posiciones) {
# Obtenemos el beneficio multiplicando el primer elemento de la columna por el valor introducido por el usuario
beneficio_operacion <- indices[i, 2] / 100 * inversion * 6 / 12
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_6meses <-data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto)
if (nrow(resultados_6meses) == 2) break
}
resultados_6meses| Beneficio_Total_Acumulado | Beneficio_Operacion_Neto |
|---|---|
| 25629.03 | 12804.87 |
seis_meses<-resultados_6meses[nrow(resultados_6meses), 1]beneficio <- 0
beneficio_total <- 0
inversion <- 1000000
inversion_inicial <- 1000000
resultados_9_3_meses <- data.frame(Beneficio_Total_Acumulado = numeric(), Beneficio_Operacion_Neto = numeric())
# Iteramos sobre las posiciones específicas
# Obtenemos el beneficio multiplicando el primer elemento de la columna por el valor introducido por el usuario
beneficio_operacion <- indices[1, 3] / 100 * inversion * 9 / 12
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_9_3_meses <-data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto)
beneficio_operacion <- indices[10, 1] / 100 * inversion * 3 / 12
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_9_3_meses <- rbind(resultados_9_3_meses, data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto))
resultados_9_3_meses| Beneficio_Total_Acumulado | Beneficio_Operacion_Neto |
|---|---|
| 26670.38 | 26670.380 |
| 34660.75 | 7990.374 |
nueve_tres_meses<-resultados_9_3_meses[nrow(resultados_9_3_meses), 1]beneficio <- 0
beneficio_total <- 0
inversion <- 1000000
inversion_inicial <- 1000000
resultados_3_9_meses <- data.frame(Beneficio_Total_Acumulado = numeric(), Beneficio_Operacion_Neto = numeric())
# Iteramos sobre las posiciones específicas
# Obtenemos el beneficio multiplicando el primer elemento de la columna por el valor introducido por el usuario
beneficio_operacion <- indices[1, 1] / 100 * inversion * 3 / 12
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_3_9_meses <-data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto)
beneficio_operacion <- indices[4, 3] / 100 * inversion * 9 / 12
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
while (beneficio / 1000 >= 1) {
inversion <- inversion + 1000
beneficio <- beneficio - 1000
}
resultados_3_9_meses <- rbind(resultados_3_9_meses, data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto))
resultados_3_9_meses| Beneficio_Total_Acumulado | Beneficio_Operacion_Neto |
|---|---|
| 7749.481 | 7749.481 |
| 33685.340 | 25935.860 |
tres_nueve_meses<-resultados_3_9_meses[nrow(resultados_3_9_meses), 1]beneficio <- 0
beneficio_total <- 0
inversion <- 1000000
inversion_inicial <- 1000000
resultados_12meses <- data.frame(Beneficio_Total_Acumulado = numeric(), Beneficio_Operacion_Neto = numeric())
# Iteramos sobre las posiciones específicas
# Obtenemos el beneficio multiplicando el primer elemento de la columna por el valor introducido por el usuario
beneficio_operacion <- indices[1, 4] / 100 * inversion
beneficio_neto <- calcular_neto_corto(beneficio_operacion)
beneficio <- beneficio + beneficio_neto
beneficio_total <- beneficio_total + beneficio_neto
resultados_12meses <- data.frame(Beneficio_Total_Acumulado = beneficio_total, Beneficio_Operacion_Neto = beneficio_neto)
resultados_12meses| Beneficio_Total_Acumulado | Beneficio_Operacion_Neto |
|---|---|
| 33851.93 | 33851.93 |
doce_meses<-resultados_12meses[nrow(resultados_12meses), 1]# Crear un vector con los valores de las variables
rentabilidades <- c(tres_meses, seis_meses, tres_nueve_meses, nueve_tres_meses, doce_meses)
# Crear un vector con los nombres de las variables
nombres_variables <- c("4 inversiones a 3 meses", "2 inversiones a 6 meses", "1 inversión a 3 meses y otra a 9", "1 inversión a 9 meses y otra a 3", "1 inversión a 12 meses ")
# Ordenar los valores de las rentabilidades de mayor a menor
ranking <- sort(rentabilidades, decreasing = TRUE)
# Imprimir el ranking
cat("Ranking de rentabilidad:\n")## Ranking de rentabilidad:
for (i in 1:length(ranking)) {
cat(i, ": ", nombres_variables[which(rentabilidades == ranking[i])], " - ", format(ranking[i], big.mark = ".", decimal.mark = ",", nsmall = 2), "€\n")
}## 1 : 1 inversión a 9 meses y otra a 3 - 34.660,75 €
## 2 : 1 inversión a 12 meses - 33.851,93 €
## 3 : 1 inversión a 3 meses y otra a 9 - 33.685,34 €
## 4 : 4 inversiones a 3 meses - 31.071,66 €
## 5 : 2 inversiones a 6 meses - 25.629,03 €
ranking <- sort(rentabilidades, decreasing = FALSE)
nombres_variables <- c("1 inversión a 9 meses y otra a 3", "1 inversión a 12 meses ","1 inversión a 3 meses y otra a 9","4 inversiones a 3 meses", "2 inversiones a 6 meses")
colores_azules <- colorRampPalette(c("#00688B", "#009ACD", "#00BFFF", "lightblue", "darkslategray1"))(length(ranking))
colores_azules_2 <- colorRampPalette(c("darkslategray1", "lightblue", "#00BFFF", "#009ACD", "#00688B"))(length(ranking))
par(mar = c(5, 4, 4, 5))
bp <-barplot(ranking,
names.arg = rep("", length(ranking)),
horiz = TRUE,
col = colores_azules,
xlab = "Beneficio neto",
ylab = "Inversiones",
main = "Beneficios de las inversiones según Forecastcomb",
las = 1,
xlim = c(0, max(ranking) * 1.98))
valores_formateados <- sprintf("%.2f €", round(ranking, 2))
text(ranking, bp, labels = valores_formateados, pos = 4, cex = 0.8, col = "black")
legend(x = max(ranking) * 1.3, y = max(bp), legend = nombres_variables, fill = colores_azules_2, title = "Inversiones", xpd = TRUE)####3 años
library(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X3_anos" , ]
datos <- datos[95:nrow(datos), ]
y=ts(rev(datos$Valor),
start=c(2008,11),
frequency = 12)
autoplot(y)f<-window(y,start=c(2011,1),end=c(2020,11))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=41,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 41, level = 95)
predicciones_holt<-holt$mean
auto.arima(y)## Series: y
## ARIMA(1,1,1)(0,0,1)[12]
##
## Coefficients:
## ar1 ma1 sma1
## -0.9090 0.7127 0.1237
## s.e. 0.0578 0.1012 0.0809
##
## sigma^2 = 0.1559: log likelihood = -88.93
## AIC=185.86 AICc=186.08 BIC=198.72
actividad_arima<-Arima(y,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(y)## Series: y
## ARIMA(1,1,1)(0,0,1)[12]
##
## Coefficients:
## ar1 ma1 sma1
## -0.9090 0.7127 0.1237
## s.e. 0.0578 0.1012 0.0809
##
## sigma^2 = 0.1559: log likelihood = -88.93
## AIC=185.86 AICc=186.08 BIC=198.72
actividad_arima<-Arima(f,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=41)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
# Ajustar el modelo nnetar
modelo <- nnetar(y)
# Generar pronósticos
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
# Generar pronósticos
pronosticos <- forecast(modelo, h=41)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
# Ajustar el modelo DOT
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
# Ajustar el modelo DOT
modelo_dot <- dotm(f , h=41)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 41 5
preds<-matrix(preds,41,5)
obs<-window(y,start=c(2020,11), end=c(2024,3))
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:35]
length(train_o)## [1] 35
train_p <- preds[1:35,]
test_o <- obs[36:41]
test_p <- preds[36:41,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)## Training set prediction matrix is not full rank. Algorithm to remove linearly dependent models started.
## The input matrix is not full rank. The indices of the linearly dependent models are: 1, 2, 3
## Of these models, model 3 had the highest RMSE and was removed.
## Checking if the revised matrix is full rank.
## The revised matrix is now full rank.
# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Test
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test
newpreds[,-1]%*%modelo_BG$Weights## [,1]
## [1,] 2.866441
## [2,] 3.430955
## [3,] 4.410895
## [4,] 3.215096
## [5,] 3.342913
## [6,] 3.302461
## [7,] 3.617683
## [8,] 3.131463
## [9,] 3.267583
## [10,] 2.912604
## [11,] 3.531205
## [12,] 2.818358
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test
indices_tres_anos<-newpreds[,-3]%*%modelo_InvW$Weights
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0.25
accuracy_TA <- modelo_TA$Accuracy_Test###################
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0.34
accuracy_WA <- modelo_WA$Accuracy_Test####5 años
library(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X5_anos" , ]
datos <- datos[94:nrow(datos), ]
y=ts(rev(datos$Valor),
start=c(2008,10),
frequency = 12)
autoplot(y)f<-window(y,start=c(2011,1),end=c(2020,11))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=41,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 41, level = 95)
predicciones_holt<-holt$mean
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1232: log likelihood = -68.84
## AIC=139.68 AICc=139.7 BIC=142.9
actividad_arima<-Arima(y,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1232: log likelihood = -68.84
## AIC=139.68 AICc=139.7 BIC=142.9
actividad_arima<-Arima(f,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=41)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
# Ajustar el modelo nnetar
modelo <- nnetar(y)
# Generar pronósticos
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
# Generar pronósticos
pronosticos <- forecast(modelo, h=41)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
# Ajustar el modelo DOT
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
# Ajustar el modelo DOT
modelo_dot <- dotm(f , h=41)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 41 5
preds<-matrix(preds,41,5)
obs<-window(y,start=c(2020,11), end=c(2024,3))
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:35]
length(train_o)## [1] 35
train_p <- preds[1:35,]
test_o <- obs[36:41]
test_p <- preds[36:41,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)## Training set prediction matrix is not full rank. Algorithm to remove linearly dependent models started.
## The input matrix is not full rank. The indices of the linearly dependent models are: 1, 2, 3
## Of these models, model 1 had the highest RMSE and was removed.
## Checking if the revised matrix is full rank.
## The revised matrix is now full rank.
# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Test
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test #########
indices_cinco_anos<-newpreds[,-1]%*%modelo_InvW$Weights
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Tes
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0.25
accuracy_TA <- modelo_TA$Accuracy_Test
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0.34
accuracy_WA <- modelo_WA$Accuracy_Test####10 años
library(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X10_anos" , ]
datos <- datos[98:nrow(datos), ]
y=ts(rev(datos$Valor),
start=c(2009,2),
frequency = 12)
autoplot(y)f<-window(y,start=c(2011,1),end=c(2021,2))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=38,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 38, level = 95)
predicciones_holt<-holt$mean
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1147: log likelihood = -60.87
## AIC=123.75 AICc=123.77 BIC=126.95
actividad_arima<-Arima(y,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1147: log likelihood = -60.87
## AIC=123.75 AICc=123.77 BIC=126.95
actividad_arima<-Arima(f,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=38)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
# Ajustar el modelo nnetar
modelo <- nnetar(y)
# Generar pronósticos
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
# Generar pronósticos
pronosticos <- forecast(modelo, h=38)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
# Ajustar el modelo DOT
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
# Ajustar el modelo DOT
modelo_dot <- dotm(f , h=38)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 38 5
preds<-matrix(preds,38,5)
obs<-window(y,start=c(2021,2), end=c(2024,3))
length(obs)## [1] 38
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:33]
length(train_o)## [1] 33
train_p <- preds[1:33,]
test_o <- obs[34:38]
test_p <- preds[34:38,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)## Training set prediction matrix is not full rank. Algorithm to remove linearly dependent models started.
## The input matrix is not full rank. The indices of the linearly dependent models are: 1, 2, 3
## Of these models, model 3 had the highest RMSE and was removed.
## Checking if the revised matrix is full rank.
## The revised matrix is now full rank.
# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Test
indices_diez_anos<-modelo$Predict(modelo,newpreds = newpreds[,-3])
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test
newpreds[,-1]%*%modelo_InvW$Weights## [,1]
## [1,] 4.582563
## [2,] 4.472874
## [3,] 4.620003
## [4,] 4.571841
## [5,] 4.564057
## [6,] 4.636753
## [7,] 4.731881
## [8,] 4.891689
## [9,] 4.895124
## [10,] 4.986868
## [11,] 4.854235
## [12,] 4.840904
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_TA <- modelo_TA$Accuracy_Tes
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_WA <- modelo_WA$Accuracy_Testlibrary(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X3_meses" , ]
datos <- datos[94:nrow(datos), ]
y=ts(rev(datos$Valor),
start=c(2008,10),
frequency = 12)f<-window(y,start=c(2011,1),end=c(2020,5))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=35,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 35, level = 95)
predicciones_holt<-holt$mean
###ARIMA nuevas
auto.arima(y)## Series: y
## ARIMA(0,1,1)(0,0,1)[12]
##
## Coefficients:
## ma1 sma1
## -0.2033 0.2327
## s.e. 0.0783 0.0736
##
## sigma^2 = 0.1786: log likelihood = -102.53
## AIC=211.06 AICc=211.19 BIC=220.72
actividad_arima<-Arima(y,
order=c(0,1,1), # arma estacional diferenciacion estacional
seasonal =c(0,0,1), # baja cada 4= decimos que es estacional
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(y)## Series: y
## ARIMA(0,1,1)(0,0,1)[12]
##
## Coefficients:
## ma1 sma1
## -0.2033 0.2327
## s.e. 0.0783 0.0736
##
## sigma^2 = 0.1786: log likelihood = -102.53
## AIC=211.06 AICc=211.19 BIC=220.72
actividad_arima<-Arima(f,
order=c(0,1,1), # arma estacional diferenciacion estacional
seasonal =c(0,0,1), # baja cada 4= decimos que es estacional
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=35)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
# Ajustar el modelo nnetar
modelo <- nnetar(y)
# Generar pronósticos
pronosticos <- forecast(modelo, h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
accuracy(modelo) #para los errores## ME RMSE MAE MPE MAPE MASE
## Training set -0.0001002032 0.1108833 0.07729607 -23.77392 49.89867 0.4066731
## ACF1
## Training set -0.1172348
# Generar pronósticos
pronosticos <- forecast(modelo, h=35)
# Imprimir los pronósticos
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
# Ajustar el modelo DOT
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
# Ajustar el modelo DOT
modelo_dot <- dotm(f , h=35)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
citation('ForecastComb')##
## To cite package 'ForecastComb' in publications use:
##
## Weiss CE, Roetzer GR, Raviv E (2018). _ForecastComb: Forecast
## Combination Methods_. R package version 1.3.1,
## <https://CRAN.R-project.org/package=ForecastComb>.
##
## A BibTeX entry for LaTeX users is
##
## @Manual{,
## title = {ForecastComb: Forecast Combination Methods},
## author = {Christoph E. Weiss and Gernot R. Roetzer and Eran Raviv},
## year = {2018},
## note = {R package version 1.3.1},
## url = {https://CRAN.R-project.org/package=ForecastComb},
## }
##
## ATTENTION: This citation information has been auto-generated from the
## package DESCRIPTION file and may need manual editing, see
## 'help("citation")'.
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 35 5
preds<-matrix(preds,35,5)
obs<-window(y,start=c(2020,6), end=c(2023,4))
length(obs)## [1] 35
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:29]
train_p <- preds[1:29,]
test_o <- obs[30:35]
test_p <- preds[30:35,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)
# Evaluating all the forecast combination methods and returning the best.
# If necessary, it uses the built-in automated parameter optimisation methods
# for the different methods.
modelo<-comb_EIG2(data)
modelo$Accuracy_Test## ME RMSE MAE MPE MAPE
## Test set 2.266546 2.320136 2.266546 554.054 554.054
modelo$Predict(modelo,newpreds=newpreds)## [1] 57.11325 56.35855 56.22684 56.74451 56.57322 56.87752 57.31191 57.63254
## [9] 58.27276 60.04296 61.18425 62.66472
#comb_EIG4(data, ntop_pred = 2, criterion = 'MAE')# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Test
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test
predict(modelo_MED,newpreds)## [1] 3.137445 3.138417 3.139535 3.140794 3.142190 3.143718 3.145373 3.147153
## [9] 3.149052 3.151067 3.153194 3.155431
## attr(,"tsp")
## [1] 2024.250 2025.167 12.000
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_TA <- modelo_TA$Accuracy_Test
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0.12
accuracy_WA <- modelo_WA$Accuracy_Testlibrary(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X6_meses" , ]
datos <- datos[95:nrow(datos), ]
y=ts(rev(datos$Valor),
start=c(2008,11),
frequency = 12)f<-window(y,start=c(2011,1),end=c(2020,11))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=30,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 30, level = 95)
predicciones_holt<-holt$mean
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1574: log likelihood = -90.96
## AIC=183.92 AICc=183.94 BIC=187.14
actividad_arima<-Arima(y,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1574: log likelihood = -90.96
## AIC=183.92 AICc=183.94 BIC=187.14
actividad_arima<-Arima(f,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=30)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
# Ajustar el modelo nnetar
modelo <- nnetar(y)
# Generar pronósticos
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
# Generar pronósticos
pronosticos <- forecast(modelo, h=30)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
# Ajustar el modelo DOT
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
# Ajustar el modelo DOT
modelo_dot <- dotm(f , h=30)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 30 5
preds<-matrix(preds,30,5)
obs<-window(y,start=c(2020,11), end=c(2023,4))
length(obs)## [1] 30
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:24]
length(train_o)## [1] 24
train_p <- preds[1:24,]
test_o <- obs[25:30]
test_p <- preds[25:30,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)## Training set prediction matrix is not full rank. Algorithm to remove linearly dependent models started.
## The input matrix is not full rank. The indices of the linearly dependent models are: 1, 2, 3
## Of these models, model 2 had the highest RMSE and was removed.
## Checking if the revised matrix is full rank.
## The revised matrix is now full rank.
# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Test
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test###################
-modelo_MED$Predict(modelo_MED,newpreds = newpreds)## [1] -2.568685 -2.562370 -2.556054 -2.549739 -2.543424 -2.538910 -2.534408
## [8] -2.529907 -2.525405 -2.520904 -2.516402 -2.511901
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_TA <- modelo_TA$Accuracy_Test###################
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_WA <- modelo_WA$Accuracy_Testlibrary(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
datos <- datos[datos$Periodo == "X9_meses" , ]
datos <- datos[146:nrow(datos), ]
y=ts((datos$Valor),
start=c(2013,2),
frequency = 12)f<-window(y,start=c(2013,2),c(2020,11))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=30,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 30, level = 95)
predicciones_holt<-holt$mean
###ARIMA nuevas
auto.arima(y)## Series: y
## ARIMA(0,2,1)
##
## Coefficients:
## ma1
## -0.8463
## s.e. 0.0592
##
## sigma^2 = 0.02679: log likelihood = 51.48
## AIC=-98.97 AICc=-98.88 BIC=-93.2
actividad_arima<-Arima(y,
order=c(0,1,1),
seasonal =c(0,0,1),
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(f)## Series: f
## ARIMA(0,1,2) with drift
##
## Coefficients:
## ma1 ma2 drift
## -0.2812 -0.2313 -0.0176
## s.e. 0.0993 0.0925 0.0060
##
## sigma^2 = 0.01429: log likelihood = 66.99
## AIC=-125.98 AICc=-125.53 BIC=-115.85
actividad_arima<-Arima(f,
order=c(0,1,1),
seasonal =c(0,0,1),
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=30)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
modelo <- nnetar(y)
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
pronosticos <- forecast(modelo, h=30)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
modelo_dot <- dotm(f , h=30)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 30 5
preds<-matrix(preds,30,5)
obs<-window(y,start=c(2020,11), end=c(2023,4))
length(obs)## [1] 30
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:24]
length(train_o)## [1] 24
train_p <- preds[1:24,]
test_o <- obs[25:30]
test_p <- preds[25:30,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Tes;accuracy_EIG2## ME RMSE MAE MPE MAPE
## Test set 1.139805 1.14732 1.139805 40.73981 40.73981
newpreds%*%modelo$Weights## [,1]
## [1,] 3.07532169
## [2,] 2.60695334
## [3,] 1.93811233
## [4,] 0.93312779
## [5,] 0.01585775
## [6,] -0.99025893
## [7,] -2.13359685
## [8,] -3.23531171
## [9,] -4.25348676
## [10,] -5.34109816
## [11,] -6.51709873
## [12,] -7.80954895
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test;accuracy_BG## ME RMSE MAE MPE MAPE
## Test set 3.563585 3.578612 3.563585 127.5573 127.5573
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test;accuracy_InvW ## ME RMSE MAE MPE MAPE
## Test set 3.481224 3.496274 3.481224 124.5918 124.5918
indices_nueve_meses<-newpreds%*%modelo_InvW$Weights
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test;accuracy_MED## ME RMSE MAE MPE MAPE
## Test set 3.880134 3.895357 3.880134 138.9434 138.9434
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test;accuracy_SA## ME RMSE MAE MPE MAPE
## Test set 3.650442 3.665496 3.650442 130.6826 130.6826
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_TA <- modelo_TA$Accuracy_Test;accuracy_TA## ME RMSE MAE MPE MAPE
## Test set 3.650442 3.665496 3.650442 130.6826 130.6826
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_WA <- modelo_WA$Accuracy_Test;accuracy_WA## ME RMSE MAE MPE MAPE
## Test set 3.650442 3.665496 3.650442 130.6826 130.6826
library(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
datos <- datos[datos$Periodo == "X12_meses" , ]
datos <- datos[1:nrow(datos), ]
y=ts((datos$Valor),
start=c(2001,1),
frequency = 12)f<-window(y,end=c(2014,1))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=112,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 112, level = 95)
predicciones_holt<-holt$mean
###ARIMA nuevas
auto.arima(y)## Series: y
## ARIMA(3,1,3)(0,0,2)[12]
##
## Coefficients:
## ar1 ar2 ar3 ma1 ma2 ma3 sma1 sma2
## -0.4979 0.0513 0.3097 0.6469 0.0614 -0.4913 0.1218 0.0810
## s.e. 0.4235 0.4942 0.2770 0.4113 0.5353 0.3501 0.0641 0.0558
##
## sigma^2 = 0.1022: log likelihood = -73.78
## AIC=165.56 AICc=166.23 BIC=198.21
actividad_arima<-Arima(y,
order=c(3,1,3),
seasonal =c(0,0,2),
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(f)## Series: f
## ARIMA(0,1,0)(0,0,1)[12]
##
## Coefficients:
## sma1
## 0.1391
## s.e. 0.0722
##
## sigma^2 = 0.1741: log likelihood = -84.61
## AIC=173.22 AICc=173.3 BIC=179.32
actividad_arima<-Arima(f,
order=c(3,1,3),
seasonal =c(0,0,2),
include.drift=TRUE)
arima_forecast<-forecast(actividad_arima, h=112)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
modelo <- nnetar(y)
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
pronosticos <- forecast(modelo, h=112)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
modelo_dot <- dotm(f , h=112)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 112 5
preds<-matrix(preds,112,5)
obs<-window(y,start=c(2014,1), end=c(2023,4))
length(obs)## [1] 112
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:90]
length(train_o)## [1] 90
train_p <- preds[1:90,]
test_o <- obs[91:112]
test_p <- preds[91:112,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Tes;accuracy_EIG2## ME RMSE MAE MPE MAPE
## Test set 1.178847 1.844486 1.290127 94.67623 100.4859
newpreds%*%modelo$Weights## [,1]
## [1,] 1.133015
## [2,] 2.321134
## [3,] 3.563636
## [4,] 3.349617
## [5,] 2.772721
## [6,] 3.074544
## [7,] 2.635940
## [8,] 1.416701
## [9,] 3.599077
## [10,] 2.784741
## [11,] 2.109135
## [12,] 3.284501
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test;accuracy_BG## ME RMSE MAE MPE MAPE
## Test set 2.124121 2.649724 2.124121 104.2086 241.3308
newpreds%*%modelo_BG$Weights## [,1]
## [1,] 3.419172
## [2,] 3.471100
## [3,] 3.523877
## [4,] 3.524399
## [5,] 3.494943
## [6,] 3.510227
## [7,] 3.499396
## [8,] 3.446945
## [9,] 3.524227
## [10,] 3.493991
## [11,] 3.463636
## [12,] 3.517159
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test;accuracy_InvW ## ME RMSE MAE MPE MAPE
## Test set 1.524026 2.261037 1.578446 115.2871 131.3385
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test;accuracy_MED## ME RMSE MAE MPE MAPE
## Test set 0.7103539 1.690844 1.335335 109.4867 110.36
predict(modelo_MED,newpreds)## [1] 3.507592 3.505201 3.599402 3.615292 3.498027 3.495635 3.493244 3.490852
## [9] 3.488461 3.478561 3.483678 3.672421
## attr(,"tsp")
## [1] 2024.250 2025.167 12.000
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test;accuracy_SA## ME RMSE MAE MPE MAPE
## Test set 0.7374993 1.941983 1.577655 130.9102 144.1567
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0.2
accuracy_TA <- modelo_TA$Accuracy_Test;accuracy_TA## ME RMSE MAE MPE MAPE
## Test set 1.07586 1.865265 1.358133 105.7714 105.7714
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0.25
accuracy_WA <- modelo_WA$Accuracy_Test;accuracy_WA## ME RMSE MAE MPE MAPE
## Test set 1.148961 1.906661 1.367203 105.0284 106.5728
####3 años
library(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X3_anos" , ]
datos <- datos[95:nrow(datos), ]
y=ts(rev(datos$Valor),
start=c(2008,11),
frequency = 12)
autoplot(y)f<-window(y,start=c(2011,1),end=c(2020,11))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=30,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 30, level = 95)
predicciones_holt<-holt$mean
auto.arima(y)## Series: y
## ARIMA(1,1,1)(0,0,1)[12]
##
## Coefficients:
## ar1 ma1 sma1
## -0.9090 0.7127 0.1237
## s.e. 0.0578 0.1012 0.0809
##
## sigma^2 = 0.1559: log likelihood = -88.93
## AIC=185.86 AICc=186.08 BIC=198.72
actividad_arima<-Arima(y,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(y)## Series: y
## ARIMA(1,1,1)(0,0,1)[12]
##
## Coefficients:
## ar1 ma1 sma1
## -0.9090 0.7127 0.1237
## s.e. 0.0578 0.1012 0.0809
##
## sigma^2 = 0.1559: log likelihood = -88.93
## AIC=185.86 AICc=186.08 BIC=198.72
actividad_arima<-Arima(f,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=30)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
# Ajustar el modelo nnetar
modelo <- nnetar(y)
# Generar pronósticos
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
# Generar pronósticos
pronosticos <- forecast(modelo, h=30)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
# Ajustar el modelo DOT
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
# Ajustar el modelo DOT
modelo_dot <- dotm(f , h=30)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 30 5
preds<-matrix(preds,30,5)
obs<-window(y,start=c(2020,11), end=c(2023,4))
length(obs)## [1] 30
# Generar observaciones y predicciones
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:24]
length(train_o)## [1] 24
train_p <- preds[1:24,]
test_o <- obs[25:30]
test_p <- preds[25:30,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)## Training set prediction matrix is not full rank. Algorithm to remove linearly dependent models started.
## The input matrix is not full rank. The indices of the linearly dependent models are: 1, 2, 3
## Of these models, model 1 had the highest RMSE and was removed.
## Checking if the revised matrix is full rank.
## The revised matrix is now full rank.
# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Test
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test
newpreds[,-1]%*%modelo_BG$Weights## [,1]
## [1,] 2.838342
## [2,] 3.463587
## [3,] 4.556715
## [4,] 3.240629
## [5,] 3.398346
## [6,] 3.346458
## [7,] 3.697201
## [8,] 3.172421
## [9,] 3.315001
## [10,] 2.914772
## [11,] 3.626523
## [12,] 2.799262
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test
indices_tres_anos<-newpreds[,-3]%*%modelo_InvW$Weights
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_TA <- modelo_TA$Accuracy_Test###################
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0.1
accuracy_WA <- modelo_WA$Accuracy_Test####5 años
library(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X5_anos" , ]
datos <- datos[94:nrow(datos), ]
y=ts(rev(datos$Valor),
start=c(2008,10),
frequency = 12)
autoplot(y)f<-window(y,start=c(2011,1),end=c(2020,11))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=30,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 30, level = 95)
predicciones_holt<-holt$mean
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1232: log likelihood = -68.84
## AIC=139.68 AICc=139.7 BIC=142.9
actividad_arima<-Arima(y,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1232: log likelihood = -68.84
## AIC=139.68 AICc=139.7 BIC=142.9
actividad_arima<-Arima(f,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=30)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
# Ajustar el modelo nnetar
modelo <- nnetar(y)
# Generar pronósticos
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
# Generar pronósticos
pronosticos <- forecast(modelo, h=30)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
# Ajustar el modelo DOT
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
# Ajustar el modelo DOT
modelo_dot <- dotm(f , h=30)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 30 5
preds<-matrix(preds,30,5)
obs<-window(y,start=c(2020,11), end=c(2023,4))
length(obs)## [1] 30
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:24]
length(train_o)## [1] 24
train_p <- preds[1:24,]
test_o <- obs[25:30]
test_p <- preds[25:30,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)## Training set prediction matrix is not full rank. Algorithm to remove linearly dependent models started.
## The input matrix is not full rank. The indices of the linearly dependent models are: 1, 2, 3
## Of these models, model 1 had the highest RMSE and was removed.
## Checking if the revised matrix is full rank.
## The revised matrix is now full rank.
# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Test
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test #########
indices_cinco_anos<-newpreds[,-1]%*%modelo_InvW$Weights
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Tes
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0.25
accuracy_TA <- modelo_TA$Accuracy_Test
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0.34
accuracy_WA <- modelo_WA$Accuracy_Test####10 años
library(forecast)
library(tidyr)
datos=read.csv2("Datos_csv.csv", header = TRUE)
datos<- pivot_longer(datos, -Tiempo, names_to = "Periodo", values_to = "Valor")
#Filtro por 3_meses
datos <- datos[datos$Periodo == "X10_anos" , ]
datos <- datos[98:nrow(datos), ]
y=ts(rev(datos$Valor),
start=c(2009,2),
frequency = 12)
autoplot(y)f<-window(y,start=c(2011,1),end=c(2021,2))
###Método de la deriva 2020-2024
deriva<-rwf(f,h=27,drift=TRUE)
predicciones_deriva<-deriva$mean
###Método de la deriva nuevas
deriva<-rwf(y,h=12,drift=TRUE)
predicciones_deriva_nuevas<-deriva$mean
###Alisado exponencial de Holt nuevas
holt <- holt(y, h = 12, level = 95)
predicciones_holt_nuevas<-holt$mean
###Alisado exponencial de Holt 2024-2024
holt <- holt(f, h = 27, level = 95)
predicciones_holt<-holt$mean
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1147: log likelihood = -60.87
## AIC=123.75 AICc=123.77 BIC=126.95
actividad_arima<-Arima(y,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=12)
predicciones_arima_nuevas<-arima_forecast$mean
###ARIMA de 2020-2024
auto.arima(y)## Series: y
## ARIMA(0,1,0)
##
## sigma^2 = 0.1147: log likelihood = -60.87
## AIC=123.75 AICc=123.77 BIC=126.95
actividad_arima<-Arima(f,
order=c(0,1,0),
include.drift=FALSE)
arima_forecast<-forecast(actividad_arima, h=27)
predicciones_arima<-arima_forecast$mean
#Redes neuronales nuevas
# Ajustar el modelo nnetar
modelo <- nnetar(y)
# Generar pronósticos
pronosticos <- forecast(modelo,h=12)
predicciones_redes_nuevas<-pronosticos$mean
#Redes neuronales 2020-2024
# Ajustar el modelo nnetar
modelo <- nnetar(f)
# Generar pronósticos
pronosticos <- forecast(modelo, h=27)
predicciones_redes<-pronosticos$mean
###Dynamic Optimized Theta Model nuevas
library(forecTheta)
# Ajustar el modelo DOT
modelo_dot <- dotm(y , h=12)
predicciones_dot_nuevas<-modelo_dot$mean
###Dynamic Optimized Theta Model 2020-2024
# Ajustar el modelo DOT
modelo_dot <- dotm(f , h=27)
predicciones_dot<-modelo_dot$mean#install.packages("ForecastComb")
library(ForecastComb)
newpreds = cbind(predicciones_deriva_nuevas, predicciones_arima_nuevas, predicciones_holt_nuevas, predicciones_redes_nuevas, predicciones_dot_nuevas)
preds = cbind(predicciones_deriva, predicciones_arima, predicciones_holt, predicciones_redes, predicciones_dot)
dim(preds)## [1] 27 5
preds<-matrix(preds,27,5)
obs<-window(y,start=c(2021,2), end=c(2023,4))
length(obs)## [1] 27
# Dividir los datos en conjuntos de entrenamiento y prueba
train_o <- obs[1:23]
length(train_o)## [1] 23
train_p <- preds[1:23,]
test_o <- obs[24:27]
test_p <- preds[24:27,]
# Combinar predicciones utilizando foreccomb
data <- foreccomb(train_o, train_p, test_o, test_p)## Training set prediction matrix is not full rank. Algorithm to remove linearly dependent models started.
## The input matrix is not full rank. The indices of the linearly dependent models are: 1, 2, 3
## Of these models, model 3 had the highest RMSE and was removed.
## Checking if the revised matrix is full rank.
## The revised matrix is now full rank.
# Entrenar modelo comb_EIG2
modelo<-comb_EIG2(data)
accuracy_EIG2<-modelo$Accuracy_Test
indices_diez_anos<-modelo$Predict(modelo,newpreds = newpreds[,-3])
# Entrenar modelo comb_BG
modelo_BG <- comb_BG(data)
accuracy_BG <- modelo_BG$Accuracy_Test
# Entrenar modelo comb_InvW
modelo_InvW <- comb_InvW(data)
accuracy_InvW <- modelo_InvW$Accuracy_Test
newpreds[,-1]%*%modelo_InvW$Weights## [,1]
## [1,] 4.588797
## [2,] 4.462987
## [3,] 4.602636
## [4,] 4.544460
## [5,] 4.526867
## [6,] 4.591169
## [7,] 4.675167
## [8,] 4.826576
## [9,] 4.825818
## [10,] 4.914997
## [11,] 4.778783
## [12,] 4.758558
# Entrenar modelo comb_MED
modelo_MED <- comb_MED(data)
accuracy_MED <- modelo_MED$Accuracy_Test
# Entrenar modelo comb_SA
modelo_SA <- comb_SA(data)
accuracy_SA <- modelo_SA$Accuracy_Test
# Entrenar modelo comb_TA
modelo_TA <- comb_TA(data)## Optimization algorithm chooses trim factor for trimmed mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_TA <- modelo_TA$Accuracy_Tes
# Entrenar modelo comb_WA
modelo_WA <- comb_WA(data)## Optimization algorithm chooses trim factor for winsorized mean approach...
## Algorithm finished. Optimized trim factor: 0
accuracy_WA <- modelo_WA$Accuracy_Test| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 1.67 | 1.53 | 1.88 |
| 1.62 | 1.54 | 1.79 |
| 2.20 | 1.87 | 2.05 |
| 2.45 | 1.97 | 7.34 |
| 2.09 | 1.87 | 2.19 |
| 2.08 | 1.92 | 1.81 |
| 1.89 | 1.81 | 1.95 |
| 2.06 | 1.87 | 1.98 |
| 2.37 | 1.97 | 2.15 |
| 3.13 | 2.16 | 2.66 |
| 3.90 | 2.44 | 2.71 |
| 3.54 | 2.31 | 2.46 |
Ahora predecimos con las letras de 6 meses.
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 2.30 | 1.64 | 1.99 |
| 1.98 | 1.54 | 1.89 |
| 1.95 | 1.50 | 1.86 |
| 2.09 | 1.75 | 2.25 |
| 2.03 | 1.72 | 2.28 |
| 1.77 | 0.99 | 1.69 |
| 1.60 | 1.54 | 2.08 |
| 1.58 | 1.50 | 1.86 |
| 1.58 | 1.48 | 1.84 |
| 1.66 | 1.59 | 1.96 |
| 1.88 | 1.79 | 2.15 |
| 1.99 | 1.86 | 2.22 |
A continuación predecimos con las letras de 9 meses.
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 1.02 | 1.15 | 0.84 |
| 0.92 | 1.18 | 0.86 |
| 1.00 | 1.15 | 0.83 |
| 1.05 | 1.20 | 0.85 |
| 0.99 | 1.22 | 0.86 |
| 0.96 | 1.23 | 0.85 |
| 0.96 | 1.26 | 0.87 |
| 0.92 | 1.28 | 0.92 |
| 1.06 | 1.31 | 0.84 |
| 1.07 | 1.31 | 0.83 |
| 1.03 | 1.29 | 0.97 |
| 1.02 | 1.31 | 0.98 |
Por último en el apartado de letras predecimos las de 12 meses.
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 3.08 | 3.18 | 3.33 |
| 3.03 | 3.15 | 3.20 |
| 3.06 | 3.15 | 3.26 |
| 3.10 | 3.19 | 3.33 |
| 3.18 | 3.23 | 3.35 |
| 3.24 | 3.29 | 3.45 |
| 3.30 | 3.33 | 3.50 |
| 3.22 | 3.26 | 3.37 |
| 3.29 | 3.28 | 3.31 |
| 3.20 | 3.21 | 3.38 |
| 3.25 | 3.24 | 3.34 |
| 3.12 | 3.17 | 3.32 |
Bonos a 3 años
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 2.75 | 2.37 | 2.44 |
| 2.90 | 3.34 | 2.96 |
| 3.76 | 5.38 | 3.92 |
| 2.95 | 2.92 | 2.74 |
| 3.43 | 3.47 | 3.05 |
| 3.20 | 3.28 | 2.94 |
| 3.36 | 3.90 | 3.31 |
| 2.86 | 2.93 | 2.84 |
| 3.09 | 3.21 | 2.98 |
| 2.58 | 2.47 | 2.65 |
| 3.80 | 3.95 | 3.36 |
| 2.91 | 2.42 | 2.54 |
Bonos a 5 años
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 4.35 | 6.91 | 6.50 |
| 4.52 | 5.54 | 5.11 |
| 5.14 | 8.44 | 8.07 |
| 5.24 | 2.88 | 2.71 |
| 5.01 | 6.27 | 5.83 |
| 4.75 | 6.15 | 5.81 |
| 4.45 | 7.10 | 6.69 |
| 4.24 | 3.83 | 3.64 |
| 3.89 | 3.85 | 3.70 |
| 4.19 | 13.48 | 11.64 |
| 5.03 | 6.42 | 6.10 |
| 5.48 | 5.74 | 5.47 |
Bonos a 10 años
| percentile.5 | percentile.50 | percentile.95 |
|---|---|---|
| 4.62 | 4.56 | 4.54 |
| 4.87 | 4.45 | 4.43 |
| 4.65 | 4.57 | 4.55 |
| 4.63 | 4.48 | 4.46 |
| 4.83 | 4.47 | 4.45 |
| 4.74 | 4.55 | 4.54 |
| 4.86 | 4.67 | 4.66 |
| 4.93 | 4.81 | 4.80 |
| 5.09 | 4.75 | 4.75 |
| 4.36 | 4.81 | 4.81 |
| 4.74 | 4.66 | 4.66 |
| 4.99 | 4.69 | 4.68 |