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õesdataini <-"2025-04-01"datafim <-"2025-06-28"## Busca dos Dados# Importação e visualização da série de preços de csan3csan3 <-get.hist.quote("csan3.sa",quote ="Close",start = dataini,end = datafim)length(csan3) # Verifica o número de observaçõescsan3 # Visualiza os dadosplot(csan3, main ="Série de Preços - CSAN3", col ="green")
Code
# Importação e visualização da série de preços de b3sa3b3sa3 <-get.hist.quote("b3sa3.sa",quote ="Close", start = dataini, end = datafim)length(b3sa3) # Mostra o número de observações coletadasb3sa3 # Exibe os dados na telaplot(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 slce3slce3 <-get.hist.quote("slce3.sa",quote ="Close", start = dataini, end = datafim)length(slce3)slce3plot(slce3, main ="Série de Preços - SLCE3", col ="darkgreen")
Code
# Importação e visualização da série de preços de ggbr4ggbr4 <-get.hist.quote("ggbr4.sa",quote ="Close", start = dataini, end = datafim)length(ggbr4)ggbr4plot(ggbr4, main ="Série de Preços - GGBR4", col ="purple")
Code
# Importação e visualização da série de preços de radl3radl3 <-get.hist.quote("radl3.sa",quote ="Close", start = dataini, end = datafim)length(radl3)radl3plot(radl3, main ="Série de Preços - RADL3", col ="orange")
Code
# Importação e visualização da série de preços de ibovibov <-get.hist.quote("^BVSP",quote ="Close", start = dataini, end = datafim)length(ibov)ibovplot(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
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
# Agrupar os vetores de preços ou retornos (caso estejam disponíveis) em uma matrizCorrel <-cbind(csan3, b3sa3, slce3, ggbr4, radl3, ibov); Correl# Renomear as colunas com os nomes dos ativosnames(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árioCorrel <-cbind.data.frame(csan3, b3sa3, slce3, ggbr4, radl3, ibov); Correlnames(Correl) <-c("csan3", "b3sa3", "slce3", "ggbr4", "radl3", "ibov"); Correl# Anexar para uso direto das variáveisattach(Correl)class(Correl)# Carregar pacote para testes estatísticoslibrary(fBasics)# Cálculo do Coeficiente de Correlação de Pearson entre dois ativos específicosCorr01 <-correlationTest(slce3, radl3, method =c("pearson")); Corr01Corr02 <-correlationTest(b3sa3, radl3, method =c("pearson")); Corr02# Plot do gráfico de dispersão entre dois ativospar(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çãoCorrel <-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# Tabelaif (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 faltantesBasico <-data.frame(na.omit(merge(csan3, b3sa3, slce3, ggbr4, radl3))); Basico# Renomear as colunas com os códigos dos ativosnames(Basico) <-c("csan3", "b3sa3", "slce3", "ggbr4", "radl3"); Basico# Verificar o tamanho de uma das sérieslength(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óliodados <-read.table("Basico.txt", head =TRUE); dadosdados <-timeSeries(dados)dados# Calcular os retornos logarítmicosRetornos <-returns(dados); Retornos# Carregar o pacote para análise da fronteira eficienterequire(fPortfolio)# Calcular a fronteira eficiente de Markowitzfronteira <-portfolioFrontier(Retornos); fronteira# Plotar a fronteira eficientefrontierPlot(fronteira, auto =FALSE)# Inserir pontos manuais no gráfico como exemplos de portfóliospoints(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 ativosMinimaVariancia <-minvariancePortfolio(Retornos)# Extrair os pesos dos ativos no portfólio de mínima variânciaPesosMinimos <-getWeights(MinimaVariancia)PesosMinimos # Mostra a proporção de cada ativo# Calcular o retorno esperado desse portfólioRetornoCalculado <-getTargetReturn(MinimaVariancia)RetornoCalculado# Calcular o risco (desvio padrão) desse portfólioRiscoMinimo <-getTargetRisk(MinimaVariancia)RiscoMinimo# Plotar o ponto da mínima variância na fronteirapoints(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ânciaGraficoPizza <-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.
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
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.
# 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); dados2library(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
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.
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.
# 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); dados2library(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)*100Betacsan3$coef[2]Treynor<-mean(Rcsan3)*100/Betacsan3$coef[2];TreynorTREYNOR=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;TREYNORbpTreynor<-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.
Source Code
---title: "Atividade 02"format: html: code-fold: true code-tools: true toc: true toc-depth: 3 number-sections: trueeditor: visual---# IntroduçãoEsse 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.# 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### Coleta de Dados - 60 pregões```{r,echo=TRUE, message=FALSE, warning=FALSE, results='hide'}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õesdataini <- "2025-04-01"datafim <- "2025-06-28"## Busca dos Dados# Importação e visualização da série de preços de csan3csan3 <- get.hist.quote("csan3.sa", quote = "Close", start = dataini, end = datafim)length(csan3) # Verifica o número de observaçõescsan3 # Visualiza os dadosplot(csan3, main = "Série de Preços - CSAN3", col = "green")# Importação e visualização da série de preços de b3sa3b3sa3 <- get.hist.quote("b3sa3.sa", quote = "Close", start = dataini, end = datafim)length(b3sa3) # Mostra o número de observações coletadasb3sa3 # Exibe os dados na telaplot(b3sa3, main = "Série de Preços - B3SA3", col = "blue") # Gráfico da série# Importação e visualização da série de preços de slce3slce3 <- get.hist.quote("slce3.sa", quote = "Close", start = dataini, end = datafim)length(slce3)slce3plot(slce3, main = "Série de Preços - SLCE3", col = "darkgreen")# Importação e visualização da série de preços de ggbr4ggbr4 <- get.hist.quote("ggbr4.sa", quote = "Close", start = dataini, end = datafim)length(ggbr4)ggbr4plot(ggbr4, main = "Série de Preços - GGBR4", col = "purple")# Importação e visualização da série de preços de radl3radl3 <- get.hist.quote("radl3.sa", quote = "Close", start = dataini, end = datafim)length(radl3)radl3plot(radl3, main = "Série de Preços - RADL3", col = "orange")# Importação e visualização da série de preços de ibovibov <- get.hist.quote("^BVSP", quote = "Close", start = dataini, end = datafim)length(ibov)ibovplot(ibov, main = "Série de Preços - IBOV", col = "yellow")```### Análise da relação deixada dos ativos a partir das medidas estatísticas do retorno```{r}# Retornos logarítmicos, médias (%), desvios, CV e volatilidade dos 5 ativos + IBOVrcsan3 <-diff(log(csan3)); mrcsan3 <-mean(rcsan3)*100; Drcsan3 <-sd(rcsan3); cvcsan3 <- Drcsan3/mrcsan3*100Volcsan3 <- (Drcsan3 *100) *sqrt(252) # Volatilidade anualizada (%)rb3sa3 <-diff(log(b3sa3)); mrb3sa3 <-mean(rb3sa3)*100; Drb3sa3 <-sd(rb3sa3); cvb3sa3 <- Drb3sa3/mrb3sa3*100Volb3sa3 <- (Drb3sa3 *100) *sqrt(252) # Volatilidade anualizada (%)rslce3 <-diff(log(slce3)); mrslce3 <-mean(rslce3)*100; Drslce3 <-sd(rslce3); cvslce3 <- Drslce3/mrslce3*100Volslce3 <- (Drslce3 *100) *sqrt(252) # Volatilidade anualizada (%)rggbr4 <-diff(log(ggbr4)); mrggbr4 <-mean(rggbr4)*100; Drggbr4 <-sd(rggbr4); cvggbr4 <- Drggbr4/mrggbr4*100Volggbr4 <- (Drggbr4 *100) *sqrt(252) # Volatilidade anualizada (%)rradl3 <-diff(log(radl3)); mrradl3 <-mean(rradl3)*100; Drradl3 <-sd(rradl3); cvradl3 <- Drradl3/mrradl3*100Volradl3 <- (Drradl3 *100) *sqrt(252) # Volatilidade anualizada (%)ribov <-diff(log(ibov)); mribov <-mean(ribov)*100; Dribov <-sd(ribov); cvibov <- Dribov/mribov*100Volibov <- (Dribov *100) *sqrt(252) # Volatilidade anualizada (%)# Tabelatabela_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 formatadaknitr::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)```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%).### Matriz de Correlação - Identificar diversificação e concentração```{r,echo=FALSE, message=FALSE, warning=FALSE, results='asis'}# Base para correlaçãoCorrel <- 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# Tabelaif (requireNamespace("knitr", quietly = TRUE)) { knitr::kable( data.frame(Ativo = rownames(corr_mat), round(corr_mat, 3), row.names = NULL), caption = "Matriz de Correlação", digits = 3, align = "lrrrrrr" ) |> print()}``````{r,echo=TRUE, message=FALSE, warning=FALSE, results='hide'}# Agrupar os vetores de preços ou retornos (caso estejam disponíveis) em uma matrizCorrel <- cbind(csan3, b3sa3, slce3, ggbr4, radl3, ibov); Correl# Renomear as colunas com os nomes dos ativosnames(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árioCorrel <- cbind.data.frame(csan3, b3sa3, slce3, ggbr4, radl3, ibov); Correlnames(Correl) <- c("csan3", "b3sa3", "slce3", "ggbr4", "radl3", "ibov"); Correl# Anexar para uso direto das variáveisattach(Correl)class(Correl)# Carregar pacote para testes estatísticoslibrary(fBasics)# Cálculo do Coeficiente de Correlação de Pearson entre dois ativos específicosCorr01 <- correlationTest(slce3, radl3, method = c("pearson")); Corr01Corr02 <- correlationTest(b3sa3, radl3, method = c("pearson")); Corr02# Plot do gráfico de dispersão entre dois ativospar(mfrow = c(1,1))plot(csan3, b3sa3, main = "Correlação SLCE3 x radl3")abline(lm(b3sa3 ~ csan3), col = "red", lwd = 3)par(mfrow = c(1,1))plot(b3sa3, radl3, main = "Correlação B3SA3 x RADL3")abline(lm(radl3 ~ b3sa3), col = "orange", lwd = 3)# Base para correlaçãoCorrel <- 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# Tabelaif (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.# Processo de otimização das carteiras: Mínima Variância, Carteira Ótima e Carteira Customizada### a) Mínima Variância```{r,echo=TRUE, message=FALSE, warning=FALSE, results='hide'}# Unir os cinco ativos em uma base única, removendo valores faltantesBasico <- data.frame(na.omit(merge(csan3, b3sa3, slce3, ggbr4, radl3))); Basico# Renomear as colunas com os códigos dos ativosnames(Basico) <- c("csan3", "b3sa3", "slce3", "ggbr4", "radl3"); Basico# Verificar o tamanho de uma das sérieslength(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óliodados <- read.table("Basico.txt", head = TRUE); dadosdados <- timeSeries(dados)dados# Calcular os retornos logarítmicosRetornos <- returns(dados); Retornos# Carregar o pacote para análise da fronteira eficienterequire(fPortfolio)# Calcular a fronteira eficiente de Markowitzfronteira <- portfolioFrontier(Retornos); fronteira# Plotar a fronteira eficientefrontierPlot(fronteira, auto = FALSE)# Inserir pontos manuais no gráfico como exemplos de portfóliospoints(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 ativosMinimaVariancia <- minvariancePortfolio(Retornos)# Extrair os pesos dos ativos no portfólio de mínima variânciaPesosMinimos <- getWeights(MinimaVariancia)PesosMinimos # Mostra a proporção de cada ativo# Calcular o retorno esperado desse portfólioRetornoCalculado <- getTargetReturn(MinimaVariancia)RetornoCalculado# Calcular o risco (desvio padrão) desse portfólioRiscoMinimo <- getTargetRisk(MinimaVariancia)RiscoMinimo# Plotar o ponto da mínima variância na fronteirapoints(RiscoMinimo["Sigma"], RetornoCalculado["mean"], pch = 19, cex = 1.8, col = "blue")# Gráfico em pizza com os pesos dos ativos no portfólio de mínima variânciaGraficoPizza <- weightsPie(MinimaVariancia)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.### b) Carteira Ótima```{r}CarteiraCustom<-portfolioSpec(portfolio=list(weights=NULL,targetReturn=0.0022, targetRisk=NULL, riskFreeRate=0.055,nFrontierPoints=50))CarteiraCustomCarteiraCustomizada<-efficientPortfolio(Retornos, spec=CarteiraCustom)CarteiraCustomizadagetWeights(CarteiraCustomizada)getTargetReturn(CarteiraCustomizada)getTargetRisk(CarteiraCustomizada)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)GraficoPizzaCustom<-weightsPie(CarteiraCustomizada);GraficoPizzaCustom```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.### c) Carteira Customizada pelo Índice de Sharpe```{r}CarteiraCustom<-portfolioSpec(portfolio=list(weights=NULL,targetReturn=0.0022, targetRisk=NULL, riskFreeRate=0.055,nFrontierPoints=50))CarteiraCustomCarteiraCustomizada<-efficientPortfolio(Retornos, spec=CarteiraCustom)CarteiraCustomizadagetWeights(CarteiraCustomizada)getTargetReturn(CarteiraCustomizada)getTargetRisk(CarteiraCustomizada)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")tailoredFrontierPlot(portfolioFrontier(Retornos))GraficoPizzaCustom<-weightsPie(CarteiraCustomizada);GraficoPizzaCustom```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.# Betas-Mercado### 60 pregões```{r,echo=TRUE, message=FALSE, warning=FALSE, results='hide'}# 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)# 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")# 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``````{r}# 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 (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.### Coleta de Dados - 90 pregões```{r,echo=TRUE, message=FALSE, warning=FALSE, results='hide'}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õesdataini <- "2025-02-14"datafim <- "2025-06-28"## Busca dos Dadoscsan3 <- get.hist.quote("csan3.sa", quote = "Close", start = dataini, end = datafim); length(csan3); csan3b3sa3 <- get.hist.quote("b3sa3.sa", quote = "Close", start = dataini, end = datafim); length(b3sa3); b3sa3slce3 <- get.hist.quote("slce3.sa", quote = "Close", start = dataini, end = datafim); length(slce3); slce3ggbr4 <- get.hist.quote("ggbr4.sa", quote = "Close", start = dataini, end = datafim); length(ggbr4); ggbr4radl3 <- get.hist.quote("radl3.sa", quote = "Close", start = dataini, end = datafim); length(radl3); radl3ibov <- 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 + IBOVrcsan3 <- diff(log(csan3)); mrcsan3 <- mean(rcsan3)*100; Drcsan3 <- sd(rcsan3); cvcsan3 <- Drcsan3/mrcsan3*100Volcsan3 <- (Drcsan3 * 100) * sqrt(252) # Volatilidade anualizada (%)Volcsan3rb3sa3 <- diff(log(b3sa3)); mrb3sa3 <- mean(rb3sa3)*100; Drb3sa3 <- sd(rb3sa3); cvb3sa3 <- Drb3sa3/mrb3sa3*100Volb3sa3 <- (Drb3sa3 * 100) * sqrt(252) # Volatilidade anualizada (%)Volb3sa3rslce3 <- diff(log(slce3)); mrslce3 <- mean(rslce3)*100; Drslce3 <- sd(rslce3); cvslce3 <- Drslce3/mrslce3*100Volslce3 <- (Drslce3 * 100) * sqrt(252) # Volatilidade anualizada (%)Volslce3rggbr4 <- diff(log(ggbr4)); mrggbr4 <- mean(rggbr4)*100; Drggbr4 <- sd(rggbr4); cvggbr4 <- Drggbr4/mrggbr4*100Volggbr4 <- (Drggbr4 * 100) * sqrt(252) # Volatilidade anualizada (%)Volggbr4rradl3 <- diff(log(radl3)); mrradl3 <- mean(rradl3)*100; Drradl3 <- sd(rradl3); cvradl3 <- Drradl3/mrradl3*100Volradl3 <- (Drradl3 * 100) * sqrt(252) # Volatilidade anualizada (%)Volradl3ribov <- diff(log(ibov)); mribov <- mean(ribov)*100; Dribov <- sd(ribov); cvibov <- Dribov/mribov*100Volibov <- (Dribov * 100) * sqrt(252) # Volatilidade anualizada (%)Volibov# Tabelatabela_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 formatadaknitr::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.### 90 pregões```{r,echo=TRUE, message=FALSE, warning=FALSE, results='hide'}#Período 90 pregõesdataini <- "2025-02-14"datafim <- "2025-06-28"## Busca dos Dadoscsan3 <- get.hist.quote("csan3.sa", quote = "Close", start = dataini, end = datafim); length(csan3); csan3b3sa3 <- get.hist.quote("b3sa3.sa", quote = "Close", start = dataini, end = datafim); length(b3sa3); b3sa3slce3 <- get.hist.quote("slce3.sa", quote = "Close", start = dataini, end = datafim); length(slce3); slce3ggbr4 <- get.hist.quote("ggbr4.sa", quote = "Close", start = dataini, end = datafim); length(ggbr4); ggbr4radl3 <- get.hist.quote("radl3.sa", quote = "Close", start = dataini, end = datafim); length(radl3); radl3ibov <- 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)# 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")# 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.# Índices de Performance (60 pregões)### Jensen```{r} { 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.### Treynor```{r}#-----------TREYNOR(1965)---------------------{mean(csan3)*100Betacsan3$coef[2]Treynor<-mean(Rcsan3)*100/Betacsan3$coef[2];TreynorTREYNOR=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;TREYNORbpTreynor<-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.```{r}#-----------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.