Prevendo o fechamento do bitcoin com deep learning (LSTM)

Luis Guilherme Ribeiro
7 min readJan 12, 2022

O Bitcoin é uma criptomoeda que possui alta variabilidade e tem crescido muito nos últimos anos. Isso faz com que aumente o interesse de investidores, tanto para fazer day trade quanto para swing trade.

Na área de trade existem diversos métodos auxiliam para uma decisão de compra ou venda. Quando a previsão do fechamento tem alta acurácia, pode ser uma importante variável para à tomada de decisão.

Portanto, neste artigo vamos abordar um modelo de deep learning conhecido como Long Short Time Model (LSTM) para prever o fechamento diário da criptomoeda BTC-USD.

BTC-USD

Variáveis

No mercado de ações as variáveis comuns são: abertura, fechamento, alta, baixa e volume. Ao se aprofundar mais existem uma diversidade de variáveis que podemos considerar como por exemplo as médias móveis, Volume Weighted Average Price (VWAP), Índice de força relativa (IFR), etc.

Como o foco deste artigo é aplicar uma técnica de deep learning, vamos abordar as variáveis básicas e testar o desempenho do modelo multivariado, tendo como alvo o fechamento.

Long and Short Term Memory (LSTM)

O LSTM, ou memória de longo prazo é uma arquitetura de rede neural recorrente (RNN) usada no campo do aprendizado profundo. Sua principal vantagem é a compreensão de relações não lineares complexas que podem nos ajudar a tomar decisões mais inteligentes.

Arquitetura

Em um alto nível, o LSTM consiste em três partes, conforme mostrado na imagem abaixo. A primeira parte escolhe se as informações devem ser lembradas ou são irrelevantes e podem ser esquecidas. Na segunda parte, a célula tenta aprender novas informações da entrada para esta célula. Por fim, na terceira parte, a célula passa as informações atualizadas do timestamp atual para o próximo.

Essas três partes de uma célula LSTM são conhecidas como portas. A primeira parte é chamada de porta de esquecimento (Forget Gate), a segunda parte é conhecida como porta de entrada (Input Gate) e a última é a porta de saída (Output Gate). Conforme mostrado na figura, temos o estado da célula C e o estado oculto H, que representam informações de longo e curto prazo, respectivamente. O t e t-1 representam a linha temporal da informação atual e passada.

Essas células estão contidas dentro de diferentes camadas (layers) e ai é onde a mágica começa acontecer. Ao criar um modelo LSTM, deve ser configurado o número de camadas e quantas células (units) cada uma delas vai ter. Além disso, temos o timestep, que indica o comprimento de passos temporais que o modelo vai usar para aprender.

Codificando o modelo

Para implementar um modelo LSTM em Python é necessário utilizar a biblioteca do keras. No código abaixo temos uma função que constrói e treina o modelo.

Para treinar um modelo LSTM os dados devem estar transformados em séries sequenciais, por isso chamamos a função “to_sequential_data” passando como parâmetros os dados e o timesteps, que é responsável por configurar o período de aprendizagem a curto e longo prazo.

Na linha 9 temos a primeira camada, também conhecida como camada de entrada, note que o número de unidades desta camada é referente ao número de variáveis utilizadas no modelo. Em seguida, da linha 10 até à12 temos o laço que constrói as camadas conforme os valores do parâmetrohidden layers” (hl). Além disso, para cada camada aplicamos a função de Dropout(0.2) a fim de reduzir o overfitting. E por fim, utilizamos a função ReLu para ativação dos neurônios e o otimização de Adam.

Com relação aos demais parâmetros (lr, batch e epochs) são referentes a taxa de aprendizagem (lr), o tamanho do lote (batch) e o número de épocas (epochs) que a rede vai utilizar para construir e treinar o modelo. Na imagem abaixo é mostrado os valores de cada parâmetro obtidos empiricamente.

Parâmetros

Experimento

