ANÁLISE DE CARTEIRAS DE INVESTIMENTO

João Pedro Bernardo

2023-11-11

INTRODUÇÃO

Esse relatório tem como função apresentar 3 tipos de carteiras (Variância Mínima; Ótima; Vendas a descoberto), sendo elas embasadas em 6 índices do IBOVESPA (AZUL4.SA, ITUB4.SA, CMIG4.SA, EMBR3.SA, JBSS3.SA, VALE3.SA).

Esses são os tópicos que serão comentados:

  • ARMAZENAGEM DE DADOS
  • VARIÂNCIA MÍNIMA
  • ÓTIMA
  • VENDAS À DESCOBERTO

ARMAZENAGEM DE DADOS

Nessa etapa iremos organizar nosso dados obtidos, além de importar de um servidor público com a função [getSymbols]. Para obter uma melhor análise dos dados, utilizaremos como prazo 180 dias de variações.

Para facilitar o entedimento de quais ações serão analisadas, referenciar-se-á o nome comercial de cada uma:

-Azul: AZUL4.SA;

-Itau: ITUB4.SA;

-Cemig: CMIG4.SA;

-Embraer: EMBR3.SA;

-JBS: JBSS3.SA;

-Vale: VALE3.SA;

#PACOTES UTILIZADOS: ----
library(quantmod)

#ARMAZENAGEM DOS DADOS ----

prazo <- 180


azul <- getSymbols(Symbols = 'AZUL4.SA',
                   from = Sys.Date()-prazo,
                   to = Sys.Date(),
                   auto.assign = FALSE)

itau <- getSymbols(Symbols = 'ITUB4.SA',
                   from = Sys.Date()-prazo,
                   to = Sys.Date(),
                   auto.assign = FALSE)

cemig <- getSymbols(Symbols = 'CMIG4.SA',
                   from = Sys.Date()-prazo,
                   to = Sys.Date(),
                   auto.assign = FALSE)

embraer <- getSymbols(Symbols = 'EMBR3.SA',
                   from = Sys.Date()-prazo,
                   to = Sys.Date(),
                   auto.assign = FALSE)

jbs <- getSymbols(Symbols = 'JBSS3.SA',
                   from = Sys.Date()-prazo,
                   to = Sys.Date(),
                   auto.assign = FALSE)

vale <- getSymbols(Symbols = 'VALE3.SA',
                   from = Sys.Date()-prazo,
                   to = Sys.Date(),
                   auto.assign = FALSE)

#Agora já temos todos os dados oferecidos pelo função dentro de uma variável!

Após adicionar obter os dados do sistema, podemos trabalhar em cima, organizando-os de forma que facilite nossa análise.

#PACOTES UTILIZADOS: ----
library(magrittr) #pipe
library(tibble) #rowname_to_column
library(janitor) #clean_names
library(dplyr) #select; rename


#ORGANIZANDO OS DADOS: ----

#Transformar em "data.frame", pois antes estava em "xts"

tabela_azul <- azul %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% 
  clean_names() %>% #deixa o nome das colunas tudo em minísculo
  select(rowname, azul4_sa_adjusted) %>% #filtra apenas essas colunas
  rename('data' = rowname) %>% 
  rename('AZUL' = azul4_sa_adjusted)

tabela_itau <- itau %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% 
  clean_names() %>% #deixa tudo em minísculo
  select(rowname, itub4_sa_adjusted) %>% #filtra apenas essas colunas
  rename('data' = rowname) %>% 
  rename('ITAU' = itub4_sa_adjusted)

tabela_cemig <- cemig %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% 
  clean_names() %>% #deixa tudo em minísculo
  select(rowname, cmig4_sa_adjusted) %>% #filtra apenas essas colunas
  rename('data' = rowname) %>% 
  rename('CEMIG' = cmig4_sa_adjusted)

tabela_embraer <- embraer %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% 
  clean_names() %>% #deixa tudo em minísculo
  select(rowname, embr3_sa_adjusted) %>% #filtra apenas essas colunas
  rename('data' = rowname) %>% 
  rename('EMBRAER' = embr3_sa_adjusted)

tabela_jbs <- jbs %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% 
  clean_names() %>% #deixa tudo em minísculo
  select(rowname, jbss3_sa_adjusted) %>% #filtra apenas essas colunas
  rename('data' = rowname) %>% 
  rename('JBS' = jbss3_sa_adjusted)

tabela_vale <- vale %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% 
  clean_names() %>% #deixa tudo em minísculo
  select(rowname, vale3_sa_adjusted) %>% #filtra apenas essas colunas
  rename('data' = rowname) %>% 
  rename('VALE' = vale3_sa_adjusted)

Após organizar em diversas tabelas os dados das ações, é recomendado juntar todas em apenas um data.frame, logo, criar-se-á uma variável com o nome consolidado.

#ARMAZENAR TODOS OS DADOS EM UM ÚNICO DATA.FRAME

