## -----------------------------------------------------------------------------
library(MultiATSM)

## ----eval=FALSE---------------------------------------------------------------
# # A) Load database data
# LoadData("BR_2017")
# 
# # B) GENERAL model inputs
# ModelType <- "JPS original"
# 
# Economies <- c("US") # Names of the economies from the economic system
# GlobalVar <- c() # Global Variables
# DomVar <- c("GRO", "INF") # Country-specific variables
# N <- 3 # Number of spanned factors per country
# 
# t0_sample <- "January-1985"
# tF_sample <- "December-2007"
# 
# DataFreq <- "Monthly" # Frequency of the data
# 
# StatQ <- 0 # Stationary condition
# 
# #########################################################################################################
# ############################### NO NEED TO MAKE CHANGES FROM HERE #######################################
# #########################################################################################################
# # 2) Minor preliminary work
# FactorLabels <- LabFac(N, DomVar, GlobalVar, Economies, ModelType)
# 
# Yields <- t(BR_jps_out$Y)
# DomesticMacroVar <- t(BR_jps_out$M.o)
# GlobalMacroVar <- c()
# 
# # 3) Prepare the inputs of the likelihood function
# ATSMInputs <- InputsForOpt(t0_sample, tF_sample, ModelType, Yields, GlobalMacroVar, DomesticMacroVar,
#                            FactorLabels, Economies, DataFreq)
# 
# # 4) Optimization of the model
# ModelPara <- Optimization(ATSMInputs, StatQ, DataFreq, FactorLabels, Economies, ModelType)

## ----echo= FALSE--------------------------------------------------------------
options(scipen = 100) # eliminate the scientific notation
data("BR_jps_gro_R3")
data("JPSrep")

RowsQ <- c("$r0$", "$\\lambda_1$", "$\\lambda_2$", "$\\lambda_3$" )
TableQ <- data.frame(matrix(NA, ncol = 0, nrow =length(RowsQ)))
row.names(TableQ) <- RowsQ

PackageQ<- c(ModelPara$ests$r0, diag(ModelPara$ests$K1XQ))
BRq <- c(BR_jps_out$est.llk$rho0.cP, diag(BR_jps_out$est.llk$KQ.XX))
TableQ$MultiATSM <- PackageQ
TableQ$'BR (2017)' <- BRq

TableQ <- round(TableQ, digits = 5)

suppressWarnings(library(magrittr))

kableExtra::kbl(TableQ, align = "c", caption = "$Q$-dynamics parameters") %>%
  kableExtra::kable_classic("striped", full_width = F)  %>%
  kableExtra::row_spec(0, font_size = 14) %>%
  kableExtra::footnote(general = " $\\lambda$'s are the eigenvalues from the risk-neutral feedback matrix and $r0$ is the long-run mean of the short rate under Q.")

## ----PdynTab, echo= FALSE-----------------------------------------------------
data("BR_jps_gro_R3")
data("JPSrep")

RowsP <- c("PC1", "PC2", "PC3", "GRO", "INF")
ColP <- c(" ", RowsP)

# 1) K0Z and K1Z
# Bauer and Rudebusch coefficients
TablePbr <- data.frame(matrix(NA, ncol = length(ColP), nrow =length(RowsP)))
row.names(TablePbr) <- RowsP
colnames(TablePbr) <- ColP

TablePbr[[ColP[1]]] <- BR_jps_out$est.llk$KP.0Z
for(j in 1:length(RowsP) ){TablePbr[[RowsP[j]]] <- BR_jps_out$est.llk$KP.ZZ[,j]}

TablePbr <- round(TablePbr, digits = 5)

# MultiATSM coefficients
TablePMultiATSM <- data.frame(matrix(NA, ncol = length(ColP), nrow =length(RowsP)))
row.names(TablePMultiATSM) <- RowsP
colnames(TablePMultiATSM) <- ColP

IdxVar <- c(3:5, 1:2) # indexes to flip the order of the spanned and unspanned factors
TablePMultiATSM[[ColP[1]]] <- ModelPara$ests$K0Z[IdxVar]
ModelPara$ests$K1Z <- ModelPara$ests$K1Z[IdxVar,IdxVar]
for(j in 1:length(RowsP) ){ TablePMultiATSM[[RowsP[j]]] <- ModelPara$ests$K1Z[,j]}


TablePMultiATSM <- round(TablePMultiATSM, digits = 5)
TableP <- rbind(TablePbr,TablePMultiATSM)
row.names(TableP) <- c(RowsP,paste(RowsP," ",sep="")) # trick to avoid rows to have the same name

