Skip to content

Instantly share code, notes, and snippets.

@vmesel
Last active January 27, 2019 00:52
Show Gist options
  • Save vmesel/b8065f7e0b454b390aa9d0179547d54a to your computer and use it in GitHub Desktop.
Save vmesel/b8065f7e0b454b390aa9d0179547d54a to your computer and use it in GitHub Desktop.
#install.packages("data.table")
#install.packages("zoo")
#install.packages("sqldf")
#install.packages("mongolite")
#library(data.table)
#library(zoo)
library(sqldf)
library(mongolite)
library(tidyr)
# Simulacao de dfs locais com os dados que a gente teoricamente precisaria
# cotacoes <- data.frame("ativo" = c("a", "b","a", "b","a", "b","a", "b","a", "b"), "data" = c("2018-01-01","2018-01-01","2018-01-02","2018-01-02","2018-01-03","2018-01-03","2018-01-04","2018-01-04","2018-01-05","2018-01-05"), "cotacoes" = c(2,4, 2.1,3.9, 2.001,3.98, 2.5,3.7, 2.6, 3.8))
#movs <- data.frame("ativo" = c("a","a","a", "b", "b", "a", "a"), "data" = c("2018-01-01","2018-01-02","2018-01-03","2018-01-02","2018-01-03","2018-01-04","2018-01-05"), "qt" = c(250, NA,200, NA,150, NA, NA), "mov"= c(250000, NA, NA, NA, -100000, NA, NA))
# Simulacao de DFs no servidor Mongo
cotacoes_con <- mongo(collection = "cotacoes", url = "mongodb://localhost/")
cotacoes <- cotacoes_con$find()
# Filtrar movimentacoes conforme cliente, ver como fazer isso na documentacao do mongolite
movs_con <- mongo(collection = "movs_clientes", url = "mongodb://localhost/")
movs <- movs_con$find()
ativos_con <- mongo(collection = "ativos", url = "mongodb://localhost/")
ativos <- ativos_con$find()
# Oneliner que completa todas as linhas do Data Frame com as missing dates e os ativos dessas missing dates
movs <- complete(movs, ativo, data)
# Remover datas de dias que não são dias de trabalho e feriados
# Remove variaveis de conexao com o Mongo evitando qualquer processamento no servidor
rm(cotacoes_con, movs_con, ativos_con)
movs <- movs %>% group_by(ativo) %>% fill(qt)
movs$qt[is.na(movs$qt)] <- 0
movs_join_cotacoes <- sqldf("select movs.*, cotacoes.cotacoes preco from movs join cotacoes on movs.data = cotacoes.data and movs.ativo = cotacoes.ativo")
movs_join_cotacoes$pl <- movs_join_cotacoes$qt * movs_join_cotacoes$preco
movs_ser_sumarizado = data.frame("pl" = movs_join_cotacoes$pl, "data" = movs_join_cotacoes$data, "mov" = movs_join_cotacoes$mov)
movs_ser_sumarizado$qt[is.na(movs_ser_sumarizado$qt)] <- 0
# movs_join_cotacoes <- ESSE DATAFRAME deve ser usado para ver quais ativos a pessoa tinha na data final desse mes e do outro mes
# Agg point right here
movs_ser_sumarizado_cotizar <- sqldf("select data, sum(pl) as pl, sum(mov) as mov from movs_ser_sumarizado group by data")
movs_ser_sumarizado_cotizar$cota <- 100
movs_ser_sumarizado_cotizar$mov[is.na(movs_ser_sumarizado_cotizar$mov)] <- 0
cotiza <- function(x){
for(i in seq_len(nrow(x))[-1]) {
x[i,]$cota <- ((x[i,]$pl - x[i,]$mov)/x[i-1,]$pl) * x[i-1,]$cota
}
x
}
df_cotizado <- cotiza(movs_ser_sumarizado_cotizar)
rm(movs_ser_sumarizado_cotizar, movs_ser_sumarizado)
# Pega ativos da ultima data disponivel
last_date <- tail(sqldf("select data from df_cotizado order by data"), n=1)[1,1]
last_date_month_before <-
ultimas_posicoes_ultimo_mes <- movs_join_cotacoes %>% filter(data == last_date)
ultimas_posicoes_penultimo_mes <- movs_join_cotacoes %>% filter(data == last_date_month_before)
detalhes_ultimas_posicoes_ultimo_mes <- sqldf("select * from ultimas_posicoes_ultimo_mes join ativos on ultimas_posicoes_ultimo_mes.ativo = ativos.ticker")
# Ver forma de pegar as ultimas posições de um mes anterior
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment