R/MyFunctions.R

Defines functions pricesClose getData myCaixa dadosBastter

Documented in dadosBastter getData myCaixa pricesClose

#---------------------------------------------------------------------------------
#' 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)
}
#----------------------------------------------------------------------------
maxlemes/MyPortfolio documentation built on Jan. 7, 2021, 11:47 p.m.