Fellipe Gomes

4 minute read

As cryptomoedas

Quem acompanha os jornais já deve ter notado que o mercado de cryptomoedas vêm crescendo rapidamente. Grandes canais de informação já abordam o assunto. Uma breve pesquisa no Google já nos retorna notícia na globo, notícia no site da Forbes dentre muitos outros.

Além disso sua cotação já pode ser acompanhada nos maiores sites de busca do mercado financeiro.

Estamos diante de muitas novidades que vêm surgindo exponencialmente na humanidade, talvez seja interessante buscar entender e desfrutar como a programação pode nos ajudar nessa experiência relacionada a temas tão recentes.

Portanto surge a pergunta que vem a tona: como o R pode nos ajudar a cryptomoedas?

Vejamos o que o que encontramos no CRAN..

Pacote coinmarketcapr

Tem disponível no CRAN o pacote coinmarketcapr que nos permite extrair e monitorar o preço e o limite de mercado das cryptomoedas da API do coinmarketcap.com

Primeiramente precisamos instalar o pacote:

install.packages("coinmarketcapr")
library(coinmarketcapr)

Maiores ocorrências

O pacote conta com a função plot_top_5_currencies() que já apresenta de brinde um gráfico de barras com as 5 principais cryptomoedas do mercado, veja:

plot_top_5_currencies()

Detalhes do mercado

Os resultados ficam disponíveis para quem quiser interpretar. É importante notar que isso não nos da a imagem de como o mercado está dividido entre várias cryptomoedas, então vamos obter os dados completos de várias cryptomoedas:

mercado_hoje <- get_marketcap_ticker_all()
head(mercado_hoje[,1:8])

Visualmente

Após extrair os dados completos de várias cryptomoedas, vamos visualizar essa distribuição através de um treemap com os códigos:

library(treemap)
base <- na.omit(mercado_hoje[,c('id','market_cap_usd')])
base$market_cap_usd <- as.numeric(base$market_cap_usd)
base$formatted_market_cap <-  paste0(base$id,'\n','$',format(base$market_cap_usd,big.mark = ',',scientific = F, trim = T))
treemap(base, index = 'formatted_market_cap', vSize = 'market_cap_usd', title = 'Cryptocurrency Market Cap', fontsize.labels=c(12, 8), palette='RdYlGn')

Vou deixar as interpretações para os analistas de mercado, mas como um cientista de dados, muitos (muitos mesmo) insights podem ser extraídos dos dados acima e pode ser interessante analisar esse mercado

Pacote jsonlite para avaliar Bitcoins

O pacote jsonlite disponível no CRAN trás série de recursos flexíveis, robustos e de alto desempenho para trabalhar o R com JSON conjuntamente. O pacote é capaz de interagir com API da Web e isso vai ser o recurso que precisamos aqui.

Trazendo o foco para os Bitcoins, existe mais de uma maneira de se extrair os dados do mercado que possam trazer grandes insights. Vamos conferir aqui como este pacote pode ajudar nesta tarefa.

Inicialmente precisamos instalar e carregar o pacote:

#install.packages("jsonlite")
library(jsonlite)
suppressMessages(library(tidyverse)) #Para manipulação de dados

Com o pacote carregado já podemos realizar uma consulta diretamente de dentro do R com o comando safe_fromJSON().

Os preços da bitcoin são fornecidos pela API da BlinkTrad que é bem simples usar, basta pegar o json que a url do código abaixo solta.

Aproveito e dou um tapinha para deixar em forma de data.frame e com a data de consulta junto.

safe_fromJSON = safely(fromJSON, as.numneric(NA))
nova_consulta_list = safe_fromJSON("http://api.blinktrade.com/api/v1/BRL/ticker?crypto_currency=BTC")

nova_consulta = nova_consulta_list$result %>%
  as.tibble %>%
  mutate(timestamp = lubridate::now())

nova_consulta

Loop infinito para acompanhar os preço

Existe um universo de infinitas possibilidades para acompanhar estes dados, trago aqui um loop infinito (while(TRUE)) composto por um , um data.frame histórico.RData, um tempo entre uma consulta e outra (30 segundos por padrão) e a consulta propriamente dita. Veja:

#Inicializa o historico.RData
historico = nova_consulta
save(historico, file = "historico.RData")

Dando início ao loop:

  #loop infinito
  while(TRUE){
    #pega a cotacao do bitcoin brasil (BTCBRL) da API do blinktrade
    nova_consulta_list = safe_fromJSON("http://api.blinktrade.com/api/v1/BRL/ticker?crypto_currency=BTC")
  
    #verifica se a API retornou uma lista
    if("list" %in% class(nova_consulta_list$result)){
      nova_consulta = nova_consulta_list$result %>%
        as.tibble %>%
        mutate(timestamp = lubridate::now())
      #
      #
      # espaco reservado para as regras!
      #
      #
      #guarda a consulta
      historico = bind_rows(historico, nova_consulta)
      save(historico, file = "historico.RData")
    }
    #condicoes
    #Exemplo:
    #if(nova_consulta$buy > 14600 & nova_consulta$last < 14500){
    #
    #Fazer alguma coisa
    #
    #
    #}
  }

Também podemos acompanhar graficamente incluindo um gráfico dentro do loop, veja:

while(TRUE){
    #pega a cotacao do bitcoin brasil (BTCBRL) da API do blinktrade
    nova_consulta_list = safe_fromJSON("http://api.blinktrade.com/api/v1/BRL/ticker?crypto_currency=BTC")
  
    #verifica se a API retornou uma lista
    if("list" %in% class(nova_consulta_list$result)){
      nova_consulta = nova_consulta_list$result %>%
        as.tibble %>%
        mutate(timestamp = lubridate::now())
      
      #
      #
      # espaco reservado para as regras!
      #
      #
      
      #guarda a consulta
      historico = bind_rows(historico, nova_consulta)
      save(historico, file = "historico.RData")
    }
    
    #Cria um gráfico;
    
    ggplot(historico %>%
                 gather(indicador, valor, high, low, buy, sell, last))+
      geom_line(aes(x=timestamp, y=valor, color=indicador))
    
    #condicoes
    #if(nova_consulta$buy > 14600 & nova_consulta$last < 14500){
    #
    # Fazer alguma coisa
    #
    #}
    
    
  }

Este gráfico retornará algo como:

Este gráfico será atualizado em tempo real!

comments powered by Disqus