kableExtra::kbl(TableP, align = "c", caption = "$P$-dynamics parameters") %>%
  kableExtra::kable_classic("striped", full_width = F)  %>%
  kableExtra::row_spec(0, font_size = 14) %>%
  kableExtra::add_header_above(c(" "= 1, "K0Z"=1, "K1Z" = 5), bold = T) %>%
  kableExtra::pack_rows("BR (2017)", 1, 5) %>%
  kableExtra::pack_rows("MultiATSM", 6, 10) %>%
  kableExtra::footnote(general = " $K0Z$ is the intercept and $K1Z$ is feedback matrix from the $P$-dynamics.")

## ----echo= FALSE--------------------------------------------------------------
data("BR_jps_gro_R3")
data("JPSrep")

se <- data.frame(BR_jps_out$est.llk$sigma.e, ModelPara$ests$se )
rownames(se) <- "se"
colnames(se) <- c("MultiATSM","BR (2017)")
se <- round(se, digits = 7)

kableExtra::kbl(se, align = "c", caption ="Portfolio of yields with errors") %>%
  kableExtra::kable_classic("striped", full_width = F)  %>%
  kableExtra::row_spec(0, font_size = 14) %>%
  kableExtra::footnote(general = " $se$ is the standard deviation of the portfolio of yields observed with errors.")

## ----eval=FALSE---------------------------------------------------------------
# # A) Load database data
# LoadData("CM_2024")
# 
# # B) GENERAL model inputs
# ModelType <- "GVAR multi" # Options: "GVAR multi" or "JLL original".
# 
# Economies <- c("China", "Brazil", "Mexico", "Uruguay")
# GlobalVar <- c("Gl_Eco_Act", "Gl_Inflation")
# DomVar <- c("Eco_Act", "Inflation")
# N <- 3
# 
# t0_sample <- "01-06-2004"
# tF_sample <- "01-01-2020"
# 
# OutputLabel <- "CM_jfec"
# DataFreq <-"Monthly"
# Folder2Save <- NULL
# 
# StatQ <- 0
# 
# # B.1) SPECIFIC model inputs
# #################################### GVAR-based models ##################################################
# GVARlist <- list( VARXtype = "unconstrained", W_type = "Sample Mean", t_First_Wgvar = "2004",
#                   t_Last_Wgvar = "2019", DataConnectedness <- TradeFlows )
# #################################### JLL-based models ###################################################
# JLLlist <- list(DomUnit =  "China")
# ###################################### BRW inputs  ######################################################
# WishBC <- 1
# BRWlist <- within(list(flag_mean = TRUE, gamma = 0.001, N_iter = 200, B = 50, checkBRW = TRUE,
#                        B_check = 1000),  N_burn <- round(N_iter * 0.15))
# 
# # C) Decide on Settings for numerical outputs
# WishFPremia <- 1
# FPmatLim <- c(24,36)
# 
# Horiz <- 25
# DesiredGraphs <- c("GIRF", "GFEVD", "TermPremia")
# WishGraphRiskFac <- 0
# WishGraphYields <- 1
# WishOrthoJLLgraphs <- 1
# 
# # D) Bootstrap settings
# WishBootstrap <- 0 #  Set it to 1, if bootstrap is desired
# BootList <- list(methodBS = 'bs', BlockLength = 4, ndraws = 1000, pctg =  95)
# 
# # E) Out-of-sample forecast
# WishForecast <- 1
# ForecastList <- list(ForHoriz = 12,  t0Sample = 1, t0Forecast = 100, ForType = "Rolling")
# 
# #########################################################################################################
# ############################### NO NEED TO MAKE CHANGES FROM HERE #######################################
# #########################################################################################################
# 
# # 2) Minor preliminary work: get the sets of factor labels and  a vector of common maturities
# FactorLabels <- LabFac(N, DomVar, GlobalVar, Economies, ModelType)
# 
# # 3) Prepare the inputs of the likelihood function
# ATSMInputs <- InputsForOpt(t0_sample, tF_sample, ModelType, Yields, GlobalMacroVar, DomesticMacroVar,
#                            FactorLabels, Economies, DataFreq, GVARlist, JLLlist, WishBC, BRWlist)
# 
# # 4) Optimization of the ATSM (Point Estimates)
# ModelParaList <- Optimization(ATSMInputs, StatQ, DataFreq, FactorLabels, Economies, ModelType)
# 
# # 5) Numerical and graphical outputs
# # a) Prepare list of inputs for graphs and numerical outputs
# InputsForOutputs <- InputsForOutputs(ModelType, Horiz, DesiredGraphs, OutputLabel, StatQ, DataFreq,
#                                     WishGraphYields, WishGraphRiskFac, WishOrthoJLLgraphs, WishFPremia,
#                                     FPmatLim, WishBootstrap, BootList, WishForecast, ForecastList)
# 
# # b) Fit, IRF, FEVD, GIRF, GFEVD, and Term Premia
# NumericalOutputs <- NumOutputs(ModelType, ModelParaList, InputsForOutputs, FactorLabels,
#                                Economies, Folder2Save)
# 
# # c) Confidence intervals (bootstrap analysis)
# BootstrapAnalysis <- Bootstrap(ModelType, ModelParaList, NumericalOutputs, Economies, InputsForOutputs,
#                                FactorLabels, JLLlist, GVARlist, WishBC, BRWlist, Folder2Save)
# 
# # 6) Out-of-sample forecasting
# Forecasts <- ForecastYields(ModelType, ModelParaList, InputsForOutputs, FactorLabels, Economies,
#                             JLLlist, GVARlist, WishBC, BRWlist, Folder2Save)

