1 Introdução

Esse estudo tem como objetivo aplicar a moderna teoria da carteira, fundamentada nos princípios de Markowitz, para analisar o comportamento de uma carteira composta por cinco ativos negociados na B3 (CSAN3, B3SA3, SLCE3, GGBR4 e RADL3), ao longo de 60 pregões, no período de 01/04/2025 a 27/06/2025 e 90 pregões, de 14/02/2025 a 27/07/2025. Busca-se aprofundar a compreensão da relação risco-retorno por meio da construção e avaliação de carteiras otimizadas, considerando diferentes estratégias: carteira de mínima variância, carteira ótima e carteira customizada pelo Índice de Sharpe.

Além da análise de correlação entre ativos, a atividade contempla a avaliação de métricas clássicas de performance, como os índices de Sharpe, Treynor e Jensen, bem como a estimação dos Betas de Mercado pelo modelo CAPM.]

Dessa forma, a atividade promove uma visão integrada entre teoria e prática, ao comparar os resultados individuais dos ativos e da carteira eficiente em diferentes horizontes temporais. Com isso, busca-se não apenas identificar a composição ótima da carteira, mas também discutir os resultados à luz da diversificação, concentração de risco e adequação aos diferentes perfis de investidor.

2 Análise da relação deixada dos ativos nos 60 pregões a partir da Moderna Teoria da Carteira utilizando os princípios de Markowitz

2.0.1 Coleta de Dados - 60 pregões

Code
setwd("C:/Users/Sandrielly/Documents/Ciencias Economicas/P6 - 2025.1/Gestao de Risco")

remove(list=ls())
gc()
par(mfrow=c(1,1))
options(scipen=999)
options(max.print = 100000)
date()

#install.packages("kableExtra")
library(tseries)
library(fBasics)
library(tibble)
library(kableExtra)


#Período 60 pregões
dataini <- "2025-04-01"
datafim <- "2025-06-28"

## Busca dos Dados

# Importação e visualização da série de preços de csan3
csan3 <- get.hist.quote("csan3.sa",
                        quote = "Close",
                        start = dataini,
                        end = datafim)

length(csan3)  # Verifica o número de observações
csan3          # Visualiza os dados
plot(csan3, main = "Série de Preços - CSAN3", col = "green")

Code
# Importação e visualização da série de preços de b3sa3
b3sa3 <- get.hist.quote("b3sa3.sa",
                        quote = "Close", 
                        start = dataini, 
                        end = datafim)
length(b3sa3)   # Mostra o número de observações coletadas
b3sa3           # Exibe os dados na tela
plot(b3sa3, main = "Série de Preços - B3SA3", col = "blue")  # Gráfico da série

Code
# Importação e visualização da série de preços de slce3
slce3 <- get.hist.quote("slce3.sa",
                        quote = "Close", 
                        start = dataini, 
                        end = datafim)
length(slce3)
slce3
plot(slce3, main = "Série de Preços - SLCE3", col = "darkgreen")

Code
# Importação e visualização da série de preços de ggbr4
ggbr4 <- get.hist.quote("ggbr4.sa",
                        quote = "Close", 
                        start = dataini, 
                        end = datafim)
length(ggbr4)
ggbr4
plot(ggbr4, main = "Série de Preços - GGBR4", col = "purple")

Code
# Importação e visualização da série de preços de radl3
radl3 <- get.hist.quote("radl3.sa",
                        quote = "Close", 
                        start = dataini, 
                        end = datafim)
length(radl3)
radl3
plot(radl3, main = "Série de Preços - RADL3", col = "orange")

Code
# Importação e visualização da série de preços de ibov
ibov <- get.hist.quote("^BVSP",
                        quote = "Close", 
                        start = dataini, 
                        end = datafim)
length(ibov)
ibov
plot(ibov, main = "Série de Preços - IBOV", col = "yellow")

2.0.2 Análise da relação deixada dos ativos a partir das medidas estatísticas do retorno

Code
# Retornos logarítmicos, médias (%), desvios, CV e volatilidade dos 5 ativos + IBOV
rcsan3 <- diff(log(csan3)); mrcsan3 <- mean(rcsan3)*100; Drcsan3 <- sd(rcsan3); cvcsan3 <- Drcsan3/mrcsan3*100
Volcsan3 <- (Drcsan3 * 100) * sqrt(252)       # Volatilidade anualizada (%)

rb3sa3 <- diff(log(b3sa3)); mrb3sa3 <- mean(rb3sa3)*100; Drb3sa3 <- sd(rb3sa3); cvb3sa3 <- Drb3sa3/mrb3sa3*100
Volb3sa3 <- (Drb3sa3 * 100) * sqrt(252)       # Volatilidade anualizada (%)

rslce3 <- diff(log(slce3)); mrslce3 <- mean(rslce3)*100; Drslce3 <- sd(rslce3); cvslce3 <- Drslce3/mrslce3*100
Volslce3 <- (Drslce3 * 100) * sqrt(252)       # Volatilidade anualizada (%)

rggbr4 <- diff(log(ggbr4)); mrggbr4 <- mean(rggbr4)*100; Drggbr4 <- sd(rggbr4); cvggbr4 <- Drggbr4/mrggbr4*100
Volggbr4 <- (Drggbr4 * 100) * sqrt(252)       # Volatilidade anualizada (%)