Para avaliar nosso modelo vamos coletar os dados dos últimos 5 anos do BTC-USD (de 2017 à 2022). Vamos separar nossa base em subconjuntos com 120 dias cada. Conforme mostrado na imagem abaixo, até o início de 2020 vamos utilizar os dados para treinar o modelo (train), os 120 dias seguintes vamos utilizar para validar (val). Em seguida vamos usar 5 subconjuntos (splits) diferentes para realizar a validação cruzada.

Divisão do conjunto de dados

Métricas

Como estamos prevendo o valor numérico do fechamento do BTC, vamos utilizar métricas de regressão para avaliar o desempenho do modelo, são elas:

  • R-Quadrado: ou coeficiente de determinação, calcula qual a porcentagem da variância que pôde ser prevista pelo modelo.
  • MAE: O Erro Absoluto Médio, ou Mean Absolute Error, consiste na média das distâncias entre valores preditos e reais.
  • MSE: O Erro Quadrático Médio, ou Mean Squared Error, consiste na média do erro das previsões ao quadrado.
  • RMSE: A Raiz do Erro Quadrático Médio, ou Root Mean Squared Error, consiste na raiz do MSE, melhorando a interpretabilidade da métrica.

Validação cruzada

Um dos métodos mais recomendados para avaliar o desempenho de modelo em séries temporais, é a validação cruzada walk forward, que treina e testa avançando em passos sobre o conjunto de dados de teste. Abaixo temos o código dessa validação e uma imagem ilustrando seu esquema.

Coding walk forward
Validação cruzada walk forward

Conforme mostrado na imagem acima, essa validação faz com que cada avanço de teste o modelo aprenda mais com os dados do passado (train).

Resultados

Construção do modelo

No processo de construção e validação do modelo foi obtido um R-Quadrado de 0,72. Na imagem abaixo é mostrado o valor atual e predito do conjunto de validação.

Construindo e validando o modelo

Nesta fase de validação o modelo nunca havia visto dados diferentes do seu treino, e mesmo assim demonstrou resultados razoáveis.

Validação Cruzada

SPLIT I
SPLIT II
SPLIT III
SPLIT IV
SPLIT V

Ao analisar os resultados, graficamente é possível notar que o modelo obteve um bom desempenho. Entretanto, ao analisar os valores da tabela, nota-se que do split 1 até o 3 seu desempenho está em ascensão, isso ocorre pela fato do modelo utilizar os dados anteriores para retreinar. Assim no split 4 foi onde obteve seu melhor desempenho, e no split 5 houve uma leve queda no desempenho, devido anormalidades que ocorreram neste subconjunto temporal (conforme visto na imagem de divisão do conjunto de dados).

Conclusão

O modelo LSTM abordado obteve um coeficiente de determinação médio de 0,83 que é um valor aceitável, visto que as métricas de erro obtiveram ótima performance.

Além disso, ao obter essa performance com a aplicação da validação cruzada mostra que o modelo tende a não a ter overfitting.

Por fim, mesmo que fatores externos afetem o valor do fechamento, o uso do LSTM como modelo de predição pode ser uma excelente ferramenta para auxiliar na tomada de decisão.

Projeto no GitHub

Trabalhos Futuros

  • Explorar o uso de diferentes variáveis: VWAP, IFR, Médias Móveis, etc
  • Analisar o modelo em diferentes períodos de aprendizagem, variando seu parâmetro de timesteps.
  • Abordar diferentes arquiteturas de redes recorrentes, tais como: GRU (Gated Recurrent Unit), CNN (Convolutional Neural Networks)

Referências

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

https://medium.com/neuronio/predicting-stock-prices-with-lstm-349f5a0974d4

https://medium.com/analytics-vidhya/long-short-term-memory-networks-23119598b66b

https://machinelearningmastery.com/tune-lstm-hyperparameters-keras-time-series-forecasting/

https://levelup.gitconnected.com/predicting-bitcoins-price-with-recurrent-neural-networks-a27b4d2d839

https://towardsdatascience.com/what-are-the-best-metrics-to-evaluate-your-regression-model-418ca481755b

--

--