## ----eval=FALSE---------------------------------------------------------------
# # A) Load database data
# LoadData("CM_2023")
# 
# # B) GENERAL model inputs
# ModelType <- "GVAR multi"
# 
# Economies <- c("Brazil", "India", "Russia", "Mexico")
# GlobalVar <- c("US_Output_growth", "China_Output_growth", "SP500")
# DomVar <- c("Inflation","Output_growth", "CDS", "COVID")
# N <- 2
# 
# t0_sample <- "22-03-2020"
# tF_sample <- "26-09-2021"
# 
# OutputLabel <- "CM_EM"
# DataFreq <-"Weekly"
# F2S <- NULL
# 
# StatQ <- 0
# 
# # B.1) SPECIFIC model inputs
# #################################### GVAR-based models ##################################################
# GVARlist <- list( VARXtype = "constrained: COVID", W_type = "Sample Mean", t_First_Wgvar = "2015",
#                   t_Last_Wgvar = "2020", DataConnectedness = Trade_Flows)
# ###################################### BRW inputs  ######################################################
# WishBC <- 0
# 
# # C) Decide on Settings for numerical outputs
# WishFPremia <- 1
# FPmatLim <- c(47,48)
# 
# Horiz <- 12
# DesiredGraphs <- c("GIRF", "GFEVD", "TermPremia")
# WishGraphRiskFac <- 0
# WishGraphYields <- 1
# WishOrthoJLLgraphs <- 0
# 
# # D) Bootstrap settings
# WishBootstrap <- 1 #  YES: 1; No = 0.
# BootList <- list(methodBS = 'bs', BlockLength = 4, ndraws = 100, pctg =  95)
# 
# #########################################################################################################
# ############################### NO NEED TO MAKE CHANGES FROM HERE #######################################
# #########################################################################################################
# 
# # 2) Minor preliminary work: get the sets of factor labels and  a vector of common maturities
# FactorLabels <- LabFac(N, DomVar, GlobalVar, Economies, ModelType)
# 
# # 3) Prepare the inputs of the likelihood function
# ATSMInputs <- InputsForOpt(t0_sample, tF_sample, ModelType, Yields, GlobalMacro, DomMacro, FactorLabels,
#                            Economies, DataFreq, GVARlist)
# 
# # 4) Optimization of the ATSM (Point Estimates)
# ModelParaList <- Optimization(ATSMInputs, StatQ, DataFreq, FactorLabels, Economies, ModelType)
# 
# # 5) Numerical and graphical outputs
# # a) Prepare list of inputs for graphs and numerical outputs
# InputsForOutputs <- InputsForOutputs(ModelType, Horiz, DesiredGraphs, OutputLabel, StatQ, DataFreq,
#                                     WishGraphYields, WishGraphRiskFac, WishOrthoJLLgraphs, WishFPremia,
#                                     FPmatLim, WishBootstrap, BootList)
# 
# # b) Fit, IRF, FEVD, GIRF, GFEVD, and Term Premia
# NumericalOutputs <- NumOutputs(ModelType, ModelParaList, InputsForOutputs, FactorLabels,
#                                Economies, F2S)
# 
# # c) Confidence intervals (bootstrap analysis)
# BootstrapAnalysis <- Bootstrap(ModelType, ModelParaList, NumericalOutputs, Economies, InputsForOutputs,
#                                FactorLabels, JLLlist = NULL, GVARlist, WishBC, BRWlist, F2S)
# 