rradl3 <- diff(log(radl3)); mrradl3 <- mean(rradl3)*100; Drradl3 <- sd(rradl3); cvradl3 <- Drradl3/mrradl3*100
Volradl3 <- (Drradl3 * 100) * sqrt(252)       # Volatilidade anualizada (%)

ribov  <- diff(log(ibov));  mribov  <- mean(ribov)*100;  Dribov  <- sd(ribov);  cvibov  <- Dribov/mribov*100
Volibov <- (Dribov * 100) * sqrt(252)       # Volatilidade anualizada (%)

# Tabela
tabela_retornos <- tibble::tibble(
  Ativo = c("CSAN3", "B3SA3", "SLCE3", "GGBR4", "RADL3", "IBOV"),
  `Média (%)` = c(mrcsan3, mrb3sa3, mrslce3, mrggbr4, mrradl3, mribov),
  `Desvio Padrão` = c(Drcsan3, Drb3sa3, Drslce3, Drggbr4, Drradl3, Dribov),
  `Coeficiente de Variação` = c(cvcsan3, cvb3sa3, cvslce3, cvggbr4, cvradl3, cvibov),
  `Votalidade Anualizada` = c(Volcsan3, Volb3sa3, Volslce3, Volggbr4, Volradl3, Volibov)
)

# Exibe a tabela formatada
knitr::kable(tabela_retornos, digits = 4,
             caption = "Média, Desvio, Coeficiente de Variação e Volatilidade dos Retornos Diários") %>%
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                            full_width = FALSE)
Média, Desvio, Coeficiente de Variação e Volatilidade dos Retornos Diários
Ativo Média (%) Desvio Padrão Coeficiente de Variação Votalidade Anualizada
CSAN3 -0.1515 0.0298 -19.6781 47.3113
B3SA3 0.2394 0.0220 9.2081 34.9952
SLCE3 -0.0867 0.0150 -17.3225 23.8417
GGBR4 -0.0740 0.0229 -30.9888 36.4245
RADL3 -0.4027 0.0353 -8.7681 56.0487
IBOV 0.0723 0.0098 13.6021 15.6212

Os ativos CSAN3, SLCE3, GGBR4 e RADL3 apresentaram uma média negativa do retorno médio diário, indicando queda no período analisado (tendência de baixa). O diferente ocorre com o ativo B3SA3, que obteve valorização diária de, aproximadamente, 0.24%.

Quanto ao desvio-padrão, ele mede quanto os retornos diários do ativo variam em torno da média, servindo como uma medida de volatilidade: quanto mais volátil em torno da média, ou seja, do retorno médio diário, maior o risco (e o contrário é verdade). Porém, o desvio-padrão deve ser analisado juntamente com a média, ou melhor, o retorno deve ser analisado juntamente com a volatilidade do ativo/carteira, pois o retorno pode ser alto, porém a volatilidade também sendo muito alta pode não ser atrativa. Dentro dessa carteira, o ativo com desvio-padrão maior é RADL3 (0.0353), sendo o mais instável comparado aos outros ativos e, principalmente, ao índice de mercado (IBOV).

O coeficiente de variação (CV) indica a relação risco-retorno de um ativo. O único ativo eficiente isoladamente foi B3SA3, que apresenta retorno médio diário positivo (aproximadamente 0.24%) e CV aceitável (9.2081). Nenhum ativo individualmente, exceto B3SA3, se mostrou superior ao índice de forma consistente, mas eles podem ter papel na carteira através da correlação.

A volatilidade anualizada é o desvio-padrão dos retornos diários ajustado para refletir o horizonte de 1 ano (252 pregões). Ou seja, mede a amplitude das oscilações esperadas do ativo em termos anuais. Segundo Copeland, ativos com volatilidade alta precisam entregar retornos proporcionais, caso contrário não atraem investidores racionais. B3SA3 foi o único ativo que entregou retorno positivo condinzente com sua volatilidade, que foi de aproximadamente 35% no período, além do benchmark (IBOV). Quanto aos ativos RADL3 e CSAN3 expõem os investidores a variações muito elevadas (56% e 47%).

2.0.3 Matriz de Correlação - Identificar diversificação e concentração

   csan3  b3sa3  slce3  ggbr4  radl3   ibov

csan3 1.000 0.492 -0.008 0.489 -0.515 0.649 b3sa3 0.492 1.000 -0.331 0.232 -0.730 0.899 slce3 -0.008 -0.331 1.000 -0.477 0.699 -0.356 ggbr4 0.489 0.232 -0.477 1.000 -0.616 0.541 radl3 -0.515 -0.730 0.699 -0.616 1.000 -0.822 ibov 0.649 0.899 -0.356 0.541 -0.822 1.000

Matriz de Correlação
Ativo csan3 b3sa3 slce3 ggbr4 radl3 ibov
csan3 1.000 0.492 -0.008 0.489 -0.515 0.649
b3sa3 0.492 1.000 -0.331 0.232 -0.730 0.899
slce3 -0.008 -0.331 1.000 -0.477 0.699 -0.356
ggbr4 0.489 0.232 -0.477 1.000 -0.616 0.541
radl3 -0.515 -0.730 0.699 -0.616 1.000 -0.822
ibov 0.649 0.899 -0.356 0.541 -0.822 1.000
Code
# Agrupar os vetores de preços ou retornos (caso estejam disponíveis) em uma matriz
Correl <- cbind(csan3, b3sa3, slce3, ggbr4, radl3, ibov); Correl

