Comparação de riscos e performance em dois periodos

Authors

Prof.Dr.Sinézio Fernandes Maia

Gabriel Barros Teixeira

1 Importando os dados

Code
#Remoção de objetos anteriores
#remove(list = ls())
gc()
par(mfrow = c(1, 1))
options(scipen = 999, max.print = 100000)
date()

# Diretório de trabalho
knitr::opts_chunk$set(echo = TRUE,
                      root.dir = "C:/Users/gabri/Documents")


# Carregamento do pacote
library(tseries)

dataini <- "2023-10-27"
datafim <- "2024-01-27"

dataini2 <- "2025-04-08"
datafim2 <- "2025-07-08"

ativos <- c("CMIG4.SA", "VAMO3.SA", "BRFS3.SA", "CSNA3.SA", "LREN3.SA","^BVSP")

## Periodo 1

cotacoes <- list()
for (ativo in ativos) {
  cotacoes[[ativo]] <- get.hist.quote(instrument = ativo,
                                      quote = "Close",
                                      start = dataini,
                                      end = datafim,
                                      retclass = "zoo")
}
# Junta as séries (por data)
cotacoes <- do.call(merge, cotacoes)

2 De 27/10/2023 até 26/01/2024

Comportamento das cotações dos ativos e do indice de referência no primeiro período análisado

Code
colnames(cotacoes)[colnames(cotacoes) == "Close.CMIG4.SA"] <- "CMIG4"
colnames(cotacoes)[colnames(cotacoes) == "Close.LREN3.SA"] <- "LREN3"
colnames(cotacoes)[colnames(cotacoes) == "Close.CSNA3.SA"] <- "CSNA3"
colnames(cotacoes)[colnames(cotacoes) == "Close.VAMO3.SA"] <- "VAMO3"
colnames(cotacoes)[colnames(cotacoes) == "Close.BRFS3.SA"] <- "BRFS3"
colnames(cotacoes)[colnames(cotacoes) == "Close.^BVSP"] <- "IBOV"
plot(cotacoes, main = "Preços de Fechamento")

3 De 08/04/2025 até 07/08/2025

Comportamentos das cotações dos ativos e do indice de referência no segundo período análisado

Code
colnames(cotacoes2)[colnames(cotacoes2) == "Close.CMIG4.SA"] <- "CMIG4"
colnames(cotacoes2)[colnames(cotacoes2) == "Close.LREN3.SA"] <- "LREN3"
colnames(cotacoes2)[colnames(cotacoes2) == "Close.CSNA3.SA"] <- "CSNA3"
colnames(cotacoes2)[colnames(cotacoes2) == "Close.VAMO3.SA"] <- "VAMO3"
colnames(cotacoes2)[colnames(cotacoes2) == "Close.BRFS3.SA"] <- "BRFS3"
colnames(cotacoes2)[colnames(cotacoes2) == "Close.^BVSP"] <- "IBOV"
plot(cotacoes2, main = "Preços de Fechamento")

4 Média diária dos retornos

Code
# Periodo 1
rcotacoes <-lapply(cotacoes, function(x) diff(log(x)))
rcotacoes <- do.call(cbind, rcotacoes)

mrcotacoes <- sapply(rcotacoes, mean, na.rm = TRUE)
print("Media dos retornos na primeira janela")
[1] "Media dos retornos na primeira janela"
Code
mrcotacoes * 100  # Retorno médio diário em %
      CMIG4       VAMO3       BRFS3       CSNA3       LREN3        IBOV 
-0.04101464  0.10512111  0.54737992  0.78040511  0.42747995  0.21584761 
Code
# Periodo 2
rcotacoes2 <-lapply(cotacoes2, function(x) diff(log(x))) 
rcotacoes2 <- do.call(cbind, rcotacoes2)

mrcotacoes2 <- sapply(rcotacoes2, mean, na.rm = TRUE)
print("Media dos retornos na segunda janela")
[1] "Media dos retornos na segunda janela"
Code
mrcotacoes2 * 100  # Retorno médio diário em %
      CMIG4       VAMO3       BRFS3       CSNA3       LREN3        IBOV 
 0.16926176 -0.03672125  0.21696845  0.07343330  0.79165896  0.19709981 

