Esse repositório foi desenvolvido durante o Datathon da FGV, cujo o tema era criptomoedas.
Tínhamos como objetivo realizar uma análise, de tema livre, sobre o universo de criptomoedas. Decidimos então realizar o forecast do preço diário e 5-5min de algumas criptomoedas e utilizar a biblioteca Shap para trazer explicação das variáveis, sendo possível uma análise mais profunda das nossas predições.
Iniciamos nossa análise pela obtenção da base de dados. Consultamos vários datasets públicos, mas alguns apresentavam inconsistência e outro, muitas vezes, não eram de alta frequência. No entanto, na nossa busca, encontramos uma base muito bem estruturada no Kaggle. Tal coleção traz uma série de bases, minuto a minuto, de pares de criptomoedas. Além disso, o fato de estar na estrutura parquet a torna mais leve de se trabalhar.
Com a base em mãos, consultamos o site Coin Market Cap para selecionar com quais moedas iriamos fazer as análises, com base na capitalização de mercado das moedas. Escolhemos então as seguintes moedas:
- Ethereum
- Bitcoin
- Ripple
- Iota
- Litecoin
Decidimos também que gostaríamos de olhar as moedas com seus valores baseado em dólar e em bitcoin, para realizar uma análise de como as escolha do par influencia na predição.
Em relação a modelagem, decidimos por utilizar desde modelos mais simples até alguns mais complexos, para entender como essas criptomoedas se comportam em cada uma deles e tentar explicar os motivos de termos tido bons ou maus resultados. Os modelos que escolhemos para avaliar foram:
- Support Vector Machines for Regression (SVR)
- Moving Average
- Linear Regression
- Multi Layer Preceptron (MLP)
- Recurrent Neural Networks with LSTM blocks
- KNN (K-Nearest Neighbors)
A ideia de trazer essa análise veio da leitura do artigo [Statistical and Machine Learning forecasting methods: Concerns and ways forward] e resolvemos agregar a questão da explicabilidade, pois sabemos que mais importante do que bons resultados, é entender a forma como nosso modelo realiza suas predições, a fim de encontrar bons insights, garantir a qualidade do processo e até mesmo refiná-lo.
Vamos dividir esse tópico em duas partes:
Um importante ponto na hora de criar um conjunto de teste para séries temporais é garantir que você realize a predição usando valores isolados no tempo, ou seja, treino no passado e realize predições no futuro. É muito importante que, dada a sazonalidade de uma séria temporal, seja respeitado o limite temporal de tal sazonalidade para realizar a divisão de treino e teste, para que o modelo utilizado, caso consiga, aprenda essa a sazonalidade de série. Quando quebramos tal padrão na hora de dividir nossa base podemos fazer com que o modelo não aprenda isso, ocasionando possíveis erros.
Para avaliar nossos modelos, utilizamos como métrica de avaliação a raiz da soma dos erros quadrados, também conhecido como RMSE (Root Mean Squared Error). Sua fórmula é dada por:
Desenvolvemos também um webapp para que você possa realizar alguns testes com sua própria base.
Para rodá-lo localmente você deve seguir os seguintes passos (seu desenvolvimento foi utilizando python 3.7):
- Baixar as dependências do projeto:
pip install -r streamlit/requirements.txt
- Executar o app (assumindo que você no mesmo diretório do README.md):
streamlit run streamlit/st_app.py
- Acessar o endereço local que irá aparecer no seu terminal.