# Renomear as colunas com os nomes dos ativos
names(Correl) <- c("csan3", "b3sa3", "slce3", "ggbr4", "radl3", "ibov"); Correl

# Verificar a classe da estrutura (deve ser data.frame para correlação)
class(Correl)

# Converter explicitamente para data.frame, se necessário
Correl <- cbind.data.frame(csan3, b3sa3, slce3, ggbr4, radl3, ibov); Correl
names(Correl) <- c("csan3", "b3sa3", "slce3", "ggbr4", "radl3", "ibov"); Correl

# Anexar para uso direto das variáveis
attach(Correl)
class(Correl)

# Carregar pacote para testes estatísticos
library(fBasics)

# Cálculo do Coeficiente de Correlação de Pearson entre dois ativos específicos
Corr01 <- correlationTest(slce3, radl3, method = c("pearson")); Corr01
Corr02 <- correlationTest(b3sa3, radl3, method = c("pearson")); Corr02

# Plot do gráfico de dispersão entre dois ativos
par(mfrow = c(1,1))
plot(csan3, b3sa3, main = "Correlação SLCE3 x radl3")
abline(lm(b3sa3 ~ csan3), col = "red", lwd = 3)

Code
par(mfrow = c(1,1))
plot(b3sa3, radl3, main = "Correlação B3SA3 x RADL3")
abline(lm(radl3 ~ b3sa3), col = "orange", lwd = 3)

Code
# Base para correlação
Correl <- data.frame(csan3, b3sa3, slce3, ggbr4, radl3, ibov)
names(Correl) <- c("csan3","b3sa3","slce3","ggbr4","radl3","ibov")

# Matriz de correlação (imprime no relatório)
corr_mat <- cor(Correl, use = "complete.obs", method = "pearson")
print(round(corr_mat, 3))  # garante saída mesmo sem pacote de formatação

# Tabela
if (requireNamespace("knitr", quietly = TRUE)) {
  knitr::kable(
    data.frame(Ativo = rownames(corr_mat), round(corr_mat, 3), row.names = NULL),
    caption = "Matriz de Correlação (amostra selecionada)",
    digits = 3,
    align = "lrrrrrr"
  ) |> print()
}

A matriz de correlação mostra a relação e a intensidade do movimento entre diferentes ativos numa carteira. A diversificação ocorre quando os ativos tem correlação baixa ou negativa, não se movendo de maneira sincronizada, permitindo reduzir o risto total da carteira, como B3SA3 x RADL3 (-0.730), que contribui para a diluição do risco devido a forte correlação negativa. Concentração ocorre quando a correlação é alta e positiva, pois os ativos tendem a oscilar na mesma direção, ampliando o risco não sistemático. É o caso de SLCE3 e RADL3 (0.699) que, quando combinados, não reduzem risco.

3 Processo de otimização das carteiras: Mínima Variância, Carteira Ótima e Carteira Customizada

3.0.1 a) Mínima Variância

Code
# Unir os cinco ativos em uma base única, removendo valores faltantes
Basico <- data.frame(na.omit(merge(csan3, b3sa3, slce3, ggbr4, radl3))); Basico

# Renomear as colunas com os códigos dos ativos
names(Basico) <- c("csan3", "b3sa3", "slce3", "ggbr4", "radl3"); Basico

# Verificar o tamanho de uma das séries
length(b3sa3)

# Salvar os dados em um arquivo .txt (opcional)
write.table(Basico, file = "Basico.txt")

# Ler o arquivo e transformar em timeSeries para análise de portfólio
dados <- read.table("Basico.txt", head = TRUE); dados
dados <- timeSeries(dados)
dados

# Calcular os retornos logarítmicos
Retornos <- returns(dados); Retornos

# Carregar o pacote para análise da fronteira eficiente
require(fPortfolio)

# Calcular a fronteira eficiente de Markowitz
fronteira <- portfolioFrontier(Retornos); fronteira

# Plotar a fronteira eficiente
frontierPlot(fronteira, auto = FALSE)

# Inserir pontos manuais no gráfico como exemplos de portfólios
points(0.0341, -0.0037, pch = 19, cex = 1.5, col = "green")
points(0.0186, -0.0022, pch = 19, cex = 1.5, col = "green")
points(0.0127, -0.0006, pch = 19, cex = 1.5, col = "green")
points(0.0222,  0.0024, pch = 19, cex = 1.5, col = "red")  # Exemplo de portfólio eficiente

# Calcular o portfólio de mínima variância com base nos retornos dos 5 ativos
MinimaVariancia <- minvariancePortfolio(Retornos)

# Extrair os pesos dos ativos no portfólio de mínima variância
PesosMinimos <- getWeights(MinimaVariancia)
PesosMinimos  # Mostra a proporção de cada ativo

# Calcular o retorno esperado desse portfólio
RetornoCalculado <- getTargetReturn(MinimaVariancia)
RetornoCalculado

# Calcular o risco (desvio padrão) desse portfólio
RiscoMinimo <- getTargetRisk(MinimaVariancia)
RiscoMinimo

# Plotar o ponto da mínima variância na fronteira
points(RiscoMinimo["Sigma"], RetornoCalculado["mean"], pch = 19, cex = 1.8, col = "blue")

Code
# Gráfico em pizza com os pesos dos ativos no portfólio de mínima variância
GraficoPizza <- weightsPie(MinimaVariancia)

Code
GraficoPizza

