Questão 1

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.

Estimação dos parâmetros

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,

Matriz de Covariância

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

Desvio Padrão

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

Retorno

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.

Portfólio Tangente e de Mínima Variância

Portfólio Tangente

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)

Portfólio Mínima Variância

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)

Questão 2

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.

Portfólio Tangente

Portfólio 1

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

Mínima Variância

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

Tangente

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

Portfólio 2

Mínima Variância

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

Tangente

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%.

Questão 3

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.

Naive (1/n)

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
  
}

Volatility Timing

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
  
}

Portfólio Tangente

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
  
}

Procedimentos e Conclusões

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.

Questão 4

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.

ABEV

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

Volatilidade

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

Retorno

(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

BTOW

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

Volatilidade

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

Retorno

(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

COGN

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

Volatilidade

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

Retorno

(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