5 Desvio padrão dos retornos

Code
# Periodo 1
Drcotacoes <-  sapply(rcotacoes, sd, na.rm = TRUE)
print("Desvio padrao na primeira janela")
[1] "Desvio padrao na primeira janela"
Code
Drcotacoes  # Desvio padrão dos retornos
      CMIG4       VAMO3       BRFS3       CSNA3       LREN3        IBOV 
0.021588338 0.033003806 0.034424817 0.025152994 0.026203515 0.008819105 
Code
# Periodo 2
Drcotacoes2 <-  sapply(rcotacoes2, sd, na.rm = TRUE)
print("Desvio padrao na segunda janela")
[1] "Desvio padrao na segunda janela"
Code
Drcotacoes2  # Desvio padrão dos retornos
      CMIG4       VAMO3       BRFS3       CSNA3       LREN3        IBOV 
0.015721361 0.042581390 0.027538035 0.028825573 0.021792836 0.009020038 

6 Coeficiente de variação

Code
# Periodo 1
cvrcotacoes <- Drcotacoes / (mrcotacoes * 100)
cvrcotacoes * 100  # Coeficiente de variação dos retornos em %
cvrcotacoes <- abs(cvrcotacoes)*100
# barplot(cvrcotacoes, main = "Coeficiente de variação dos retornos 27/10/2023 - 26/01/2024", col='blue')

bpCVR <- barplot(cvrcotacoes,
                 main = "Coeficiente de variação dos retornos 08/04/2025 - 07/07/2025",
                 ylab = "Percentual %",
                 col = "blue",
                 names.arg = names(cvrcotacoes),
                 cex.names = 1,
                 ylim = c(0, max(cvrcotacoes) * 1.2))

text(x = bpCVR,
     y = cvrcotacoes,
     label = round(cvrcotacoes, 2), # Rótulos com 2 casas decimais
     pos = 3,
     col = "black",
     cex = 0.8)

Code
# Periodo 2
cvrcotacoes2 <- Drcotacoes2 / (mrcotacoes2 * 100)
cvrcotacoes2 * 100  # Coeficiente de variação dos retornos em %
cvrcotacoes2 <- abs(cvrcotacoes2)*100
# barplot(cvrcotacoes2, main = "Coeficiente de variação dos retornos 08/04/2025 - 07/07/2025", col='blue')

bpCVR <- barplot(cvrcotacoes2,
                 main = "Coeficiente de variação dos retornos 08/04/2025 - 07/07/2025",
                 ylab = "Percentual %",
                 col = "blue",
                 names.arg = names(cvrcotacoes2),
                 cex.names = 1,
                 ylim = c(0, max(cvrcotacoes2) * 1.2))

text(x = bpCVR,
     y = cvrcotacoes2,
     label = round(cvrcotacoes2, 2), # Rótulos com 2 casas decimais
     pos = 3,
     col = "black",
     cex = 0.8)

7 Volatilidade

Code
#| message: false
#| warning: false
#| results: hide
# Periodo 1
Volcotacoes <- (Drcotacoes * 100) * sqrt(252)
Volcotacoes  # Volatilidade anualizada em %
   CMIG4    VAMO3    BRFS3    CSNA3    LREN3     IBOV 
34.27042 52.39192 54.64770 39.92914 41.59679 13.99990 
Code
# barplot(Volcotacoes, main = "Volatilidade 27/10/2023 - 26/01/2024", col='blue')

# Periodo 1
Volcotacoes <- (Drcotacoes * 100) * sqrt(252)
Volcotacoes # Volatilidade anualizada em %
   CMIG4    VAMO3    BRFS3    CSNA3    LREN3     IBOV 
34.27042 52.39192 54.64770 39.92914 41.59679 13.99990 
Code
# Cria o gráfico e armazena as posições das barras
bpVol1 <- barplot(Volcotacoes,
                  main = "Volatilidade 27/10/2023 - 26/01/2024",
                  ylab = "Percentual %",
                  col = 'blue',
                  ylim = c(0, max(Volcotacoes) * 1.2))

# Adiciona os rótulos no topo das barras
text(x = bpVol1,
     y = Volcotacoes,
     label = round(Volcotacoes, 2), # Rótulos com 2 casas decimais
     pos = 3,
     col = "black",
     cex = 0.8)