A carteira de mínima variância demonstra a combinação de ativos que gera o menor risco possível para uma carteira diversificada. Nesta carteira, é representado o nível ótimo de diversificação, em que o risco não sistemático (ou risco diversificável) é minimizado.

O maior peso em SLCE3 ocorre devido sua baixa volatilidade no período analisado e atua como estabilizador da carteira, mesmo com retorno médio negativo. O retorno positivo de B3SA3 explica seu peso relevante, além de possuir volatilidade moderada. Os outros ativos ajudam a minimizar o risco devido à correlações negativas que suaviza oscilações, pois nenhum deles apresentou retorno positivo.

3.0.2 b) Carteira Ótima

Code
CarteiraCustom<-portfolioSpec(portfolio=list(
  weights=NULL,targetReturn=0.0022, 
  targetRisk=NULL, riskFreeRate=0.055,nFrontierPoints=50))
CarteiraCustom

Model List: 
 Type:                      MV
 Optimize:                  minRisk
 Estimator:                 covEstimator
 Params:                    alpha = 0.05

Portfolio List: 
 Target Weights:            NULL
 Target Return:             0.0022
 Target Risk:               NULL
 Risk-Free Rate:            0.055
 Number of Frontier Points: 50
 Status:                    0

Optim List: 
 Solver:                    solveRquadprog
 Objective:                 portfolioObjective portfolioReturn portfolioRisk
 Options:                   meq = 2
 Trace:                     FALSE
Code
CarteiraCustomizada<-efficientPortfolio(Retornos, spec=CarteiraCustom)
CarteiraCustomizada

Title:
 MV Efficient Portfolio 
 Estimator:         covEstimator 
 Solver:            solveRquadprog 
 Optimize:          minRisk 
 Constraints:       LongOnly 

Portfolio Weights:
 csan3  b3sa3  slce3  ggbr4  radl3 
0.0000 0.9405 0.0595 0.0000 0.0000 

Covariance Risk Budgets:
 csan3  b3sa3  slce3  ggbr4  radl3 
0.0000 0.9898 0.0102 0.0000 0.0000 

Target Returns and Risks:
  mean    Cov   CVaR    VaR 
0.0022 0.0209 0.0376 0.0300 

Description:
 Fri Oct 10 19:47:08 2025 by user: Sandrielly 
Code
getWeights(CarteiraCustomizada)
     csan3      b3sa3      slce3      ggbr4      radl3 
0.00000000 0.94048837 0.05951163 0.00000000 0.00000000 
Code
getTargetReturn(CarteiraCustomizada)
  mean     mu 
0.0022 0.0022 
Code
getTargetRisk(CarteiraCustomizada)
       Cov      Sigma       CVaR        VaR 
0.02092726 0.02092726 0.03758838 0.02995253 
Code
frontierPlot(portfolioFrontier(Retornos))
points(frontierPoints(CarteiraCustomizada)[,1], frontierPoints(CarteiraCustomizada)[,2], col="blue", pch=17, cex=1.5)

singleAssetPoints(fronteira, col="pink", pch=19)
tangencyLines(fronteira, col="green", pch=19)

Code
GraficoPizzaCustom<-weightsPie(CarteiraCustomizada);GraficoPizzaCustom

     b3sa3      slce3 
0.94048837 0.05951163 

Segundo Markowitz, a carteira ótima é um ponto dentro da fronteira eficiente, ajustado ao retorno desejado. Ou seja, a carteira ótima é aquela que entrega o melhor trade-off entre risco e retorno, dado um retorno-alvo. Normalmente, os ativos que ganham maior peso nessa carteira são os que tem melhor retorno ajustado ao risco, além de possuir correlação favorável (que, nesse contexto, deve ser negativa). A concentração elevada em B3SA3 acontece justamente por isso, devido ao melhor equilíbrio risco-retorno observado dentre os ativos no período observado. Os outros atvos foram descartados, já que não contribuíram para reduzir o risco nem para elevar o retorno no ponto escolhido.

3.0.3 c) Carteira Customizada pelo Índice de Sharpe

Code
CarteiraCustom<-portfolioSpec(portfolio=list(
  weights=NULL,targetReturn=0.0022, 
  targetRisk=NULL, riskFreeRate=0.055,nFrontierPoints=50))
CarteiraCustom

Model List: 
 Type:                      MV
 Optimize:                  minRisk
 Estimator:                 covEstimator
 Params:                    alpha = 0.05

Portfolio List: 
 Target Weights:            NULL
 Target Return:             0.0022
 Target Risk:               NULL
 Risk-Free Rate:            0.055
 Number of Frontier Points: 50
 Status:                    0

Optim List: 
 Solver:                    solveRquadprog
 Objective:                 portfolioObjective portfolioReturn portfolioRisk
 Options:                   meq = 2
 Trace:                     FALSE
Code
CarteiraCustomizada<-efficientPortfolio(Retornos, spec=CarteiraCustom)
CarteiraCustomizada

Title:
 MV Efficient Portfolio 
 Estimator:         covEstimator 
 Solver:            solveRquadprog 
 Optimize:          minRisk 
 Constraints:       LongOnly 

Portfolio Weights:
 csan3  b3sa3  slce3  ggbr4  radl3 
0.0000 0.9405 0.0595 0.0000 0.0000 

Covariance Risk Budgets:
 csan3  b3sa3  slce3  ggbr4  radl3 
0.0000 0.9898 0.0102 0.0000 0.0000 

Target Returns and Risks:
  mean    Cov   CVaR    VaR 
