Ganhando Dinheiro com Bitcoin e Python (I) — Análise de Dados

Montar um sistema para guiar seus investimentos e testar estratégias pode ser uma excelente abordagem antes de sair comprando cripto no mercado

Arthur Oliveira
5 min readSep 17, 2021

Artigo também publicado aqui.

Recentemente, tenho pensado em alternativas de investimento para a minha carteira. Como não poderia deixar de ser, atualmente as criptomoedas devem fazer parte da carteira de qualquer investidor que se preze.

No entanto, vemos todos os dias a volatilidade extremamente elevada dessas moedas digitais, especialmente daquelas que são novas no mercado.

Assim, meu primeiro pensamento foi o de desenvolver um sistema computacional feito em Python para dar suporte às minhas decisões frente ao mercado de criptomoedas, e que talvez possa também ajudar você a fazer as suas decisões.

Hey hey hey!

O Plano

Para criar o sistema, fiz um mapa e o dividi nos seguintes passos:

  1. Baixar dados históricos do Bitcoin e explorá-los
  2. Estudar uma ferramenta de backtesting, que me permita testar as estratégias de investimento que sejam desenvolvidas
  3. Escolher estratégias de investimento para implementar na ferramenta definida no passo (2)
  4. Testar todas as estratégias com uma estratégia baseline, ou seja, com um padrão, que no caso será o Buy&Hold (comprar e segurar uma ação)
  5. Utilizar indicadores da análise técnica para incrementar as estratégias
  6. Utilizar algoritmos de Machine Learning (Aprendizado de Máquina) para sugerir os momentos de compra e venda de uma ação
  7. Criar um aplicativo para usuários leigos integrando todos os passos anteriores
O mapa do tesouro

É importante lembrar que vamos percorrer um caminho tortuoso até a aplicação final e, portanto, muitas vezes poderemos ter que dar alguns passos atrás no plano inicial. Se houver qualquer mudança, irei editar esse post inicial para que o restante do trabalho fique coerente.

Começando

Para não ficar restrito a apenas apresentar o plano, neste artigo irei também começar pelo primeiro passo do plano, ou seja, baixar dados históricos do Bitcoin e explorá-los. Não será o meu intuito aqui explorar todas as alternativas com esses dados logo de início, mas apenas procurar entendê-los melhor.

Esse é um trabalho que sempre poderá ser refeito, de acordo com a necessidade e com os problemas que formos encontrando ao longo do desenvolvimento.

Hora de começar a codificar.

Baixando a base de dados

Primeiramente, precisamos baixar os dados históricos do Bitcoin. Esse é um passo muito importante, visto que essa base de dados irá ser utilizada durante todo o desenvolvimento do projeto.

Uma fonte interessante que encontrei [1], foi utilizada como referência para o código de download dos dados, apresentado a seguir.

O código foi modificado em relação à referência original, pois precisava de algo que se adaptasse às minhas necessidades, deixando-o um pouco mais “enxuto”. Nele, o ponto mais interessante é o acesso à URL que me permite acessar os dados históricos de 2000 dias do Bitcoin (parâmetro que pode ser alterado de acordo com a necessidade).
O resultado chega por meio de um JSON, que então é convertido para um Dataframe para que possamos trabalhar explorando os dados.

Por fim, os dados são salvos em um arquivo CSV que poderá ser utilizado em qualquer momento posterior deste trabalho.

Vamos ao código.

import pandas as pd
import matplotlib.pyplot as plt
import requests
from datetime import datetime
import numpy as np
def get_hist_data(from_sym='BTC', to_sym='USD', timeframe = 'day', limit=2000, aggregation=1): url = 'https://min-api.cryptocompare.com/data/v2/histo'
url += timeframe
parameters = {'fsym': from_sym, 'tsym': to_sym, 'limit': limit, 'aggregate': aggregation}
print('baseurl: ', url)
print('timeframe: ', timeframe)
print('parameters: ', parameters)
response = requests.get(url, params=parameters)
data = response.json()['Data']['Data']
return data
def get_btc_data():
cryptocurrency = 'BTC'
target_currency = 'USD'
data = get_hist_data(cryptocurrency, target_currency, 'day', 2000)
df = pd.DataFrame.from_dict(data)
df.to_csv('btc_prices.csv', index=False)
print(len(df),'items')
return
get_btc_data()

