No dia 28/01/2020 eu tive a experiencia incrível de passar um pouco do meu conhecimento sobre Shiny no R-Ladies Rio. Assim, vou fazer um passo a passo de toda a construção do aplicativo que pode ser acessado pelo link: https://llvia-rodrigues.shinyapps.io/shiny_app/, desta forma vou abordar da construção da base de dados até o aplicativo publicado em um série de postagens. Primeiro, precisamos da base, então o primeiro passo será construir essa base baixando os dados dos fundos diretamente do site da CVM (Comissão de Valores Mobiliários). A primeira publicação da série será: BAIXANDO OS DADOS DA CVM.
Para começa vamos chamar os meus, os seus, os nossos pacotes favoritos. Os pacotes para manipulação da base de dados que eu SEMPRE uso são: tidyverse e magrittr; para fazer gráfico bonitinhos eu uso o ggplot2 e o plotly Shiny. Vou mostrar a base de dados através do pacote DT e por fim para trabalhar com datas uso o lubridate e o bizdays.
#pacote de manipulacao da base de dados -- meu top1
library(tidyverse)
package 㤼㸱tidyverse㤼㸲 was built under R version 3.6.1package 㤼㸱dplyr㤼㸲 was built under R version 3.6.1
#tabela html
library(DT)
#pacote para gráficos
library(ggplot2)
#pacote de manipulacao da base de dados
library(magrittr)
#pacote para gráficos html
library(plotly)
#pacote para datas
library(lubridate)
#pacote para dias uteis que tem o calendario Anbima cadastrado
library(bizdays)
No site da CVM podemos capturar informações cadastrais de todos os fundos, como classe, nome, CNPJ, CNPJ do gestor, entre outras. A chave para linkar a cota é o CNPJ do fundo, então não podemos remover essa coluna. O arquivo será acessado via função read.csv2, com o caminho apresentado no código e o formato de data “AnoMêsDia” (YYYMMDD).
Agora iremos capturar os dados de mercado, como valor de cota, patrimônio liquido, número de cotistas, resgate (normalmente situado em d-2), de todos os fundos disponibilizados. Um ponto importante é que o caminho será sempre no formato “AnoMês” (YYMM). Se você quiser pegar apenas do mês corrente, leia apenas o mês atual, como o código abaixo.
datatable( head(fund,2) ,selection = "single",escape = F
,rownames = T
, extensions = 'Buttons'
, options = list(
orientation ='landscape',
dom = "Blfrtip", scrollX = T,
searching = F,
paging = F
) # end of options
)
It seems your data is too big for client-side DataTables. You may consider server-side processing: https://rstudio.github.io/DT/server.htmlIt seems your data is too big for client-side DataTables. You may consider server-side processing: https://rstudio.github.io/DT/server.html
Como eu quero criar uma série de retornos, vou montar uma base de dados que vai andar mês a mês.Como a base de dados é enorme, vou filtrar apenas os fundos que tenho na minha carteira, seja ela fictícia ou real.Esse processo de construção da base de dados é demorado e para isso preciso do CNPJ do fundo para filtrar e chavear com os dados cadastrais. Meus fundos: Alaska Black (26.673.556/0001-32), Trend Ibovespa (31.204.199/0001-01), Western (19.831.126/0001-36), AZ Quest (07.279.657/0001-89) e Trend Inflação (31.145.833/0001-74).
#ultimo dia do mes
ultimo_dia_mes <- data_atual - months(0:11)-ddays(day(data_atual))
#base de dados vazia
df_fundos <- tibble()
#cnpj meus fundos
meus_fundos <- c("26.673.556/0001-32","31.204.199/0001-01","19.831.126/0001-36",
"07.279.657/0001-89","31.145.833/0001-74")
data_atual <- today()-2
for(i in 1:length(ultimo_dia_mes)){
ano <- year(ultimo_dia_mes[i])
mes <- month(ultimo_dia_mes[i])
dia <- day(ultimo_dia_mes[i])
if (nchar(mes)==1){
mes <- paste0("0",mes)
}
if (nchar(dia)==1){
dia <- paste0("0",dia)
}
caminho <- paste0("http://dados.cvm.gov.br/dados/FI/DOC/INF_DIARIO/DADOS/inf_diario_fi_", ano, mes, ".csv")
fund <- read.csv2(caminho)
ref_fundos <- as_tibble(fund) %>%
dplyr::filter(CNPJ_FUNDO%in% meus_fundos)
df_fundos <- rbind(df_fundos,ref_fundos)
}
Agora que já montei uma base de dados que começa no dia 2019-04-01 e termina em 2020-03-31, vamos formatar a base e fazer o join com os dados cadastrais dos meus fundos.
tt_fundos <- df_fundos %>% left_join( fund_names,by = "CNPJ_FUNDO")
Column `CNPJ_FUNDO` joining character vector and factor, coercing into character vector
tt_fundos <- as_tibble(tt_fundos)
tt_fundos$DENOM_SOCIAL %<>% substr(1,10) %<>% as.factor()
tt_fundos$DT_COMPTC %<>% as.Date()
tt_fundos$VL_QUOTA %<>% as.numeric()
datatable( tt_fundos ,selection = "single",escape = F
,rownames = F
, options = list(
orientation ='landscape',
dom = "Blfrtip", scrollX = T,
searching = T,
paging = T
) # end of options
)
It seems your data is too big for client-side DataTables. You may consider server-side processing: https://rstudio.github.io/DT/server.htmlIt seems your data is too big for client-side DataTables. You may consider server-side processing: https://rstudio.github.io/DT/server.html
Para fechar este post, vamos fazer um gráfico porque sempre traz credibilidade e nos ajuda a entender o comportamento dos nossos fundos. Assim, vamos ver a evolução da cota do fundo Alaska Black (bom que eu lembro o ferro que estou tomando).Na próxima publicação, vou mostrar um passo a passo dos gráficos que criei no aplicativo, assim iremos calcular o retorno através das cotas.
graficos <- tt_fundos %>% filter(CNPJ_FUNDO=="26.673.556/0001-32")
fundo <- as.character(unique(graficos$DENOM_SOCIAL))
p <- ggplot2::ggplot(graficos) +
geom_line(aes(DT_COMPTC,VL_QUOTA),color='blue') +
labs(x = 'Data', y= 'cota',title= paste0('Evolução de Cota ',fundo[1]),subtitle = fundo[1])