0.0022 0.0209 0.0376 0.0300 

Description:
 Fri Oct 10 19:47:08 2025 by user: Sandrielly 
Code
getWeights(CarteiraCustomizada)
     csan3      b3sa3      slce3      ggbr4      radl3 
0.00000000 0.94048837 0.05951163 0.00000000 0.00000000 
Code
getTargetReturn(CarteiraCustomizada)
  mean     mu 
0.0022 0.0022 
Code
getTargetRisk(CarteiraCustomizada)
       Cov      Sigma       CVaR        VaR 
0.02092726 0.02092726 0.03758838 0.02995253 
Code
frontierPlot(portfolioFrontier(Retornos))
points(frontierPoints(CarteiraCustomizada)[,1], frontierPoints(CarteiraCustomizada)[,2], col="blue", pch=17, cex=1.5)

singleAssetPoints(fronteira, col="pink", pch=19)
tangencyLines(fronteira, col="green", pch=19)
sharpeRatioLines(fronteira, col="red")

Code
tailoredFrontierPlot(portfolioFrontier(Retornos))

Code
GraficoPizzaCustom<-weightsPie(CarteiraCustomizada);GraficoPizzaCustom

     b3sa3      slce3 
0.94048837 0.05951163 

A Carteira Customizada pelo Índice de Sharpe mostra o ponto em que o investidor obtém a maior compensação de retorno por unidade de risco. Essa concentrou 94% em B3SA3 e 6% em SLCE3. Neste caso, B3SA3 é o ativo que mais conseguiu superar a Selic no período analisado, mesmo que possua um risco considerável. Quanto a SLCE3, entra em pequena fração porque ajuda a reduzir volatilidade. Os demais ativos (CSAN3, GGBR4, RADL3) recebram peso zero, pois não conseguiram entregar retorno suficiente acima da taxa Selic (aproximadamente 0.055 ao dia). Essa carteira é a mais eficiente para maximizar retorno por risco, mas tem baixa diversificação. Logo exige atenção. É importante destacar que a concentração pode não ser desejável em situações reais.

A Carteira de Mínima Variância tem o objetivo de atingir o menor risco possível, porém, mesmo sendo eficiente no risco, é ineficiente no retorno absoluto, não conseguindo atingir a taxa livre de risco. A Carteira Ótima atinge um retorno desejado com o menor risco possível, sendo o ponto composto pelos ativos B3SA3 e SLCE3. A Carteira Customizada pelo Índice de Sharpe maximiza o retorno excedente com relação à Selic por unidade de risco, a qual também foi dominada por B3SA3 (~94%) e uma pequena proporção de SLCE3 (~6%). Ela é a mais eficiente matematicamente, porém muito concentrada. Se considerarmos o investidor avesso ao risco, ele poderia preferir investir em renda fixa, já que a Selic possui um retorno maior frente a essa carteira.

4 Betas-Mercado

4.0.1 60 pregões

Code
# BUSCAR SELIC DIÁRIA
  
  library(rbcb)
  
  selic <- get_series(11, start_date = dataini,end_date = datafim);selic 
  library(zoo)
  Selic=zoo(selic$'11')
  index(Selic)=selic$date
  Selic; plot(Selic)

Code
# BUSCAR IBOVESPA
  
  Ibov <- get.hist.quote("^BVSP", quote = "Close", start = dataini,end = datafim)
  Ibov <- na.omit(Ibov)
  length(Ibov)
  Ibov
  plot(Ibov, main = "Preços de Fechamento - IBOV")

Code
# Elaborar a MATRIZ de dados para CAPM 5Ativos
  
  dados2=na.omit(merge(Ibov,Selic))
  dados2=data.frame(index(dados2), dados2)
  names(dados2)=c("Data", "Ibovespa", "SELIC")
  attach(dados2); dados2
  
  library(zoo)
  Ativos=merge(csan3,b3sa3,slce3,ggbr4,radl3,Ibov,Selic)
  length(na.omit(Ativos[,1]))
  Data1=index(na.omit(Ativos));length(Data1)
  
  CarteiraBETA=data.frame(na.omit(Ativos),na.omit(Data1))
  names(CarteiraBETA)=c("csan3","b3sa3","slce3","ggbr4","radl3","Ibovespa","Selic", "Data1")
  attach(CarteiraBETA)
  options(max.print=99999)
  CarteiraBETA
  n=length(CarteiraBETA[,1]); n
  CarteiraBETA[n,]
  write.table(CarteiraBETA, file="BetaCarteira.txt")
  