consolidado <- tabela_azul %>% 
  bind_cols(tabela_cemig[2],
            tabela_embraer[2],
            tabela_itau[2],
            tabela_jbs[2],
            tabela_vale[2])

#MUTAR TODOS OS DADOS, CONFIRMAÇÃO DE EQUALIDADE

consolidado <- tabela_azul %>% 
  full_join(tabela_cemig, by = c('data' = 'data')) %>% 
  full_join(tabela_embraer, by = c('data' = 'data')) %>% 
  full_join(tabela_itau, by = c('data' = 'data')) %>% 
  full_join(tabela_jbs, by = c('data' = 'data')) %>% 
  full_join(tabela_vale, by = c('data' = 'data'))

Desse modo, foi possível obter todos os dados necessários, além de filtrar as informações mais importantes para criar as 3 carteiras citadas anteriormente.

VARIÂNCIA MÍNIMA

Uma carteira de investimentos com mínimo risco é uma estratégia de alocação de ativos projetada para preservar o capital e minimizar a exposição a perdas financeiras.

SÉRIE TEMPORAL

Para conseguir achar qual a carteira de investimentos com a variância mínima, deve-se de antemão transformar a tabela “consolidado” em uma série temporal, uma vez que é necessário conectar esses dados coletados com uma forma cronológica de análise.

Ademais, deve-se criar também, junto ao dados consolidados, o retorno diário para cada ação, sendo que será utilizado a biblioteca timeSeries.

# PACOTES UTILIZADOS: ----
library(timeSeries)

# TRANSFORMAR EM SÉRIE TEMPORAL:

consolidado_ts <- timeSeries(consolidado[,-1], consolidado[,1])

retorno_ts <- returns(consolidado_ts)

CRIAÇÃO DO GRÁFICO DE MÍNIMA VARIÂNCIA

Para conseguir selecionar qualquer tipo de carteira, será utilizado o desvio-padrão (risco) e a média (retorno) do portfólio. Desse modo, será utilizado a tão importante biblioteca fPortfolio, junto com a função portfolioFrontier.

# PACOTES UTILIZADOS:
library(fPortfolio)

# CRIAÇÃO DO OBJETO E GRÁFICO:
fronteira_eficiente <- portfolioFrontier(retorno_ts)

frontierPlot(fronteira_eficiente,
             frontier = 'upper')


minvariancePoints(fronteira_eficiente,
                  col = 'green',
                  cex = 1.5,
                  pch = 19)

Apartir desse gráfico gerado, é possível identifcar onde está o ponto com variância mínima, ou seja, menor risco possível. Dessa maneira, deve-se selecionar qual investimentos devem ser feitos para cada ação. Para isso, foi utilizado a função minvariancePoints para destacar a carteira requerida.

DESTAQUE DOS PESOS PARA CADA AÇÃO

Com a escolha do ponto de mínima variância, deve-se destacar quais são os pesos especulados para cada ação selecionada anteriormente. Para isso, será utilizada a função minvariancePorftofio, juntamente com a função weightsPie para expressar graficamente essa escolha. Ademais, como objetivo de diversificação de carteiras, é possível analisar que deve-se investir em várias ações para alcançar a meta.

carteira_min_risco <- minvariancePortfolio(retorno_ts)

weightsPie(carteira_min_risco)

Dessa maneira, é possível identificar que a ação que deve-se destinar seus investimentos, seguindo essa ordem:

  • ITAU

  • CEMIG

  • VALE

  • EMBRAER

  • JBS

É importante destacar a falta de relevância da ação AZUL, uma vez que para esse tipo de carteira, não é necessário sua aquisição.

ÓTIMA

Para achar qual a carteira ótima, deve-se entender primeiramente o que é índice Sharpe e qual sua relação com o gráfico de eficiência, propondo ao final quais são os melhores pesos para cada ação escolhida.

ÍNDICE SHARPE

O Índice Sharpe mede o desempenho de uma carteira de investimentos em relação ao retorno livre de risco e ao risco da carteira. Matematicamente, ele representa a inclinação da linha que conecta o ponto de retorno livre de risco com o ponto na fronteira eficiente onde a carteira de investimentos em questão se encontra. Quanto maior a inclinação dessa linha (ou seja, quanto maior o Índice Sharpe), melhor o desempenho da carteira em relação ao risco assumido.

Dessa maneira, é possível identifcar no gráfico de eficiência onde está esse ponto, utilizando a função sharpeRatioLines.

frontierPlot(fronteira_eficiente,
             frontier = 'upper')

sharpeRatioLines(fronteira_eficiente,
                 col = 'green',
                 cex = 1.5,
                 pch = 19)

CARTEIRA ÓTIMA (TANGENTE)

Após a identifiação do índice Sharpe, existe uma forte relação entre a tangente da curva gerada e o índice em questão. Logo, é de extrema importância identificar os pesos para cada ação no ponto de tangência. Assim, para encontrar essa carteira, será utilizado a função tangencyPortfolio e a função tangencyPoints para identificar no gráfico de eficiência.

