Introdução

Este relatório tem como objetivo organizar o estudo de otimização de portfólio.

Etapa 1 - Seleção de Ativos

Inicialmente, serão considerados alguns ativos, sem maior aprofundamento. São eles:

Para obtenção dos dados, será utilizada a API do website Yahoo Finance, utilizada por meio da biblioteca quantmod e função “getSymbols()”.

library(quantmod)
library(ggplot2)

#Importação dos dados dos ativos a serem estudados para os últimos 90 dias.

IBOV <- getSymbols("^BVSP", from = Sys.Date()-90, to = Sys.Date(), auto.assign = FALSE)

BBDC <- getSymbols("BBDC3.SA", from = Sys.Date()-90, to = Sys.Date(), auto.assign = FALSE)

ITUB <- getSymbols("ITUB3.SA", from = Sys.Date()-90, to = Sys.Date(), auto.assign = FALSE)

PETR <- getSymbols("PETR3.SA", from = Sys.Date()-90, to = Sys.Date(), auto.assign = FALSE)

GOAU <- getSymbols("GOAU3.SA", from = Sys.Date()-90, to = Sys.Date(), auto.assign = FALSE)

CMIG <- getSymbols("CMIG3.SA", from = Sys.Date()-90, to = Sys.Date(), auto.assign = FALSE)

O próximo passo consiste em juntar o preço ajustado de todos os ativos.

#Pacotes necessários
library(magrittr) #Pipe
library(tibble) #Lida com estrutura de tabelas
library(janitor) #Estrutura de codificação
library(dplyr) #Funções select, filter, mutate etc.

#Organização das Tabelas

tabela_ibov <- IBOV %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% #Transforma a data da linha em coluna.
  clean_names() %>%  #Altera o nome das colunas
  select(rowname, bvsp_adjusted) %>% 
  rename("data" = rowname)

tabela_bbdc <- BBDC %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% #Transforma a data da linha em coluna.
  clean_names() %>%  #Altera o nome das colunas
  select(rowname, bbdc3_sa_adjusted) %>% 
  rename("data" = rowname)

tabela_itub <- ITUB %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% #Transforma a data da linha em coluna.
  clean_names() %>%  #Altera o nome das colunas
  select(rowname, itub3_sa_adjusted) %>% 
  rename("data" = rowname)

tabela_petr <- PETR %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% #Transforma a data da linha em coluna.
  clean_names() %>%  #Altera o nome das colunas
  select(rowname, petr3_sa_adjusted) %>% 
  rename("data" = rowname)

tabela_goau <- GOAU %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% #Transforma a data da linha em coluna.
  clean_names() %>%  #Altera o nome das colunas
  select(rowname, goau3_sa_adjusted) %>% 
  rename("data" = rowname)

tabela_cmig <- CMIG %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% #Transforma a data da linha em coluna.
  clean_names() %>%  #Altera o nome das colunas
  select(rowname, cmig3_sa_adjusted) %>% 
  rename("data" = rowname)

consolidado <- tabela_ibov %>% 
  bind_cols(tabela_bbdc[2],
            tabela_itub[2], 
            tabela_petr[2],
            tabela_goau[2],
            tabela_cmig[2])

#Outra maneira
consolidado <- tabela_ibov %>% 
  full_join(tabela_bbdc, by = c('data' = 'data')) %>% 
  full_join(tabela_itub, by = c('data' = 'data')) %>% 
  full_join(tabela_petr, by = c('data' = 'data')) %>% 
  full_join(tabela_goau, by = c('data' = 'data')) %>% 
  full_join(tabela_cmig, by = c('data' = 'data'))

Etapa 2 - Otimização de Portfólio

Nesta seção, o objeto “consolidado” será utilizado para otimização de portfólio. Em primeiro lugar, vamos transformar essa tabela em um série temporal (para tanto, será utilizada a função timeSeries do pacote com o mesmo nome). Em seguida, será utilizada a função returns do pacotes fPortfolio para cálculo dos retornos diários de cada uma das ações.

#Pacotes Necessários
library(timeSeries)
library(fPortfolio)
library(tictoc)

retornos_ts <- timeSeries(consolidado[,-1], consolidado[,1])
retornos_ts <- returns(retornos_ts)

#Cálculo do risco e retornos individuais.
retornos_acao <- basicStats(retornos_ts) %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% 
  rename("estatistica" = rowname) %>% 
  dplyr:: filter(estatistica == 'Mean' | estatistica == 'Stdev')

#Cálculo do risco e retorno do portfólio.
fronteira_eficiente <- portfolioFrontier(retornos_ts)
frontierPlot(fronteira_eficiente)

Visualização Interativa

library(plotly)
library(ggplot2)

tabela_retorno <- retornos_ts %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% 
  rename("data" = rowname) %>% 
  mutate(data = as.Date(data))

grafico <- tabela_retorno %>%
  ggplot()+
  geom_line(mapping = aes(x = data, y = bvsp_adjusted))+
  geom_point(mapping = aes(x = data, y = bvsp_adjusted))+
  theme_classic()

ggplotly(grafico)