#---------------------------------------------------------------------------------
#' Coletar os dados das planilhas geradas pelo site [www.bastter.com](www.bastter.com)
#'
#' @description
#' `dadosBastter` coleta os dados das planilhas geradas no site do Bastter retornando
#' um dataframe com as transações realizadas ou o fluxo de caixa dos proventos recebidos.
#'
#' @details
#' Esta função recebe uma string com uma das opções: Transações ou Proventos.
#'
#' @param tipo String com o tipo de dado desejado.
#'
#' @return Um dataframe com as transações (se tipo = "Transações") ou
#' com o fluxo de caixa dos proventos (se 'tipo = "Proventos")
#'
#' @example
#' dadosBastter("Proventos")
#'
#' @export
dadosBastter <- function(tipo){
`%>%` <- magrittr::`%>%`
if (tipo == "Transações"){
#Lendo o arquivo do tipo Ação
df <- readr::read_csv("data-raw/Transacoes2020.csv",
locale = readr::locale(decimal_mark = ",",
date_format = "%d/%m/%Y"))
colnames(df) <- c("classe", "ticker", "data", "tipo", "quantidade", "valor")
# criando os ticker para a consulta no Yahoo e a variável dos preços
df$yahoo <- paste0(df$ticker,".SA")
df$preco <- round(df$valor/df$quantidade, 2)
# Editando a tabela trocando algumas strings
df$classe <- gsub("Ação", "Ações", df$classe)
df$classe <- gsub("FII", "FIIs", df$classe)
df <- df %>%
dplyr::filter(classe != "Renda Fixa") %>%
dplyr::select(data, classe, ticker, yahoo, tipo, quantidade, preco, valor)
}
if (tipo == "Proventos"){
#' Lendo o arquivo com os proventos de Ações
df1 <- readr::read_csv("data-raw/ProventosAcoes.csv",
locale = readr::locale(decimal_mark = ",",
date_format = "%d/%m/%Y"))
df1 <- df1[,c(1:4,6:(ncol(df1)-1))]
colnames(df1) <- c("ativo", "quantidade", "tipo", "valor/ativo", "valor", "data-ex",
"data")
df1$classe <- "Ações"
df1$data <- gsub("-", NA, df1$data)
df1$data <- as.Date(df1$data, format = "%d/%m/%Y")
#' Lendo o arquivo com os proventos de FIIs
df2 <- readr::read_csv("data-raw/ProventosFIIs.csv",
locale = readr::locale(decimal_mark = ",",
date_format = "%d/%m/%Y"))
colnames(df2) <- c("ativo", "quantidade", "tipo", "valor/ativo", "valor", "data-ex",
"data")
df2$classe <- "FIIs"
df <- rbind(df1, df2)
df <- df %>%
tidyr::drop_na(data)%>% # Eliminado proventos provisionados não pagos
dplyr::mutate(valor = -valor)%>% #trocando o sinal
dplyr::select(data, `data-ex`, classe, ativo, tipo, quantidade, `valor/ativo`, valor)%>%
dplyr::arrange(desc(data))
}
return(df)
}
#---------------------------------------------------------------------------------
#' Organiza o Fluxo de Caixa do Portfólio
#'
#' @description
#' `myCaixa` coleta os dados das transações realizadas ou dos proventos recebidos e
#' organiza o fluxo de caixa.
#'
#' @details
#' Transações ou Proventos.
#'
#' @param df dataframe com as transações ou proventos.
#'
#' @return Uma série temporal (xts) com o fluxo de caixa das transações ou proventos
#'
#' @example
#' myCaixa(transacoes)
#'
#' @export
myCaixa <- function(df){
`%>%` <- magrittr::`%>%`
df <- df %>% dplyr::select(data, valor)
# Eliminado proventos provisionados não pagos
df <- df[!is.na(df$data),]
# Somando os valores por data
df <- aggregate(df$valor, by=list(data=df$data), FUN=sum)%>%
dplyr::rename(valor = x)
# Separando aportes de resgates
df <- df %>%
dplyr::mutate(resgates = valor)%>%
dplyr::rename(aportes = valor)
df$aportes[df$aportes < 0] <- 0
df$resgates[df$resgates > 0] <- 0
# Transformando o data frame (df) numa série temporal (xts)
df <- df %>%
xts::as.xts(., order.by = as.Date(df$data))
df$data<-NULL
return(df)
}
#---------------------------------------------------------------------------------
#' Baixa o histórico de preços no site do Yahoo
#'
#' @description
#' `getData` Esta Função recebe uma lista de simbolos e uma data inicial e
# retorna um arquivo yahooData com os preços baixados
#'
#' @details
#' ....
#'
#' @param symbols Lista com os tickers dos ativos.
#' @param data_ini Data inicial da busca
#'
#' @return Um dataframe com os preçs dos ativos baixados no site do Yahoo
#'
#' @example
#' getData(symbols, data_ini)
#'
#' @export
getData<- function(symbols, data_ini){
yahooData <- new.env()
quantmod::getSymbols(
symbols,
src = "yahoo",
from = data_ini,
to = lubridate::today(),
env = yahooData)
save(yahooData, file = "data/yahooData.Rdata")
return(yahooData)
}
#---------------------------------------------------------------------------------
#' Separa os preços de fechamento
#'
#' @description
#' `pricesClose` Separa os preços de fechamento dos tickers
#'
#' @details
#' ....
#'
#' @param symbols tickers dos ativos desejados
#' @param yahooData enviroment com os preços dos ativos
#'
#' @return um xts com os preços de fechamento dos ativos desejados
#'
#' @example
#' pricesClose(symbols, yahooData)
#'
#' @export
pricesClose <- function(symbols, yahooData){
# Esta função recebe uma lista de tickers e um enviroment com as
# cotações dos ativos e
# retorna um xts apenas com os preços de abertura
for(symbol in symbols) {
#-------------------- Filtrando apenas os Preços de Abertura ------------
x <- get(symbol, pos = yahooData)
x <- x[, 4] #drops all columns except Close which is 4th column
colnames(x) <- gsub(".SA.Close", "", colnames(x))
assign(symbol, x, pos = yahooData)
}
x <- do.call(merge, lapply(symbols, get, pos = yahooData))%>%
replace(., is.na(.), 0)
return(x)
}
#-----------------------------------------------------------------------------------
#' Calcula o valor das cotas
#'
#' @description
#' `caixa` Esta função recebe um xts com valor do portfolio e os aportes/retiradas
# e devolve o xts com o calculo das cotas
#'
#' @details
#' ....
#'
#' @param df dataframe com o fluxo de caixa
#'
#' @return um xts com o cálculo da cota
#'
#' @example
#' cota(fluxo)
#'
#' @export
cota <- function(df){
`%>%` <- magrittr::`%>%`
symbols <- c("var", "varPerc", "cota", "patrimonio", "varRet")
df <- df[df$total != 0,]
zeros <- xts::xts(matrix(0,nrow(df),length(symbols)),
zoo::index(df), dimnames=list(NULL,symbols))
df <- merge(df, zeros)
df$var <- 0
df$varPerc <- 0
df$cota <- 1
df$patrimonio <- 1
df$varRet <- 1
for (i in 2:nrow(df)){
j=i-1
df[i,5] <- round(zoo::coredata(df[i,1]) - (zoo::coredata(df[j,1])+zoo::coredata(df[i,2])+zoo::coredata(df[i,3])+
zoo::coredata(df[i,4])), 4)
df[i,6] <- round(zoo::coredata(df[i,5])/(zoo::coredata(df[j,1])+zoo::coredata(df[i,2])), 4)
df[i,7] <- zoo::coredata(df[j,7])*(1 + zoo::coredata(df[i,6]))
df[i,8] <- round((zoo::coredata(df[i,1])/zoo::coredata(df[1,1])), 4)
df[i,9] <- round(1 + zoo::coredata(df[i,6]), 4)
}
return(df)
}
#---------------------------------------------------------------------------------
#' Baixa as tabelas de uma determinada página da web
#'
#' @description
#' `caixa` Esta função recebe um endereço de web e baixa as tabelas deste endereço
#'
#' @details
#' ....
#'
#' @param url endereço que se deseja baixar as tabelas
#'
#' @return um enviroment com todas as tabelas do site
#'
#' @example
#' tableWeb(http://bastter.com.br)
#'
#' @export
tableWeb <- function(url){
webpage <- readLines(url)
html <- XML::htmlTreeParse(webpage, useInternalNodes = TRUE, asText = TRUE)
tableNodes <- XML::getNodeSet(html, "//table")
return(tableNodes)
}
#---------------------------------------------------------------------------------
#' Organiza o fluxo de caixa em xts
#'
#' @description
#' `caixa` Esta função recebe um data frame com datas, e uma coluna de valores
# (entradas e saídas) do caixa e organiza os dados num xts
#'
#' @details
#' ....
#'
#' @param df dataframe com o fluxo de caixa
#'
#' @return um xts com o fluxo de caixa
#'
#' @example
#' caixa(myCaixa)
#'
#' @export
caixa <- function(df){
df <- df%>%
dplyr::select(data, valor)
# Eliminado proventos provisionados não pagos
df <- df[!is.na(df$data),]
# Somando os valores por data
df <- aggregate(df$valor, by=list(data=df$data), FUN=sum)%>%
dplyr::rename(valor = x)
# Separando aportes de resgates
df <- df %>%
dplyr::mutate(resgates = valor)%>%
dplyr::rename(aportes = valor)
df$aportes[df$aportes < 0] <- 0
df$resgates[df$resgates > 0] <- 0
#---------------------------------
# Transformando o data frame (df) numa série temporal (xts)
df <- df %>%
xts::xts(., order.by = as.Date(df$data))
df$data<-NULL
return(df)
}
#-----------------------------------------------------------------------------------
#' Atualiza os preços de acordo com os eventos de cada empresa (Bonificações, Desdobramentos, etc)
#'
#' @description
#' `myBoni` Recebe um dataframe com os preços dos ativos e outro com o calendário de eventos
#'
#' @details
#' ....
#'
#' @param dfp dataframe com os preços dos ativos.
#' @param dfe dataframe com o calendário de eventos
#'
#' @return Um dataframe com os preçs dos ativos atualizados
#'
#' @example
#' myBoni(myAssests, myEventos)
#'
#' @export
myBoni <- function(dfp, dfe){
for (i in 1:nrow(dfe)){
dfp[,dfe[i,5]][zoo::index(dfp)<dfe[i,3], ] <- dfp[,dfe[i,5]][zoo::index(dfp)<dfe[i,3], ]*dfe[i,4]
}
return(dfp)
}
#----------------------------------------------------------------------------
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.