# Estimação do Beta Mercado dos Ativos
  
  CarteiraBETA<-read.table("BetaCarteira.txt", head=T)
  names(CarteiraBETA)<-c("csan3","b3sa3","slce3","ggbr4","radl3","Ibovespa","Selic", "Data")
  attach(CarteiraBETA)
  CarteiraBETA; length((CarteiraBETA$Selic))
  
  CarteiraBETA$Ibovespa;length(CarteiraBETA$Ibovespa)
  CarteiraBETA$csan3;length(CarteiraBETA$csan3)
  CarteiraBETA$Selic;length(CarteiraBETA$Selic)
  
  rIbov=diff(log(Ibovespa));rIbov;length(rIbov)
  RIbov=rIbov*100;RIbov;mean(RIbov)
  RSelic=CarteiraBETA$Selic[-1];length(CarteiraBETA$Selic[-1])
  RSelic
  
  rcsan3=diff(log(CarteiraBETA$csan3[-1]));length(CarteiraBETA$csan3[-1])
  rb3sa3=diff(log(CarteiraBETA$b3sa3[-1]));length(CarteiraBETA$b3sa3[-1])
  rslce3=diff(log(CarteiraBETA$slce3[-1]));length(CarteiraBETA$slce3[-1])
  rggbr4=diff(log(CarteiraBETA$ggbr4[-1]));length(CarteiraBETA$ggbr4[-1])
  rradl3=diff(log(CarteiraBETA$radl3[-1]));length(CarteiraBETA$radl3[-1])
  
  #RIbov=(rIbov-Selic[-1])
  RIbov=(rIbov-RSelic);length(RIbov);RIbov
  Rcsan3=rcsan3-RSelic[-1]
  Rcsan3;length(Rcsan3)
  Rb3sa3=rb3sa3-RSelic[-1]
  Rslce3=rslce3-RSelic[-1]
  Rggbr4=rggbr4-RSelic[-1]
  Rradl3=rradl3-RSelic[-1]
  
  #Cálculo dos Betas
  
  Betacsan3=lm(Rcsan3~RIbov[-1])
  Betacsan3
  Betab3sa3=lm(Rb3sa3~RIbov[-1]);Betab3sa3
  Betaslce3=lm(Rslce3~RIbov[-1]);Betaslce3
  Betaggbr4=lm(Rggbr4~RIbov[-1]);Betaggbr4
  Betaradl3=lm(Rradl3~RIbov[-1]);Betaradl3
Code
# Elaboração do Gráfico de Comparação dos Betas
  
  names=c("csan3","b3sa3","slce3","ggbr4","radl3")
  BETA.Mercado=c(Betacsan3$coef[2],Betab3sa3$coef[2],Betaslce3$coef[2],Betaggbr4$coef[2],Betaradl3$coef[2]);names;BETA.Mercado
[1] "csan3" "b3sa3" "slce3" "ggbr4" "radl3"
RIbov[-1] RIbov[-1] RIbov[-1] RIbov[-1] RIbov[-1] 
2.1525015 1.7486631 0.5311431 1.3833072 0.8931109 
Code
  bpb<-barplot(BETA.Mercado, main="Cálculo do Beta-Mercado da Carteira Sugerida (60 dias)", ylim=c(0,3.0),names.arg=names, ylab="Percentual %", cex.names=1, col="darkgreen")
  text(x = as.vector(bpb), y = BETA.Mercado, 
       label =  round(BETA.Mercado, 2), pos = 3, 
       col = "black",cex=0.8)

O beta mercado mede a sensibilidade do ativo em relação a oscilações do mercado (benchmark IBOV). Se o beta for maior que 1, quer dizer que o ativo é mais volátil que o mercado. É o caso dos ativos CSAN3, B3SA3 e GGBR4.

4.0.2 Coleta de Dados - 90 pregões

Code
setwd("C:/Users/Sandrielly/Documents/Ciencias Economicas/P6 - 2025.1/Gestao de Risco")

remove(list=ls())
gc()
par(mfrow=c(1,1))
options(scipen=999)
options(max.print = 100000)
date()

#install.packages("kableExtra")
library(tseries)
library(fBasics)
library(tibble)
library(kableExtra)


#Período 60 pregões
dataini <- "2025-02-14"
datafim <- "2025-06-28"

## Busca dos Dados

csan3 <- get.hist.quote("csan3.sa", quote = "Close", start = dataini, end = datafim); length(csan3); csan3
b3sa3 <- get.hist.quote("b3sa3.sa", quote = "Close", start = dataini, end = datafim); length(b3sa3); b3sa3
slce3 <- get.hist.quote("slce3.sa", quote = "Close", start = dataini, end = datafim); length(slce3); slce3
ggbr4 <- get.hist.quote("ggbr4.sa", quote = "Close", start = dataini, end = datafim); length(ggbr4); ggbr4
radl3 <- get.hist.quote("radl3.sa", quote = "Close", start = dataini, end = datafim); length(radl3); radl3
ibov  <- get.hist.quote("^BVSP",     quote = "Close", start = dataini, end = datafim); length(ibov);  ibov

# Retornos logarítmicos, médias (%), desvios, CV e volatilidade dos 5 ativos + IBOV
rcsan3 <- diff(log(csan3)); mrcsan3 <- mean(rcsan3)*100; Drcsan3 <- sd(rcsan3); cvcsan3 <- Drcsan3/mrcsan3*100
Volcsan3 <- (Drcsan3 * 100) * sqrt(252)       # Volatilidade anualizada (%)
Volcsan3

rb3sa3 <- diff(log(b3sa3)); mrb3sa3 <- mean(rb3sa3)*100; Drb3sa3 <- sd(rb3sa3); cvb3sa3 <- Drb3sa3/mrb3sa3*100
Volb3sa3 <- (Drb3sa3 * 100) * sqrt(252)       # Volatilidade anualizada (%)
Volb3sa3

rslce3 <- diff(log(slce3)); mrslce3 <- mean(rslce3)*100; Drslce3 <- sd(rslce3); cvslce3 <- Drslce3/mrslce3*100
Volslce3 <- (Drslce3 * 100) * sqrt(252)       # Volatilidade anualizada (%)
Volslce3

