Trading de criptomoedas com análise técnica

O ano de 2017 foi o “rali” das criptomoedas. A capitalização de mercado de todas as moedas criptografadas passou de 17.000 milhões de dólares para mais de 760.000 milhões em apenas um ano. A Bitcoin foi avaliado em 963,74 dólares no início de 2017, mas disparou e chegou a cotar perto de 20.000 dólares para fechar o ano em 13.685.

Embora inicialmente fosse delineado como uma “reserva estável de valor” semelhante ao ouro, além do alcance das políticas dos governos, a ausência de fundamentos e as expectativas contrastadas dos diferentes agentes do mercado fizeram com que a Bitcoin fosse no momento um dos ativos mais especulativos do mundo.

Dada esta situação, a questão é: podemos usar os recursos da análise técnica e do comércio de tendências para otimizar nossos investimentos em criptomoedas? O objetivo deste artigo é mostrar, usando um ambiente tão realista quanto possível, como um sistema de negociação muito simples baseado em indicadores de análise técnica pode superar um investimento passivo em Bitcoin.

Todo o código e outros recursos deste artigo estão disponíveis em: https://github.com/isaacdlp/bitcoin

Preparação do sistema

Para o nosso backtesting, usaremos a plataforma backtrader, que é gratuita e de código aberto, que, uma vez que nos sentimos confortáveis ​​com esse ambiente, nos permitirá modificá-lo, estendê-lo e adaptá-lo às nossas necessidades de teste. Além disso, como o backtrader é escrito na linguagem de programação Python, muito popular entre as comunidades de especialistas na análise, teremos outras bibliotecas para realizar ciência de dados avançada e até mesmo adicionar inteligência artificial aos nossos sistemas com relativamente pouco esforço. Pode obter o backtrader a partir do site https://www.backtrader.com, onde também pode encontrar totalmente documentado o processo de instalação e os primeiros testes.

O próximo passo será encontrar informações sobre preços, já que nossos resultados serão tão bons quanto a qualidade dos dados que os suportam. Felizmente não temos que gastar grandes somas de dinheiro para obter essas fontes. Sem ir mais longe, o site Bitcoincharts oferece todos os dados históricos de negociação Bitcoin para download gratuito. Basta ir ao link http://api.bitcoincharts.com/v1/csv e selecionar o arquivo correspondente ao mercado que deseja usar.

Para este teste, decidi focar no popular mercado de Kraken por sua longa história (a jornada deste serviço remonta a 2014). Vamos proceder ao download do arquivo krakenUSD.csv, o que nos levará um tempo, pois ocupa quase 500 MB, não em vão contém todas as negociações individuais da Bitcoin desde o início do serviço. Se abrirmos o arquivo, veremos que é uma série de linhas com a seguinte aparência:

1389118697,874,670400000000,0,010690590000

1389118703,883.326140000000,0.010638230000

1389118711,892.067530000000,0.010586140000

Cada linha corresponde a um tick ou transação e contém três valores separados por vírgulas, que da direita para a esquerda significam 1) a data da negociação, no formato UNIX expressa em milissegundos (por exemplo 1389118697 corresponde a 7 de janeiro de 2014), ao preço expresso em dólares americanos (874,670400000000 USD) e, finalmente, para o volume trocado (0,010690590000 Bitcoins ou, o que é o mesmo, 1,069,059 Satoshis).

A parte positiva é que o arquivo é ordenado em ordem cronológica crescente, isto é, das transações mais antigas para as mais recentes à medida que descemos pelo documento, que é a ordem com a qual o backtrader pode trabalhar. A parte negativa é que o backtrader não consegue entender as datas em milissegundos e também espera um formato de linha com os seguintes campos:

Date, Open, High, Low, Close, Volume

Se há algo que caracteriza o backtrader é a sua flexibilidade, então com algumas linhas de programação podemos adaptar o carregador de dados padrão, chamado GenericCSVData, para adaptar-se a essa situação sem ter que reescrever os arquivos originais. pode encontrar essa adaptação na classe BitcoinFeed do arquivo Resample.py. No entanto, fazer um teste de volta ao carrapato pode não ser adequado por duas razões, uma prática e outra teórica. A prática se deve ao volume de informações que manipulamos, o que nos atrasará excessivamente no mecanismo de testes. Os recursos necessários para processar os dados converterão uma rotina de minutos numa espera de horas, e isso terá impacto em nossa capacidade de experimentação.

O teórico é que, se analisarmos com base em ticks, estaremos assumindo que, quando encontrarmos um sistema viável e quisermos operá-lo, teremos a mesma resolução de dados quando nos conectarmos ao mercado em tempo real, e isso é muito para supor: mais comum é que nem nós temos tal granularidade nem somos capazes de agir para capturar o próximo tick.

Portanto, será muito melhor convertermos as informações de escala num formato de vela tradicional, com os preços Open, High, Low, Close, que resumem a atividade num determinado intervalo de tempo, bem como um volume agregado. Essa operação é conhecida como reamostragem (ou, para ser exato, upsampling à medida que avançamos da granularidade temporal maior para a inferior) e o backtrader possui os seus próprios recursos para manipular a tarefa sem nenhum problema, basta carregar os dados usando a função resampledata em vez de adddata e forneça alguns parâmetros adicionais sobre como queremos que o processo seja feito.

