Prevendo o fechamento do bitcoin com deep learning (LSTM)
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âmetro “hidden 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.
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.
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.
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.
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
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