Se tiver que estimar parâmetros para a otimização de Markowitz usando dados passados, para investimento nos meses seguintes, discuta como consideraria o período da COVID. Escolha um conjunto de ativos e apresente estimativas com e sem esse período e discuta as diferenças.
Primeiro, importamos os dados que iremos utilizar ao longo da nossa análise:
retornos <- read_excel("Dados_P1.xlsx")
## tibble[,8] [1,237 x 8] (S3: tbl_df/tbl/data.frame)
## $ Data : POSIXct[1:1237], format: "2016-06-01" "2016-06-02" ...
## $ ABEV3: num [1:1237] 0.012 -0.0031 0.0114 -0.0041 -0.017 ...
## $ B3SA3: num [1:1237] 0.00754 0.00998 0.02716 -0.01202 -0.01338 ...
## $ BTOW3: num [1:1237] -0.0404 -0.00632 -0.01589 -0.03122 -0.00778 ...
## $ CMIG4: num [1:1237] -0.0142 0.0216 0.0141 0.0174 -0.0205 ...
## $ COGN3: num [1:1237] 0.0117 0.1356 0.0196 -0.0216 0.0118 ...
## $ CVCB3: num [1:1237] -0.0234 -0.0191 0.0151 -0.0173 0.0171 ...
## $ CYRE3: num [1:1237] 0.025 0.0061 0.04242 -0.00194 -0.01359 ...
Sabemos que em períodos de crise, como foi o caso da Covid, parâmetros que antes eram considerados estáveis ficam totalmente instáveis e imprevisíveis. Correlações, por exemplo, tendem a 1. A série de retornos de um ativo que era estacionária (\(\mu\) e \(\sigma^2\) constantes), sofre um quebra estrutural e a variância explode ao mesmo tempo em que os retornos parecem indicar um evento 10 sigma todos os dias.
Como sabemos, não esses tipos de eventos (black swans) são imprevisíveis e o melhor que o investidor pode fazer é tentar construir um portfólio diversificado o suficiente e entender que seu portfólio está exposto a esse tipo de risco de cauda.
Pelo fato das propriedades estatísticas dos retornos serem deturpadas nesse tipo de período, os retornos gerados durante a Covid tem pouca utilidade para a estimação dos parâmetros para otimização de Markowitz. No caso do investidor do exercício, que deseja otimizar sua carteira para os meses seguintes, uma abordagem pode ser interessante: ele desconsidera o período da Covid para estimação dos parâmetros, entretanto, antes de efetivamente montar a carteira, ele testa como teria sido o desempenho do portfólio durante a Covid. Dessa forma, ele terá parâmetros que são baseados em um período de normalidade - como se espera que o futuro seja - e terá uma noção de como o portfólio teria desempenhado em um período de grande turbulência.
Para estimação dos parâmetros e construção do portfólio tangente e de variâncias mínima, iremos considerar dois períodos de 6 meses: o primeiro não contendo o período da Covid (01/08/2019 - 31/01/2020) e o segundo contendo (01/11/2019 - 31/04/2020). Assim,
Além disso, definimos o risk free para os períodos
rf_period1 <- (1 + 0.02586666) ^ (1/126) - 1
rf_period2 <- (1 + 0.02051748) ^ (1/126) - 1
Como é sabido, para construção do portfólio tangente e do portfólio de mínima variância, precisamos da matriz de covariâncias e do vetor de retornos esperados. Iremos considerar o retorno esperado como sendo a média dos retornos durante o período estabelecido. Assim,
cov_period1 <- cov(retornos_period1[,2:8])
## ABEV3 B3SA3 BTOW3 CMIG4 COGN3
## ABEV3 2.134456e-04 0.0001137749 9.332149e-05 6.761013e-05 0.0001337770
## B3SA3 1.137749e-04 0.0004403222 1.909524e-04 1.339622e-04 0.0002133148
## BTOW3 9.332149e-05 0.0001909524 9.332537e-04 1.248908e-04 0.0002851811
## CMIG4 6.761013e-05 0.0001339622 1.248908e-04 2.451971e-04 0.0001434090
## COGN3 1.337770e-04 0.0002133148 2.851811e-04 1.434090e-04 0.0006946395
## CVCB3 7.747072e-05 0.0001480108 3.240940e-04 1.451926e-04 0.0002012038
## CYRE3 7.901626e-05 0.0002132017 1.779938e-04 1.735842e-04 0.0002508723
## CVCB3 CYRE3
## ABEV3 7.747072e-05 7.901626e-05
## B3SA3 1.480108e-04 2.132017e-04
## BTOW3 3.240940e-04 1.779938e-04
## CMIG4 1.451926e-04 1.735842e-04
## COGN3 2.012038e-04 2.508723e-04
## CVCB3 6.226096e-04 2.083563e-04
## CYRE3 2.083563e-04 5.394676e-04
cov_period2 <- cov(retornos_period2[,2:8])
## ABEV3 B3SA3 BTOW3 CMIG4 COGN3
## ABEV3 0.0009752391 0.0008335713 0.0009862358 0.0009417689 0.001304141
## B3SA3 0.0008335713 0.0018919635 0.0019262465 0.0012697382 0.001583729
## BTOW3 0.0009862358 0.0019262465 0.0036253986 0.0016319517 0.002093100
## CMIG4 0.0009417689 0.0012697382 0.0016319517 0.0017176179 0.001943007
## COGN3 0.0013041409 0.0015837286 0.0020930996 0.0019430074 0.003541412
## CVCB3 0.0017533531 0.0023046964 0.0021764072 0.0023117435 0.003362119
## CYRE3 0.0012265577 0.0019883196 0.0023245796 0.0019710827 0.002727301
## CVCB3 CYRE3
## ABEV3 0.001753353 0.001226558
## B3SA3 0.002304696 0.001988320
## BTOW3 0.002176407 0.002324580
## CMIG4 0.002311743 0.001971083
## COGN3 0.003362119 0.002727301
## CVCB3 0.006707780 0.003688545
## CYRE3 0.003688545 0.003471548
dp_period1 <- apply(retornos_period1[,2:8], 2, sd)
## ABEV3 B3SA3 BTOW3 CMIG4 COGN3 CVCB3 CYRE3
## 0.01460978 0.02098386 0.03054920 0.01565877 0.02635601 0.02495215 0.02322644
dp_period2 <- apply(retornos_period2[,2:8], 2, sd)
## ABEV3 B3SA3 BTOW3 CMIG4 COGN3 CVCB3 CYRE3
## 0.03122882 0.04349671 0.06021128 0.04144415 0.05950976 0.08190104 0.05891984
er_period1 <- apply(retornos_period1[,2:8], 2, sd)
## ABEV3 B3SA3 BTOW3 CMIG4 COGN3 CVCB3 CYRE3
## 0.01460978 0.02098386 0.03054920 0.01565877 0.02635601 0.02495215 0.02322644
er_period2 <- apply(retornos_period2[,2:8], 2, mean)
## ABEV3 B3SA3 BTOW3 CMIG4 COGN3
## -0.0028414866 -0.0009270382 0.0047564513 -0.0018441704 -0.0029745476
## CVCB3 CYRE3
## -0.0075715433 -0.0026834946
Como podemos observar, no período que inclui a crise da Covid, os retornos esperados são significativamente menores ao mesmo tempo em que o risco (\(\sigma\)) é significativamente maior.
pt_period1 <- inv(cov_period1) %*% (er_period1 - rf_period1)
pt_period1 <- pt_period1/sum(pt_period1)
pt_period2 <- inv(cov_period2) %*% (er_period2 - rf_period2)
pt_period2 <- pt_period2/sum(pt_period2)
mv_period1 <- inv(cov_period1) %*% rep(1,7)
mv_period1 <- mv_period1/sum(mv_period1)
mv_period2 <- inv(cov_period2) %*% rep(1,7)
mv_period2 <- mv_period2/sum(mv_period2)
Compare os portfólios de mínima variância e tangente para os dois conjuntos de informações e ativos da questão anterior, considerando um investimento máximo de 40% em cada ativo e alavancagem máxima de 10%. Analise a composição, o retorno e riscos esperados por esses portfólios para cada conjunto de ativos. Mostre os gráficos dos portfólios e as tabelas de informações necessárias. 100% do capital deve ser investido.
Consideraremos o portfólio 1 como sendo aquele que compreende o período sem Covid (period1) e portfólio 2 como sendo aquele que compreende o período da Covid (period2).
port1 <- retornos_period1
port2 <- retornos_period2
Data_9_mv_port1 <- timeSeries(ts(port1[,2:8], frequency=12, start=c(2019,8)))
ndm=dim(Data_9_mv_port1)
Spec = portfolioSpec()
setTargetReturn(Spec) = mean(colMeans(port1[,2:8],na.rm=T)) # pode usar outro valor
setRiskFreeRate(Spec) = rf_period1
setNFrontierPoints(Spec) = 80
Constraints = c("maxsumW[1:7] = 1.1", "maxW = c(0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4)")
mv_9_port1 =minvariancePortfolio(Data_9_mv_port1, Spec, Constraints)
# Retorno Esperado
getWeights(mv_9_port1) %*% er_period1
## [,1]
## [1,] 0.01689752
# Risco
sqrt(t(getWeights(mv_9_port1)) %*% cov_period1 %*% getWeights(mv_9_port1)) * sqrt(252)
## [,1]
## [1,] 0.1910378
Data_9_pt_port1 <- timeSeries(ts(port1[,2:8], frequency=12, start=c(2019,8)))
ndm=dim(Data_9_pt_port1)
Spec = portfolioSpec()
setTargetReturn(Spec) = mean(colMeans(port1[,2:8],na.rm=T)) # pode usar outro valor
setRiskFreeRate(Spec) = rf_period1
setNFrontierPoints(Spec) = 80
Constraints = c("maxsumW[1:7] = 1.1", "maxW = c(0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4)")
pt_9_port1 =tangencyPortfolio(Data_9_pt_port1, Spec, Constraints)
# Retorno Esperado
getWeights(pt_9_port1) %*% er_period1
## [,1]
## [1,] 0.02538896
# Risco
sqrt(t(getWeights(pt_9_port1)) %*% cov_period1 %*% getWeights(pt_9_port1)) * sqrt(252)
## [,1]
## [1,] 0.3028628
Data_9_mv_port2 <- timeSeries(ts(port2[,2:8], frequency=12, start=c(2019,11)))
ndm=dim(Data_9_mv_port2)
Spec = portfolioSpec()
setTargetReturn(Spec) = mean(colMeans(port2[,2:8],na.rm=T)) # pode usar outro valor
setRiskFreeRate(Spec) = rf_period2
setNFrontierPoints(Spec) = 80
Constraints = c("maxsumW[1:7] = 1.1", "maxW = c(0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4)")
mv_9_port2 =minvariancePortfolio(Data_9_mv_port2, Spec, Constraints)
# Retorno Esperado
getWeights(mv_9_port2) %*% er_period2
## [,1]
## [1,] -0.001975692
# Risco
sqrt(t(getWeights(mv_9_port2)) %*% cov_period2 %*% getWeights(mv_9_port2)) * sqrt(252)
## [,1]
## [1,] 0.5349165
Data_9_pt_port2 <- timeSeries(ts(port2[,2:8], frequency=12, start=c(2019,11)))
ndm=dim(Data_9_pt_port2)
Spec = portfolioSpec()
setTargetReturn(Spec) = mean(colMeans(port2[,2:8],na.rm=T)) # pode usar outro valor
setRiskFreeRate(Spec) = rf_period2
setNFrontierPoints(Spec) = 80
Constraints = c("maxsumW[1:7] = 1.1", "maxW = c(0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4)")
pt_9_port2 =tangencyPortfolio(Data_9_pt_port2, Spec, Constraints)
# Retorno Esperado
getWeights(pt_9_port2) %*% er_period2
## [,1]
## [1,] 0.001162931
# Risco
sqrt(t(getWeights(pt_9_port2)) %*% cov_period2 %*% getWeights(pt_9_port2)) * sqrt(252)
## [,1]
## [1,] 0.7156132
Como podemos observar, os portfólios que consideram a covid tendem a concentrar em ativos que tiveram um desempenho um pouco melhor. Além disso, podemos perceber que o retorno esperado dos portfólios que consideram a Covid são bem menores e até negativos. Entretanto, a maior diferença está no risco: no período sem crise, o desvio padrão é 19% e 30 para o portfólio de variância mínima e para o tangente, respectivimanete; no período que inclui a crise esses valores saltam para 53% e 72%.
O arquivo CotaMensal032020.csv tem informações de cotações de ativos da B3. Pode utilizar essas informações, ou coletar novas mais atuais, para mostrar uma análise de desempenho obtido por Backtesting de estratégias, 1/n, volatility timing e portfólio tangente. Utilize no mínimo 6 ativos e no máximo 15. Especifique a escolha e procedimentos. Analise os resultados.
backtest <- function(e,f){
retornos <- retornos[,order(colnames(retornos))]
retornos_composicao_tri <- retornos %>% mutate(Data = retornos$Data) %>% select(Data, everything()) %>% dplyr::filter(Data > e & Data <= f)
retornos_composicao_tri <- retornos_composicao_tri[,colSums(is.na(retornos_composicao_tri)) == 0]
retornos_tri <- xts(retornos_composicao_tri[,2:ncol(retornos_composicao_tri)], retornos_composicao_tri$Data)
retornos_ativos_comprado <- retornos_tri/ncol(retornos_tri)
retorno_comprado <- xts(rowSums(retornos_ativos_comprado), index(retornos_ativos_comprado))
retorno_comprado
}
argumentos <- function(hold_period){
vetor_aval_inicial <- ymd(20161231) %m+% months(0:50)
vetor_aval_final <- ymd(20161231) %m+% months(hold_period + 0:50)
vetor_aval_inicial <- vetor_aval_inicial[seq(from = 1, to = length(vetor_aval_inicial), by = hold_period)]
vetor_aval_final <- vetor_aval_final[seq(from = 1, to = length(vetor_aval_final), by = hold_period)]
vetor_aval_inicial <- vetor_aval_inicial[1:(interval(ymd(20161231), ymd(20201231)) %/% months(hold_period))]
vetor_aval_final <- vetor_aval_final[1:(interval(ymd(20161231), ymd(20201231)) %/% months(hold_period))]
estrategia_retornos <- list()
for(i in 1:length(vetor_aval_final)){
estrategia_retornos[[i]] <- backtest(e = vetor_aval_inicial[i],
f = vetor_aval_final[i])
}
estrategia_retornos <- unlist(estrategia_retornos)
tempo <- retornos %>% dplyr::filter(Data > vetor_aval_inicial[1] & Data <= vetor_aval_final[length(vetor_aval_final)])
estrategia_retornos <- xts(estrategia_retornos, tempo$Data)
estrategia_retornos
}
Os pesos do modelo de VT são definidos através da fórmula abaixo:
\[w_i = \frac{(\frac{1}{\sigma_i^2})^\rho}{\sum_{i=1}^N{(\frac{1}{\sigma_i^2})^\rho}}\]
Sendo que \(\rho\) indica a “medida de agressividade em que o investidor rebalanceia a carteira”. Para nossa análise consideraremos \(\rho\) igual a 4.
backtest <- function(b,c,e,f){
retornos <- retornos[,order(colnames(retornos))]
retornos_composicao_tri <- retornos %>% mutate(Data = retornos$Data) %>% select(Data, everything())
periodo_retornos <- retornos_composicao_tri %>% dplyr::filter(Data > b & Data <= c) %>% select(!Data)
periodo_retornos <- periodo_retornos[,colSums(is.na(periodo_retornos)) == 0]
suporte1 <- periodo_retornos[1,] == 0 &
periodo_retornos[2,] == 0 &
periodo_retornos[3,] == 0 &
periodo_retornos[4,] == 0 &
periodo_retornos[5,] == 0
suporte2 <- colnames(suporte1)[which(suporte1 == TRUE, arr.ind = TRUE)[,2]]
periodo_retornos <- periodo_retornos[, !(names(periodo_retornos) %in% suporte2)]
coef1 <- numeric(length(periodo_retornos))
for (i in 1:length(periodo_retornos)){
coef1[i] <- (1/var(periodo_retornos[[i]]))^4
}
coef1 <- coef1/sum(coef1)
names(coef1) <- names(periodo_retornos)
retornos_ativos_comprado <- retornos %>%
select(Data, names(coef1)) %>%
dplyr::filter(Data > e & Data <= f)
retornos_ativos_comprado <- retornos_ativos_comprado[,colSums(is.na(retornos_ativos_comprado)) == 0]
coef1 <- coef1[names(coef1) %in% colnames(retornos_ativos_comprado)]
retorno_comprado <- as.matrix(retornos_ativos_comprado[,2:length(retornos_ativos_comprado)]) %*% coef1
retorno_comprado
}
argumentos <- function(periodo_estim, hold_period){
vetor_estim_inicial <- ymd(20161231) %m-% months(periodo_estim) %m+% months(0:50)
vetor_estim_final <- ymd(20161231) %m+% months(0:50)
vetor_aval_inicial <- ymd(20161231) %m+% months(0:50)
vetor_aval_final <- ymd(20161231) %m+% months(hold_period + 0:50)
vetor_estim_inicial <- vetor_estim_inicial[seq(from = 1, to = length(vetor_estim_inicial), by = hold_period)]
vetor_estim_final <- vetor_estim_final[seq(from = 1, to = length(vetor_estim_final), by = hold_period)]
vetor_aval_inicial <- vetor_aval_inicial[seq(from = 1, to = length(vetor_aval_inicial), by = hold_period)]
vetor_aval_final <- vetor_aval_final[seq(from = 1, to = length(vetor_aval_final), by = hold_period)]
vetor_estim_inicial <- vetor_estim_inicial[1:(interval(ymd(20161231), ymd(20201231)) %/% months(hold_period))]
vetor_estim_final <- vetor_estim_final[1:(interval(ymd(20161231), ymd(20201231)) %/% months(hold_period))]
vetor_aval_inicial <- vetor_aval_inicial[1:(interval(ymd(20161231), ymd(20201231)) %/% months(hold_period))]
vetor_aval_final <- vetor_aval_final[1:(interval(ymd(20161231), ymd(20201231)) %/% months(hold_period))]
estrategia_retornos <- list()
for(i in 1:length(vetor_aval_final)){
estrategia_retornos[[i]] <- backtest(b = vetor_estim_inicial[i],
c = vetor_estim_final[i],
e = vetor_aval_inicial[i],
f = vetor_aval_final[i])
}
estrategia_retornos <- unlist(estrategia_retornos)
tempo <- retornos %>% dplyr::filter(Data > vetor_aval_inicial[1] & Data <= vetor_aval_final[length(vetor_aval_final)])
estrategia_retornos <- xts(estrategia_retornos, tempo$Data)
estrategia_retornos
}
backtest <- function(b,c,e,f){
retornos <- retornos[,order(colnames(retornos))]
retornos_composicao_tri <- retornos %>% mutate(Data = retornos$Data) %>% select(Data, everything())
periodo_retornos <- retornos_composicao_tri %>% dplyr::filter(Data > b & Data <= c) %>% select(!Data)
periodo_retornos <- periodo_retornos[,colSums(is.na(periodo_retornos)) == 0]
suporte1 <- periodo_retornos[1,] == 0 &
periodo_retornos[2,] == 0 &
periodo_retornos[3,] == 0 &
periodo_retornos[4,] == 0 &
periodo_retornos[5,] == 0
suporte2 <- colnames(suporte1)[which(suporte1 == TRUE, arr.ind = TRUE)[,2]]
periodo_retornos <- periodo_retornos[, !(names(periodo_retornos) %in% suporte2)]
er_periodo_retornos <- colMeans(periodo_retornos)
cov_periodo_retornos <- cov(periodo_retornos)
rf <- (1 + 0.05) ^ (1/252) - 1
coef1 <- inv(cov_periodo_retornos) %*% (er_periodo_retornos - rf)
coef1 <- coef1/sum(coef1)
names(coef1) <- names(periodo_retornos)
retornos_ativos_comprado <- retornos %>%
select(Data, names(coef1)) %>%
dplyr::filter(Data > e & Data <= f)
retornos_ativos_comprado <- retornos_ativos_comprado[,colSums(is.na(retornos_ativos_comprado)) == 0]
coef1 <- coef1[names(coef1) %in% colnames(retornos_ativos_comprado)]
retorno_comprado <- as.matrix(retornos_ativos_comprado[,2:length(retornos_ativos_comprado)]) %*% coef1
retorno_comprado
}
argumentos <- function(periodo_estim, hold_period){
vetor_estim_inicial <- ymd(20161231) %m-% months(periodo_estim) %m+% months(0:50)
vetor_estim_final <- ymd(20161231) %m+% months(0:50)
vetor_aval_inicial <- ymd(20161231) %m+% months(0:50)
vetor_aval_final <- ymd(20161231) %m+% months(hold_period + 0:50)
vetor_estim_inicial <- vetor_estim_inicial[seq(from = 1, to = length(vetor_estim_inicial), by = hold_period)]
vetor_estim_final <- vetor_estim_final[seq(from = 1, to = length(vetor_estim_final), by = hold_period)]
vetor_aval_inicial <- vetor_aval_inicial[seq(from = 1, to = length(vetor_aval_inicial), by = hold_period)]
vetor_aval_final <- vetor_aval_final[seq(from = 1, to = length(vetor_aval_final), by = hold_period)]
vetor_estim_inicial <- vetor_estim_inicial[1:(interval(ymd(20161231), ymd(20201231)) %/% months(hold_period))]
vetor_estim_final <- vetor_estim_final[1:(interval(ymd(20161231), ymd(20201231)) %/% months(hold_period))]
vetor_aval_inicial <- vetor_aval_inicial[1:(interval(ymd(20161231), ymd(20201231)) %/% months(hold_period))]
vetor_aval_final <- vetor_aval_final[1:(interval(ymd(20161231), ymd(20201231)) %/% months(hold_period))]
estrategia_retornos <- list()
for(i in 1:length(vetor_aval_final)){
estrategia_retornos[[i]] <- backtest(b = vetor_estim_inicial[i],
c = vetor_estim_final[i],
e = vetor_aval_inicial[i],
f = vetor_aval_final[i])
}
estrategia_retornos <- unlist(estrategia_retornos)
tempo <- retornos %>% dplyr::filter(Data > vetor_aval_inicial[1] & Data <= vetor_aval_final[length(vetor_aval_final)])
estrategia_retornos <- xts(estrategia_retornos, tempo$Data)
estrategia_retornos
}
Como pode ser visto através do código, a ideia envolve criar uma função que realiza o backtest quando fornecido alguns argumentos, como incício do período de estimação dos parâmetros, início do período de avaliação, etc. Além disso, criamos outra função (argumentos) que irá fornecer os parâmetros para a função anterior dado qual o período de estimação e qual o holding period. Para os nossos backtests utilizamos um período de avaliação de 6 meses e um período de rebalanceamento de 1 mês.
Como podemos perceber pelos gráficos dos retornos, o portfólio tangente foi aquele que teve, com boa margem, o pior desempenho: no período analisado o retorno acumulado chegou próximo a -1. Na comparação entre o volatility timing e o equal-weighted temos um desempenho superior deste último. Isso é interessante dado que é o portfólio mais simples, mostrando que nem sempre o que é mais complexo é melhor.
Escolha 3 ativos da B3 com informações até 31/05/2021 e estime o retorno e volatilidade esperados para o próximo mês (junho 2021) utilizando um modelo ARMA-GARCH. Discuta os passos e pressupostos para se chegar nesse resultado.
Primeiro, definimos com quais ativos iremos trabalhar:
retorno_abev <- retornos$ABEV3
retorno_btow <- retornos$BTOW3
retorno_cogn <- retornos$COGN3
Agora, utilizamos o pacote rugarch para rodarmos o modelo ARMA GARCH.
gspec <- ugarchspec(mean.model=list(
armaOrder=c(2,1)), variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
distribution="std") # dist t
model_abev <- ugarchfit(gspec, retorno_abev)
## Estimate Std. Error t value Pr(>|t|)
## mu 4.456208e-04 3.930938e-04 1.1336246 2.569520e-01
## ar1 2.339156e-01 3.405188e-01 0.6869389 4.921212e-01
## ar2 3.008086e-02 2.779578e-02 1.0822095 2.791594e-01
## ma1 -2.710852e-01 3.375506e-01 -0.8030950 4.219198e-01
## omega 2.516789e-06 9.358192e-06 0.2689397 7.879761e-01
## alpha1 8.020599e-02 9.994238e-02 0.8025224 4.222508e-01
## beta1 9.187938e-01 9.511435e-02 9.6598858 0.000000e+00
## shape 4.532125e+00 8.923537e-01 5.0788431 3.797402e-07
forc_abev = ugarchforecast(model_abev, n.ahead=30)
forc_abev@forecast$sigmaFor*sqrt(252)
## 1973-05-21 21:00:00
## T+1 0.2657940
## T+2 0.2668520
## T+3 0.2679049
## T+4 0.2689525
## T+5 0.2699951
## T+6 0.2710326
## T+7 0.2720651
## T+8 0.2730927
## T+9 0.2741154
## T+10 0.2751333
## T+11 0.2761464
## T+12 0.2771548
## T+13 0.2781586
## T+14 0.2791577
## T+15 0.2801523
## T+16 0.2811424
## T+17 0.2821280
## T+18 0.2831092
## T+19 0.2840861
## T+20 0.2850586
## T+21 0.2860268
## T+22 0.2869909
## T+23 0.2879507
## T+24 0.2889064
## T+25 0.2898580
## T+26 0.2908055
## T+27 0.2917490
## T+28 0.2926885
## T+29 0.2936241
## T+30 0.2945558
(1 + forc_abev@forecast$seriesFor) ^ 252 - 1
## 1973-05-21 21:00:00
## T+1 0.1282801
## T+2 0.1656864
## T+3 0.1298953
## T+4 0.1227836
## T+5 0.1200751
## T+6 0.1192299
## T+7 0.1189510
## T+8 0.1188604
## T+9 0.1188308
## T+10 0.1188212
## T+11 0.1188180
## T+12 0.1188170
## T+13 0.1188166
## T+14 0.1188165
## T+15 0.1188165
## T+16 0.1188165
## T+17 0.1188165
## T+18 0.1188165
## T+19 0.1188165
## T+20 0.1188165
## T+21 0.1188165
## T+22 0.1188165
## T+23 0.1188165
## T+24 0.1188165
## T+25 0.1188165
## T+26 0.1188165
## T+27 0.1188165
## T+28 0.1188165
## T+29 0.1188165
## T+30 0.1188165
gspec <- ugarchspec(mean.model=list(
armaOrder=c(2,1)), variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
distribution="std") # dist t
model_btow <- ugarchfit(gspec, retorno_btow)
## Estimate Std. Error t value Pr(>|t|)
## mu 0.0015011057 0.000874253 1.7170152 8.597640e-02
## ar1 0.6261083490 0.185431024 3.3765027 7.341366e-04
## ar2 -0.1154204783 0.028494681 -4.0505974 5.108704e-05
## ma1 -0.5591587205 0.185358452 -3.0166346 2.555977e-03
## omega 0.0001722997 0.000245227 0.7026128 4.822971e-01
## alpha1 0.1343611009 0.132876534 1.0111725 3.119339e-01
## beta1 0.7340451927 0.309929470 2.3684266 1.786393e-02
## shape 5.9338136476 1.026877530 5.7785018 7.536874e-09
forc_btow = ugarchforecast(model_btow, n.ahead=30)
forc_btow@forecast$sigmaFor*sqrt(252)
## 1973-05-21 21:00:00
## T+1 0.4519799
## T+2 0.4699176
## T+3 0.4849570
## T+4 0.4976486
## T+5 0.5084131
## T+6 0.5175795
## T+7 0.5254100
## T+8 0.5321165
## T+9 0.5378727
## T+10 0.5428218
## T+11 0.5470834
## T+12 0.5507574
## T+13 0.5539282
## T+14 0.5566671
## T+15 0.5590346
## T+16 0.5610825
## T+17 0.5628549
## T+18 0.5643895
## T+19 0.5657188
## T+20 0.5668706
## T+21 0.5678690
## T+22 0.5687346
## T+23 0.5694852
## T+24 0.5701362
## T+25 0.5707010
## T+26 0.5711909
## T+27 0.5716161
## T+28 0.5719850
## T+29 0.5723053
## T+30 0.5725832
(1 + forc_btow@forecast$seriesFor) ^ 252 - 1
## 1973-05-21 21:00:00
## T+1 -0.002110174
## T+2 0.286132882
## T+3 0.408801754
## T+4 0.448462997
## T+5 0.458448476
## T+6 0.460049583
## T+7 0.459894865
## T+8 0.459613145
## T+9 0.459454637
## T+10 0.459387910
## T+11 0.459364426
## T+12 0.459357424
## T+13 0.459355750
## T+14 0.459355511
## T+15 0.459355554
## T+16 0.459355608
## T+17 0.459355638
## T+18 0.459355650
## T+19 0.459355654
## T+20 0.459355655
## T+21 0.459355655
## T+22 0.459355655
## T+23 0.459355655
## T+24 0.459355655
## T+25 0.459355655
## T+26 0.459355655
## T+27 0.459355655
## T+28 0.459355655
## T+29 0.459355655
## T+30 0.459355655
gspec <- ugarchspec(mean.model=list(
armaOrder=c(2,1)), variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
distribution="std") # dist t
model_cogn <- ugarchfit(gspec, retorno_cogn)
## Estimate Std. Error t value Pr(>|t|)
## mu -1.202380e-04 7.393770e-04 -0.1626207 8.708171e-01
## ar1 3.671210e-01 2.079403e-01 1.7655114 7.747786e-02
## ar2 -6.802892e-02 3.009930e-02 -2.2601494 2.381198e-02
## ma1 -3.546189e-01 2.017036e-01 -1.7581192 7.872722e-02
## omega 2.785652e-05 1.897322e-05 1.4682018 1.420494e-01
## alpha1 7.532805e-02 4.315066e-02 1.7456988 8.086331e-02
## beta1 8.959418e-01 5.523268e-02 16.2212261 0.000000e+00
## shape 6.431319e+00 1.155742e+00 5.5646649 2.626567e-08
forc_cogn = ugarchforecast(model_cogn, n.ahead=30)
forc_cogn@forecast$sigmaFor*sqrt(252)
## 1973-05-21 21:00:00
## T+1 0.4855726
## T+2 0.4858257
## T+3 0.4860713
## T+4 0.4863098
## T+5 0.4865414
## T+6 0.4867661
## T+7 0.4869843
## T+8 0.4871962
## T+9 0.4874019
## T+10 0.4876016
## T+11 0.4877954
## T+12 0.4879837
## T+13 0.4881664
## T+14 0.4883438
## T+15 0.4885161
## T+16 0.4886834
## T+17 0.4888458
## T+18 0.4890035
## T+19 0.4891566
## T+20 0.4893053
## T+21 0.4894496
## T+22 0.4895898
## T+23 0.4897259
## T+24 0.4898580
## T+25 0.4899864
## T+26 0.4901110
## T+27 0.4902319
## T+28 0.4903494
## T+29 0.4904635
## T+30 0.4905743
(1 + forc_cogn@forecast$seriesFor) ^ 252 - 1
## 1973-05-21 21:00:00
## T+1 -0.24766070
## T+2 0.03594909
## T+3 0.01113865
## T+4 -0.01938402
## T+5 -0.02875705
## T+6 -0.03015523
## T+7 -0.03003448
## T+8 -0.02989507
## T+9 -0.02985211
## T+10 -0.02984582
## T+11 -0.02984643
## T+12 -0.02984708
## T+13 -0.02984728
## T+14 -0.02984731
## T+15 -0.02984731
## T+16 -0.02984730
## T+17 -0.02984730
## T+18 -0.02984730
## T+19 -0.02984730
## T+20 -0.02984730
## T+21 -0.02984730
## T+22 -0.02984730
## T+23 -0.02984730
## T+24 -0.02984730
## T+25 -0.02984730
## T+26 -0.02984730
## T+27 -0.02984730
## T+28 -0.02984730
## T+29 -0.02984730
## T+30 -0.02984730