De nossa parte, como estaremos executando iterativamente uma série de backtests nos mesmos dados, preferimos salvar os dados resumidos no disco antecipadamente para acelerar significativamente o trabalho; essa é a função do nosso arquivo Resample.py. Para nosso artigo nós escolhemos uma resolução de 15 minutos – um tempo razoável para operar, além do fato de que muitas fontes de informação estão atrasadas 15 minutos em sua versão de acesso livre – obtendo mas se quiser pode modificar a propriedade mins por outro valor em minutos para obter uma granularidade diferente.

O arquivo resultante, krakenUSD_15m.csv, além de ser muito mais compacto e manejável (6 MB em vez de 500) e tem uma forma directamente legível backtrader – exceto que irá preencher em contratos em aberto com valores nulos, porque nós não têm da referida informação.

Date,Open,High,Low,Close,Volume

2014-01-07 18: 30: 00,883.32614,892.06753,874.48165,
874.48165,0.04276811

2014-01-07 19: 15: 00,866.10944,866.10944,860.0,860,0,0.17440196000000002

2014-01-07 19: 30: 00,870.0,870,0,830.00001,835.02002,6.227191829999995

 

Benchmark: Cenário Base

Importante, para manter todos os nossos testes ceteris paribus sempre vai operar uma conta de apenas 1.000 euros, entrar ou sair do mercado praticamente toda a conta de capital disponível (menos uma margem de segurança de 5%). Para trazer nosso ambiente possível para as condições reais do mercado, aplicar uma comissão de 0,3% as entradas e as saídas, e terá em conta o volume do bar atual, assumindo que, devido à presença de outros operadores , só podemos apontar para 25% do volume de cada barra para preencher nossos pedidos.

Também incluiremos no nosso sistema uma pequena alavancagem de 2. Essa alavancagem não é fundamental para o sistema operar, mas nos permite extrair uma vantagem de rentabilidade nos momentos de aumento livre – embora, por outro lado, torne mais perigosos os momentos de queda livre, já que o efeito multiplicador de alavancagem opera tanto para perdas quanto para ganhos. É claro que essa alavancagem não significa que nosso corretor nos permita operar com contas alavancadas ou comprar com margem, pode ser tão simples quanto pedir emprestado outros 10.000 euros do nosso tio rico com o acordo para devolver o capital inicial ao final do período de investimento. .

Finalmente, para avaliar se o nosso sistema é bom ou não, devemos sempre compará-lo com um cenário base ou benchmark. Já que no final queremos avaliar se nossa ação sobre criptomoeda produz um resultado positivo, o mais sensato será compará-lo com … não agir. Ou seja, uma estratégia passiva que consiste simplesmente em comprar e manter o valor durante o período de investimento, que é conhecido como Buy & Hold ou, no jargão da criptografia, HODL (termo que aparece quando um usuário bêbado publica a errata num post do Fórum Bitcoin de dezembro de 2013 – “I AM HODLING” – por tanta alegria do resto da comunidade que, aparentemente, fez história). Nosso cenário base está no arquivo BitcoinBenchmark.py. Após a execução, obteremos os resultados do Gráfico 1:

Valor final 13.587.4801

Sistema em tendência

Nosso sistema de tendências está no arquivo BitcoinAlgo.py. Para sua criação, usaremos indicadores muito simples de análise técnica e bastante conservadores, uma série de cruzamentos de médias móveis.

Para entrar numa posição, vamos esperar até que haja um cruzamento para cima entre duas médias móveis – uma lenta e outra rápida – sobre o preço de encerramento. Por outro lado, deixaremos a posição quando houver um cruzamento descendente entre as duas médias móveis. Em ambos os cenários, também pediremos que o movimento nos preços seja acompanhado por um aumento no montante sob negociação para confirmar a tendência – neste caso, representada por uma média móvel no volume de mercado.

Depois de executar nosso sistema de tendências, obteremos os resultados do gráfico 2:

Valor final 227.820.2741

Diante de um retorno de 1.200% com o cenário base, nosso sistema simples oferece um retorno de mais de 22.000%. Não é mau para começar.

Por Períodos

Antes de terminar, vamos realizar outro teste bastante simples para verificar se as melhorias de nosso sistema ocorrem apenas num ambiente de mercado específico ou se, ao contrário, elas são mantidas ao longo de perfis de mercado marcadamente díspares.

Para este propósito, executaremos nossos testes por três períodos diferentes:

  • O mercado essencialmente lateral desde o início de 2014 até o início de 2017.
  • O mercado altista claramente de 2017.
  • O mercado em quedas desde o início de 2018.

O Backtrader torna essa tarefa muito fácil, permitindo-nos delimitar o intervalo de aplicabilidade de nossa análise nos parâmetros de carga do feed, usando as propriedades fromdate e todate:

dados = BitcoinFeed (

name = “BTC”,

dataname = “krakenUSD_15m.csv”,

timeframe = bt.TimeFrame.Minutes,

fromdate = dt.datetime (2017, 1, 1)

todote = dt.datetime (2018, 1, 1),

valor nulo = 0,0)

Se executarmos as análises relevantes, obteremos os seguintes resultados, onde verificamos que o sistema supera o benchmark em todos os ambientes de mercado:

  • O mercado essencialmente lateral desde o início de 2014 até o início de 2017.
    • Benchmark: 1,195.2990
    •  Sistema: 5.249,9300
  • O mercado altista claramente de 2017.
    • Benchmark: 27,428.6104
    • Sistema: 34,798.3657
  • O mercado em quedas desde o início de 2018.
    • Benchmark: -41.2294
    • Sistema: 680,4281

Sobre o autor

Henrique Garcia
Analista de Mercados