Code
# Periodo 2
Volcotacoes2 <- (Drcotacoes2 * 100) * sqrt(252)
Volcotacoes2  # Volatilidade anualizada em %
   CMIG4    VAMO3    BRFS3    CSNA3    LREN3     IBOV 
24.95689 67.59586 43.71527 45.75918 34.59505 14.31887 
Code
# barplot(Volcotacoes2,main = "Volatilidade periodo 08/04/2025 - 07/07/2025", col='blue')

# Periodo 2
Volcotacoes2 <- (Drcotacoes2 * 100) * sqrt(252)
Volcotacoes2 # Volatilidade anualizada em %
   CMIG4    VAMO3    BRFS3    CSNA3    LREN3     IBOV 
24.95689 67.59586 43.71527 45.75918 34.59505 14.31887 
Code
# Cria o gráfico e armazena as posições das barras
bpVol2 <- barplot(Volcotacoes2,
                  main = "Volatilidade periodo 08/04/2025 - 07/07/2025",
                  ylab = "Percentual %",
                  col = 'blue',
                  ylim = c(0, max(Volcotacoes2) * 1.2))

# Adiciona os rótulos no topo das barras
text(x = bpVol2,
     y = Volcotacoes2,
     label = round(Volcotacoes2, 2), # Rótulos com 2 casas decimais
     pos = 3,
     col = "black",
     cex = 0.8)

8 Comparação do Beta Mercado calculado

9 Indicadores de performance

Code
bpTreynor<-barplot(TREYNOR, main="Indicador de Performance: Treynor 27/10/2023 - 26/01/2024", ylim=c(-10,1),names.arg=names, ylab="Percentual %", cex.names=1)
text(x = as.vector(bpTreynor), y = TREYNOR, 
     label =  round(TREYNOR, 4), pos = 3, 
     col = "black", cex = 0.8)

Code
bpTreynor<-barplot(TREYNOR2, main="Indicador de Performance: Treynor 08/04/2025 - 07/07/2025", ylim=c(-10,1),names.arg=names, ylab="Percentual %", cex.names=1)
text(x = as.vector(bpTreynor), y = TREYNOR2, 
     label =  round(TREYNOR2, 4), pos = 3, 
     col = "black", cex = 0.8)

Code
bpSharpe<-barplot(SHARPE, main="Indicador de Performance: Sharpe 27/10/2023 - 26/01/2024", ylim=c(-4,1),names.arg=names, ylab="Percentual %", cex.names=1)
text(x = as.vector(bpSharpe), y = SHARPE, 
     label =  round(SHARPE, 4), pos = 3, 
     col = "black", cex = 0.8)

Code
bpSharpe<-barplot(SHARPE2, main="Indicador de Performance: Sharpe 08/04/2025 - 07/07/2025", ylim=c(-4,1),names.arg=names, ylab="Percentual %", cex.names=1)
text(x = as.vector(bpSharpe), y = SHARPE2, 
     label =  round(SHARPE2, 4), pos = 3, 
     col = "black", cex = 0.8)

Code
bpJensen<-barplot(JENSEN, main="Indicador de Performance: Jensen 27/10/2023 - 26/01/2024", ylim=c(-0.02,0.09),names.arg=names, ylab="Percentual %", cex.names=0.7)
text(x = as.vector(bpJensen), y = JENSEN, 
     label =  round(JENSEN, 4), pos = 3, 
     col = "black", cex = 0.7)

Code
bpJensen<-barplot(JENSEN2, main="Indicador de Performance: Jensen 08/04/2025 - 07/07/2025", ylim=c(-0.02,0.09),names.arg=names, ylab="Percentual %", cex.names=0.7)
text(x = as.vector(bpJensen), y = JENSEN2, 
     label =  round(JENSEN2, 4), pos = 3, 
     col = "black", cex = 0.7)

10 Conclusão

O beta de mercado mede a exposição de um ativo ao risco sistemático. Quando está próximo de 1, os retornos do ativo tendem a acompanhar os retornos do mercado; quando é superior a 1, uma variação no mercado gera uma volatilidade ainda maior no ativo; e, quando é inferior a 1, o ativo apresenta menor volatilidade em relação ao mercado.