rggbr4 <- diff(log(ggbr4)); mrggbr4 <- mean(rggbr4)*100; Drggbr4 <- sd(rggbr4); cvggbr4 <- Drggbr4/mrggbr4*100
Volggbr4 <- (Drggbr4 * 100) * sqrt(252)       # Volatilidade anualizada (%)
Volggbr4

rradl3 <- diff(log(radl3)); mrradl3 <- mean(rradl3)*100; Drradl3 <- sd(rradl3); cvradl3 <- Drradl3/mrradl3*100
Volradl3 <- (Drradl3 * 100) * sqrt(252)       # Volatilidade anualizada (%)
Volradl3

ribov  <- diff(log(ibov));  mribov  <- mean(ribov)*100;  Dribov  <- sd(ribov);  cvibov  <- Dribov/mribov*100
Volibov <- (Dribov * 100) * sqrt(252)       # Volatilidade anualizada (%)
Volibov

# Tabela
tabela_retornos <- tibble::tibble(
  Ativo = c("CSAN3", "B3SA3", "SLCE3", "GGBR4", "RADL3", "IBOV"),
  `Média (%)` = c(mrcsan3, mrb3sa3, mrslce3, mrggbr4, mrradl3, mribov),
  `Desvio Padrão` = c(Drcsan3, Drb3sa3, Drslce3, Drggbr4, Drradl3, Dribov),
  `Coeficiente de Variação` = c(cvcsan3, cvb3sa3, cvslce3, cvggbr4, cvradl3, cvibov),
  `Votalidade Anualizada` = c(Volcsan3, Volb3sa3, Volslce3, Volggbr4, Volradl3, Volibov)
)

# Exibe a tabela formatada
knitr::kable(tabela_retornos, digits = 4,
             caption = "Média, Desvio, Coeficiente de Variação e Volatilidade dos Retornos Diários") %>%
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                            full_width = FALSE)

Na análise de 90 pregões, B3SA3 continua sendo o único ativo com retorno positivo, enquanto que a menor variação se mantem em SLCE3, porém ainda com retorno negativo.

4.0.3 90 pregões

Code
#Período 90 pregões
dataini <- "2025-02-14"
datafim <- "2025-06-28"

## Busca dos Dados

csan3 <- get.hist.quote("csan3.sa", quote = "Close", start = dataini, end = datafim); length(csan3); csan3
b3sa3 <- get.hist.quote("b3sa3.sa", quote = "Close", start = dataini, end = datafim); length(b3sa3); b3sa3
slce3 <- get.hist.quote("slce3.sa", quote = "Close", start = dataini, end = datafim); length(slce3); slce3
ggbr4 <- get.hist.quote("ggbr4.sa", quote = "Close", start = dataini, end = datafim); length(ggbr4); ggbr4
radl3 <- get.hist.quote("radl3.sa", quote = "Close", start = dataini, end = datafim); length(radl3); radl3
ibov  <- get.hist.quote("^BVSP",     quote = "Close", start = dataini, end = datafim); length(ibov);  ibov

# BUSCAR SELIC DIÁRIA
  
  library(rbcb)
  
  selic <- get_series(11, start_date = dataini,end_date = datafim);selic 
  library(zoo)
  Selic=zoo(selic$'11')
  index(Selic)=selic$date
  Selic; plot(Selic)

Code
# BUSCAR IBOVESPA
  
  Ibov <- get.hist.quote("^BVSP", quote = "Close", start = dataini,end = datafim)
  Ibov <- na.omit(Ibov)
  length(Ibov)
  Ibov
  plot(Ibov, main = "Preços de Fechamento - IBOV")

Code
# Elaborar a MATRIZ de dados para CAPM 5Ativos
  
  dados2=na.omit(merge(Ibov,Selic))
  dados2=data.frame(index(dados2), dados2)
  names(dados2)=c("Data", "Ibovespa", "SELIC")
  attach(dados2); dados2
  
  library(zoo)
  Ativos=merge(csan3,b3sa3,slce3,ggbr4,radl3,Ibov,Selic)
  length(na.omit(Ativos[,1]))
  Data1=index(na.omit(Ativos));length(Data1)
  
  CarteiraBETA=data.frame(na.omit(Ativos),na.omit(Data1))
  names(CarteiraBETA)=c("csan3","b3sa3","slce3","ggbr4","radl3","Ibovespa","Selic", "Data1")
  attach(CarteiraBETA)
  options(max.print=99999)
  CarteiraBETA
  n=length(CarteiraBETA[,1]); n
  CarteiraBETA[n,]
  write.table(CarteiraBETA, file="BetaCarteira.txt")
  
