0

Prevendo o preço do Bitcoin

Leonardo Diniz
Leonardo Diniz

Boa noite pessoal. Venho apresentar um projeto de portifólio que criei com base nos ensinamentos fornecidos pela aula Fundamentos ETL com Python.

De imediato, faço uma ressalva: esse projeto não é dica de investimento, nem se propõe a acertar o preço do ativo no futuro próximo. Estou apresentando apenas como uma maneira de compartilhar conhecimento quanto ás possibilidades da biblioteca Pandas. Dito isto, vamos lá!


Este programa usa de regressão de mínimos quadrados por metodologia de Redes Neurais, do tipo LongShort Term Memory (LSTM), fornecida pela biblioteca Keras Tensorflow, para prever o preço de fechamento diário do par BTCUSD (preço do Bitcoin em dólares), usando como dado de entrada o preço do ativo nos 60 dias anteriores.

O link para o código completo está no meu GitHub: https://github.com/LeoAlmDiniz/btcPriceNeuralNetwork

Aqui, vou repassar a função de algumas linhas para que entendam a lógica. Uma função muito interessante, não muito mencionada, do Pandas, é a sua biblioteca pandas_datareader. Esta bibloteca possui funções "digeridas" do tipo request, como se fossem wrappers para acessar os dados de diversas bases relevantes de preços de ativos. Neste código, acessamos o Quandl.

import pandas_datareader as web
df = web.DataReader('BITFINEX/BTCUSD', data_source='quandl',start= '2012-01-01',api_key= cfg.QUANDL_API_KEY)

Como utilizamos um algorítimo de redes neurais, 60% dos dados são separados para serem utilizados como conjunto de treino (ficando os dados restantes disponíveis como conjunto de validação). Além disto, todos os dados são escalados para o intervalo de 0 a 1 com o auxílio da classe MinMaxScaler, proveniente da biblioteca SciKitLearn. Esse procedimento é considerado 'boas práticas' no uso de regressões do tipo NN.

trainingDataLen = math.ceil( len(dataset)*0.6 )
scaler = MinMaxScaler(feature_range= (0,1))
scaledData = scaler.fit_transform(dataset)
trainData = scaledData[0:trainingDataLen, :]

O conjunto xTrain é montado como sendo uma série de pontos em que cada ponto consiste em um vetor com os 60 preços anteriores. o conjunto yTrain é uma série de pontos em que cada ponto consiste no preço atual.

for i in range(inputSize, len(trainData)):
    xTrain.append(trainData[i-inputSize:i,0])
    yTrain.append(trainData[i,0]) 

Construção do modelo LSTM:

#Construir o LSTM:
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape = (xTrain.shape[1],1)))
#50 neurons, return_sequences=True signifca que há uma próxima camada LSTM, e o formato da entrada é de 60 preços e 1 saída (preço atual)
model.add(LSTM(50,return_sequences=False))
#50 neurons novamente, agora falso porque não há uma próxima LSTM
model.add(Dense(25)) #25 neurons, camada regular
model.add(Dense(1)) #1 neuron de saída com o preço
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(xTrain, yTrain, batch_size=1, epochs=3)

Esquematicamente, o que estamos construindo é uma Rede Neural como neste esquema:

As demais linhas tratam da utilização do modelo para prever o conjunto de teste (os 40% restantes dos dados) e também da geração de uma previsão de 30 dias para a qual ainda não há preço real. O gráfico da Figura a seguir mostra a previsão do modelo para hoje. Como pode ser visto pelo bom ajuste entre as linhas vermelho a alaranjada, a rede neural MODELA bem os dados do preço passado do BTC.


Quanto ao preço dos futuros 30 dias, o modelo fornece a seguinte estimativa (lembrando, é um modelo didático para fins de conhecimento, sem rigor de desenvolvimento).



Vale ressaltar, por exemplo, que caso você rode o código no seu ambiente, é possível que o próprio ajuste da rede seja diferente (uma vez que a uma infinidade de mínimos locais em problemas desse tipo -- não convexos), e as previsões futuras poderão ser totalmente diferentes.


Fica o agradecimento à DIO pelas excelentes aulas.

Um abraço a todos.

0
0

Comentários (1)

0
E

Eli Souza

24/06/2021 00:35

Ótimo trabalho Leonardo!

PhD em Engenharia Química

Brasil