Este relatório tem como objetivo organizar o estudo de otimização de portfólio.
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'))
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)
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)