# Estimação do Beta Mercado dos Ativos
  
  CarteiraBETA<-read.table("BetaCarteira.txt", head=T)
  names(CarteiraBETA)<-c("csan3","b3sa3","slce3","ggbr4","radl3","Ibovespa","Selic", "Data")
  attach(CarteiraBETA)
  CarteiraBETA; length((CarteiraBETA$Selic))
  
  CarteiraBETA$Ibovespa;length(CarteiraBETA$Ibovespa)
  CarteiraBETA$csan3;length(CarteiraBETA$csan3)
  CarteiraBETA$Selic;length(CarteiraBETA$Selic)
  
  rIbov=diff(log(Ibovespa));rIbov;length(rIbov)
  RIbov=rIbov*100;RIbov;mean(RIbov)
  RSelic=CarteiraBETA$Selic[-1];length(CarteiraBETA$Selic[-1])
  RSelic
  
  rcsan3=diff(log(CarteiraBETA$csan3[-1]));length(CarteiraBETA$csan3[-1])
  rb3sa3=diff(log(CarteiraBETA$b3sa3[-1]));length(CarteiraBETA$b3sa3[-1])
  rslce3=diff(log(CarteiraBETA$slce3[-1]));length(CarteiraBETA$slce3[-1])
  rggbr4=diff(log(CarteiraBETA$ggbr4[-1]));length(CarteiraBETA$ggbr4[-1])
  rradl3=diff(log(CarteiraBETA$radl3[-1]));length(CarteiraBETA$radl3[-1])
  
  #RIbov=(rIbov-Selic[-1])
  RIbov=(rIbov-RSelic);length(RIbov);RIbov
  Rcsan3=rcsan3-RSelic[-1]
  Rcsan3;length(Rcsan3)
  Rb3sa3=rb3sa3-RSelic[-1]
  Rslce3=rslce3-RSelic[-1]
  Rggbr4=rggbr4-RSelic[-1]
  Rradl3=rradl3-RSelic[-1]
  
  #Cálculo dos Betas
  
  Betacsan3=lm(Rcsan3~RIbov[-1])
  Betacsan3
  Betab3sa3=lm(Rb3sa3~RIbov[-1]);Betab3sa3
  Betaslce3=lm(Rslce3~RIbov[-1]);Betaslce3
  Betaggbr4=lm(Rggbr4~RIbov[-1]);Betaggbr4
  Betaradl3=lm(Rradl3~RIbov[-1]);Betaradl3
  

# Elaboração do Gráfico de Comparação dos Betas
  
  names=c("csan3","b3sa3","slce3","ggbr4","radl3")
  BETA.Mercado=c(Betacsan3$coef[2],Betab3sa3$coef[2],Betaslce3$coef[2],Betaggbr4$coef[2],Betaradl3$coef[2]);names;BETA.Mercado
  
  
  bpb<-barplot(BETA.Mercado, main="Cálculo do Beta-Mercado da Carteira Sugerida (90 dias)", ylim=c(0,3.0),names.arg=names, ylab="Percentual %", cex.names=1, col="darkgreen")
  text(x = as.vector(bpb), y = BETA.Mercado, 
       label =  round(BETA.Mercado, 2), pos = 3, 
       col = "black",cex=0.8)

Para um período analisado mais extenso, verifica-se betas um pouco mai suavizados, já que a volatilidade pode ser reduzida num horizonte maior.

5 Índices de Performance (60 pregões)

5.0.1 Jensen

Code
 {
    names=c("csan3","b3sa3","slce3","ggbr4","radl3")
    JENSEN=c(Betacsan3$coef[1],Betab3sa3$coef[1],Betaslce3$coef[1],Betaggbr4$coef[1],Betaradl3$coef[1]);names;JENSEN
    
    bpJensen<-barplot(JENSEN, main="Indicador de Performance: Jensen", 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)
  }

O indicador Jensen mede o quanto o ativo superou ou ficou abaixo do retorno esperado. Sendo ele maior que zero, indica que o ativo superou o mercado ajustado ao risco, ou seja, houve geração de valor; se igual a zero, significa que o ativo teve retorno igual ao esperado para seu nível de risco; se negativo, ou seja, menor que zero, significa que o ativo não compensou o risco de mercado, havendo destruição de valor.

5.0.2 Treynor

Code
#-----------TREYNOR(1965)---------------------
{
mean(csan3)*100
Betacsan3$coef[2]
Treynor<-mean(Rcsan3)*100/Betacsan3$coef[2];Treynor

TREYNOR=c(mean(Rcsan3)*100/Betacsan3$coef[2],mean(Rb3sa3)*100/Betab3sa3$coef[2],mean(Rslce3)*100/Betaslce3$coef[2],mean(Rggbr4)*100/Betaggbr4$coef[2],mean(Rradl3)*100/Betaradl3$coef[2]);names;TREYNOR

bpTreynor<-barplot(TREYNOR, main="Indicador de Performance: Treynor", 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)
}

O índice de Treynor (T) mede quanto de retorno excedente o ativo gerou para cada unidade de risco sistemático. Ou seja, mostra se o retorno adicional do ativo compensa o risco. T maior significa que o ativo ou carteira entrega mais retorno por unidade de Beta, usando melhor seu risco sistemático (o qe não ocorre com nenhum dos ativos). T menor indica retorno adicional fraco em relação ao risco de mercado assumido. Se negativo, indica que o ativo teve desempenho abaixo do ativo livre de risco.

Code
  #-----------SHARPE(1966)----------------------
  {
    mean(Rcsan3)
    sd(Rcsan3)
    Sharpe<-mean(Rcsan3)/sd(Rcsan3);Sharpe
    
    SHARPE=c(mean(Rcsan3)/sd(Rcsan3),mean(Rb3sa3)/sd(Rb3sa3),mean(Rslce3)/sd(Rslce3),mean(Rggbr4)/sd(Rggbr4),mean(Rradl3)/sd(Rradl3));names;SHARPE
    
    bpSharpe<-barplot(SHARPE, main="Indicador de Performance: Sharpe", 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)
  }

O índice de Sharpe é a diferença entre o retorno do ativo e a taxa livre de risco com relação ao desvio-padrão, medindo a eficiência risco retorno. Quanto maior, melhor. Se abaixo de zero, significa que o ativo não supera o retorno do ativo livre de risco.