O beta é um componente central do modelo CAPM, que estima o retorno esperado de um ativo a partir do prêmio de risco, definido pela diferença entre o retorno do mercado e a taxa livre de risco. O modelo assume a inexistência de custos de transação e a disponibilidade das mesmas informações para todos os investidores. Nessas condições, o risco de qualquer ativo corresponde ao risco incremental que ele adiciona ao portfólio de mercado (Damodaran).

Formula do Beta mercado:

\[ \beta_i = \frac{\text{Cov}(R_i, R_m)}{\text{Var}(R_m)} \]

Os diferentes betas observado nas janelas se explica por dois motivos principais:

Se a covariância muda (ativo passa a se mover mais ou menos junto ao mercado), o Beta muda, com as diefrentes volatilidades. Ou Se a variância do mercado muda (mercado fica mais ou menos volátil).

\[ E(R_i) = r_f + \beta_i \cdot [E(R_m) - r_f] \]

  • E(Ri​) = retorno esperado do ativo

  • Rf = taxa livre de risco

  • βi= beta do ativo i, que mede sua sensibilidade em relação ao mercado

  • E(Rm)= retorno esperado do mercado (benchmark)

  • (E(Rm​)−Rf​) = prêmio de risco do mercado

Os indicadores de performance, de treynor, sharpe e jensen observados têm o intuito de auxiliar o investidor e os gestores de carteiras a mensurar o retorno de um ativo ou de uma carteira de ativos, levando em consideração não apenas sua valorização e retorno individual, mas também a comparação com a taxa livre de risco e o risco assumido na operação. Dessa forma, é possível verificar se foi gerado alfa no período e foi possível superar o retorno do benchmark, ou seja, se houve prêmio pelo risco assumido ou se o risco tomado foi desproporcional ao retorno obtido. Em suma os indicadores acima tem esse objetivo, embora cada um deles envolvam caracteristicas diferentes, e por tanto resultando em valores diferentes.

Tanto o indice de Treynor como o de Sharpe medem o retorno descontado de um benchmark, nesse caso, a taxa livre risco, ou seja, o premio observado para cada unidade de risco, porém o que difere um do outro está no denominador. O treynor considera como medidade de risco o beta mercado, enquanto o sharpe considera o desvio padrão.

Já o indice de Jensen é obtido quando se isola o alfa da equação do capm observando exatamente o retorno acima do mercado observado, considerado como alfa, portanto, Seu cálculo é dado pela diferença entre o retorno de fato apresentado pela carteira e o retorno que deveria ter sido apresentado nas condições do CAPM.

Como mencionado por Damodaran, o Beta representa o risco sistemático e, na teoria moderna de portfólio, é utilizado considerando uma carteira diversificada, uma vez que os riscos específicos de cada ativo já foram eliminados pela diversificação. Na equação do CAPM, a diversificação está representada no termo de erro; quando a carteira não é diversificada, esse termo de erro, que sintetiza as variáveis omitidas no modelo, tende a se elevar.

Não é à toa que o Beta estimado de um ativo individual apresenta, na maioria dos casos, um R² baixo, indicando que apenas uma pequena parcela de seu retorno é explicada pelas variáveis do modelo.

Portanto, ao avaliar os índices para cada ativo específico e estabelecer a prioridade dos indicadores no processo de seleção da nossa carteira, o Índice de Treynor ocupará a última posição, pois utiliza como medida de risco o Beta de mercado do ativo individual.

Diferentemente do abordado pelo Índice de Treynor, o Sharpe leva em consideração o desvio-padrão do ativo, entendendo que a volatilidade e o risco do ativo são capturados pelas oscilações em torno da média especificamente do ativo analisado. Dessa forma, torna-se mais viável utilizá-lo nesse contexto, justificando a elevação de sua prioridade no processo de seleção da carteira.

Por fim, o Índice de Jensen mede o excesso de retorno em relação ao retorno esperado pelo CAPM. Ou seja, avalia se o ativo conseguiu gerar retorno acima do esperado para o risco sistemático assumido. Sendo um bom indicador para analisar o prêmio e o retorno em comparação ao esperado para o próprio ativo, mostra-se apropriado para ocupar um nível de prioridade superior, equivalente ao do índice de Sharpe.