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