frontierPlot(fronteira_eficiente,
             frontier = 'upper')

tangencyPoints(fronteira_eficiente,
               col = 'green',
               cex = 1.5,
               pch = 19)

carteira_otima <- tangencyPortfolio(retorno_ts)

weightsPie(carteira_otima)

Através da criação dos dois gráficos, é possível identificar a similiaridade entre o índice Sharpe e a tangência da curva, sendo o risco obtido consideravelmente bom, perto dos 0,016.

carteira_otima
## 
## Title:
##  MV Tangency Portfolio 
##  Estimator:         covEstimator 
##  Solver:            solveRquadprog 
##  Optimize:          minRisk 
##  Constraints:       LongOnly 
## 
## Portfolio Weights:
##    AZUL   CEMIG EMBRAER    ITAU     JBS    VALE 
##  0.0043  0.0000  0.0421  0.2736  0.6740  0.0060 
## 
## Covariance Risk Budgets:
##    AZUL   CEMIG EMBRAER    ITAU     JBS    VALE 
##  0.0031  0.0000  0.0141  0.1206  0.8608  0.0015 
## 
## Target Returns and Risks:
##   mean    Cov   CVaR    VaR 
## 0.0021 0.0143 0.0266 0.0196 
## 
## Description:
##  Sat Nov 11 17:12:41 2023 by user: jpber

VENDAS À DESCOBERTO

Vendas a descoberto no mercado financeiro é quando um investidor vende ações ou outros ativos que ele não possui, na esperança de comprá-los a um preço mais baixo no futuro. É uma estratégia usada para lucrar com a queda dos preços dos ativos.

DETERMINAÇÃO DA CARTEIRA COM MAIOR RISCO

Como maneira de deixar a carteira de maneira mais arrojada, ou seja, maior risco e maior retorno, utilizou-se os valores nos parâmetros targetReturn e targetRisk, 0.0025 e 0.019 respectivamente.

configuracao_arrojada <- portfolioSpec(
    model = list(
        type = "MV",
        optimize = "maxReturn",    
        estimator = "covEstimator",     
        tailRisk = list(),               
        params = list(alpha = 0.05, a = 3)),
    portfolio = list(
        weights = NULL,  
        targetReturn = 0.0025,        
        targetRisk = 0.019,
        riskFreeRate = 0, 
        nFrontierPoints = 50,
        status = NA),
    optim = list(
        solver = "solveRshortExact",  
        objective = NULL,  
        parames = list(),
        control = list(meq = 2),   
        trace = FALSE)
)


carteira_config_01 <- efficientPortfolio(retorno_ts,
                                         spec = configuracao_arrojada)


weightsPie(carteira_config_01)

Dessa maneira, ficou-se como sugestão o investimento nas ações da JBS e ITAU. Porém, para escolher a carteira ótima e com vendas à descoberto, necessita-se outra análise.

CARTEIRA ÓTIMA VENDIDO

Para realizar essa análise, deve-se utilizar da ideia já comentada anteriormente, sendo ela sobre a tangente da curva de eficiência, utilizando a função tangencyPortfolio. Ademais, para entrar vendido na ação, deve-se utilizar ‘short’ nos argumentos do constraints.

carteira_otima_vendido <- tangencyPortfolio(retorno_ts,
                                            spec = configuracao_arrojada,
                                            constraints = 'short')

weightsPie(carteira_otima_vendido)

Quando utilizado a ideia de carteira ótima juntamente com a ideia de entrar vendido, outra ação foi inserida na carteira, indicando uma leve mudança no percurso.

carteira_otima_vendido
## 
## Title:
##  MV Tangency Portfolio 
##  Estimator:         covEstimator 
##  Solver:            solveRshortExact 
##  Optimize:          minRisk 
##  Constraints:       
## 
## Portfolio Weights:
##    AZUL   CEMIG EMBRAER    ITAU     JBS    VALE 
##  0.0096 -0.1253  0.0495  0.3377  0.7210  0.0076 
## 
## Covariance Risk Budgets:
##    AZUL   CEMIG EMBRAER    ITAU     JBS    VALE 
##  0.0064 -0.0317  0.0156  0.1402  0.8676  0.0018 
## 
## Target Returns and Risks:
##   mean    Cov   CVaR    VaR 
## 0.0022 0.0152 0.0289 0.0233 
## 
## Description:
##  Sat Nov 11 17:12:41 2023 by user: jpber
tailoredFrontierPlot(portfolioFrontier(retorno_ts,
                                       spec = configuracao_arrojada,
                                       constraints = 'short'))

Por fim, o resultado é esse gráfico, o qual junta todas as ações e sua distância do valor ótimo.

O gráfico mostra que é possível obter retornos esperados mais altos com menos riscos. No entanto, é importante escolher processos que estejam localizados na fronteira de eficiência para obter o melhor resultado possível.

Além disso, o gráfico também mostra que é importante considerar o risco ao avaliar a eficiência de um processo. Processos com retornos esperados mais altos geralmente apresentam mais riscos.