Uma vez que os dados foram baixados, vamos abrir o arquivo e explorá-los, para saber onde estamos pisando.

Vou começar excluindo algumas colunas desnecessárias e criando um índice baseado na data (dia) do registro do valor do bitcoin. Por fim, exibimos os primeiros elementos carregados do nosso arquivo CSV usando head.

Lembrando que, nesse caso, estamos lidando com o valor diário do BTC e seu valor é apresentado em dólar.

df = pd.read_csv('btc_prices.csv')
df['Date'] = pd.to_datetime(df['time'], unit='s')
df.set_index('Date', inplace=True)
df = df.drop(['time', 'conversionType', 'conversionSymbol'], axis = 1)
df.head()
Saída dos dados carregados: maior e menor valor diário, preços de abertura e fechamento, volumes de abertura e fechamento.

Vamos descrever estatisticamente os dados:

df.describe()
Estatísticas para nerds

Exibindo gráficos de velas (candlesticks). Nesse momento, é importante visualizarmos o comportamento do preço do bitcoin ao longo dos anos. Juntamente com essa etapa de visualização (feita por meio da biblioteca mplfinance), vou utilizar dois indicadores técnicos bem conhecidos e capazes de indicarem tendências, as médias móveis de 9 e 20 dias — não se preocupe muito em compreender como elas funcionam, voltarei nesse ponto adiante em um próximo post.

Nesse código, primeiramente calculo as médias móveis e depois as adiciono ao gráfico de velas para verificarmos as tendências e oscilações do preço do BTC.

import mplfinance as mpfdf['MA_Close_low'] = df['close'].rolling(window=9).mean()df['MA_Close_high'] = df['close'].rolling(window=20).mean()mavdf = pd.DataFrame(dict(OpMav10=df['MA_Close_low'],OpMav20=df['MA_Close_high']),index=df.index)ap = mpf.make_addplot(mavdf[:100],type='line')mpf.plot(df[:100], type='candle', figscale=0.8, volume=False, ylabel='BTC (USD)',addplot=ap)
Porque diabos não comprei antes?

Note o cruzamento entre as duas médias e como eles indicam mudanças de tendência no médio e longo prazo.

Ainda, vamos fazer um estudo de correlação entre cada par de variáveis.

df.corr(method='pearson').style.background_gradient(cmap='coolwarm')
Vermelho indica correlação direta e azul correlação inversa.

Exibindo os gráficos de todas as variáveis ao longo do tempo.

df.plot(subplots=True)

Para finalizar, vamos completar mostrando os gráficos para cada par de variáveis em nossos dados.

pd.plotting.scatter_matrix(df, alpha=0.2, figsize=(20,10))

Finalizando

Nesse post que marca o início de uma série sobre a criação de um sistema para investir em Bitcoins, mostramos o plano inicial que será seguido durante os próximos artigos. Para isso, começamos baixando os dados, armazenando-os em um arquivo CSV e explorando-os de diferentes modos.

Vou deixar a interpretação de cada um desses comandos para os posts seguintes, quando naturalmente iremos retomá-los para verificar o que está acontecendo em nossas estratégias de investimento. No entanto, foi apresentado um ferramental que pode ser útil em qualquer análise exploratória de dados.

No próximo post, iremos explorar um pouco mais sobre o nosso sistema.

Abraços e até logo!

Referência

[1] https://tcoil.info/how-to-get-price-data-for-bitcoin-and-cryptocurrencies-with-python-json-restful-api/

--

--

Arthur Oliveira

Professor da área de computação. Doutor pela UNICAMP. Graduado em Ciências da Computação e mestre pela USP.