Last active
January 27, 2019 00:52
-
-
Save vmesel/b8065f7e0b454b390aa9d0179547d54a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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