基于循环神经网络和LSTM的比特币价格预测

  • 2021 年 6 月 9 日
  • AI

程序员宝藏库github.com/Jackpopc/CS-

循环神经网络(RNN)是最先进的时间序列算法,被苹果的Siri和谷歌的语音搜索所采用。

它是一种由其内部存储器记住其输入的算法,这使得该算法完全适合解决涉及时序的机器学习问题,这也使得它在深度学习中取得巨大的成果。

在这篇文章中,讨论了如何通过分析过去6年的信息来预测比特币的价格。我们实现了一个简单的模型,使用Python和RNN帮助我们更好地理解时间序列的工作方式。

理解比特币

比特币是一种加密货币,诞生于2009年1月。它是世界上最有价值的加密货币,在全世界40多个交易所交易,接受30多种不同的货币。

作为一种货币,比特币为价格预测提供了一个新的机会,因为它具有高波动性,与传统货币相比要高得多。

比特币系统是一组去中心化的节点,运行比特币代码并存储其区块链。

一个区块链可以被认为是一组区块的集合。在每个区块中,都有一个交易的集合。因为所有运行区块链的计算机都有相同的区块和交易列表,并且可以透明地看到这些新区块被新的比特币交易填满,所以没有人可以欺骗系统。

比特币使用点对点技术来促进即时支付,矿工负责处理区块链上的交易。

比特币的工作方式是理解它为何如此受欢迎的关键。与其他投资不同,加密货币不与实物资产或美元挂钩。它的主要目的是允许任何地方的两个人直接交换价值。这意味着,没有中心控制这个网络。没有政府,没有中央银行可以关闭或任意提高或降低价值。每当有人进行交易时,一个独特的加密签名就会被添加到账本上进行验证。

实现

循环神经网络

循环神经网络是一种稳健而强大的神经网络类型,被认为是最专业的算法之一,因为它们是唯一具有内部存储器的神经网络。

循环神经网络最早创建于20世纪80年代,但只有在最近几年才真正发挥它的潜力。

计算能力的提高,加上我们现在有的巨量数据,以及20世纪90年代短时记忆(LSTM)的发明,使RNN真正进入人们的视野。

该算法对于时间序列、语音、文本、金融数据、音频、视频、天气等时序问题表现非常好。与其他算法相比,RNN能够对一个序列及其上下文有更深入的理解。

在RNN中,信息会经过一个循环。当做出决定时,它考虑到当前的输入,也考虑到它从之前收到的输入中所学到的东西。

下面的图片说明了RNN算法中的信息流是如何工作的。

LSTM

长短期记忆网络是递归神经网络的延伸,它RNN基础上扩展了记忆。因此,它很适合从中间有很长时间滞后的重要经验中学习。

LSTM使RNN能够记住很长一段时间内输入,这是因为LSTM把信息存储到内存中,很像计算机的内存。LSTM可以从其内存中读取、写入和删除信息。

在一个LSTM中,你有三个门:输入门、遗忘门和输出门。这些门决定是否让新的输入进入(输入门),删除不重要信息(遗忘门),或让它影响当前时间步长的输出(输出门)。下面是一个有三个门的RNN的图示。

LSTM中的门是模拟的sigmoids形式,意味着它们的范围从0到1。它们是模拟的这一事实使它们能够进行反向传播。

获取实时加密货币数据(比特币)

本文使用到的数据是从雅虎财经上获取到的:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import MinMaxScaler

data = pd.read_csv('BTC-USD.csv', date_parser = True)
data.tail()
data_training = data[data['Date']< '2020-01-01'].copy()
data_training
data_test = data[data['Date']< '2020-01-01'].copy()
data_test
training_data = data_training.drop(['Date', 'Adj Close'], axis = 1)
 training_data.head()

归一化

我们对数据采取的第一个步骤是对其数值进行标准化。归一化的目的是将数据集中的数字列的值改为一个共同的尺度,而不扭曲数值范围的差异。

MinMaxScaler is used to normalize the data
scaler = MinMaxScaler()
training_data = scaler.fit_transform(training_data)
training_data
X_train = [] 
Y_train = []

for i in range(60, training_data.shape[0]):
	X_train.append(training_data[i-60:i])
	Y_train.append(training_data[i,0])

X_train, Y_train = np.array(X_train), np.array(Y_train)
X_train.shape

使用LSTM神经网络(深度学习)预测加密货币的价格

下面到了建立模型的阶段,找到正确的模型是一门艺术,需要多次调整和尝试,才能为每个模型找到正确的层和超参数。

对于这种类型的问题,模型的建立是相当简单和标准的。

训练这个模型是即使没有GPU也能做到的,数据量非常小,网络结构也非常简单。当涉及到有更多细化信息的更高级的模型时,它可能需要几个小时或几天的时间来训练。

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, LSTM, Dropout

model = Sequential() model.add(LSTM(units = 50, activation = 'relu', return_sequences = True, input_shape = (X_train.shape[1], 5)))
model.add(Dropout(0.2)) model.add(LSTM(units = 60, activation = 'relu', return_sequences = True))
model.add(Dropout(0.3)) model.add(LSTM(units = 80, activation = 'relu', return_sequences = True))

model.add(Dropout(0.4)) model.add(LSTM(units = 120, activation = 'relu'))
model.add(Dropout(0.5)) model.add(Dense(units =1))
model.summary()
model.compile(optimizer = 'adam', loss = 'mean_squared_error')
history= model.fit(X_train, Y_train, epochs = 20, batch_size =50, validation_split=0.1
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(loss))
plt.figure()
plt.plot(epochs, loss, 'b', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title("Training and Validation Loss")
plt.legend()
plt.show()

验证

part_60_days = data_training.tail(60)
df= part_60_days.append(data_test, ignore_index = True)
df = df.drop(['Date', 'Adj Close'], axis = 1)
df.head()
inputs = scaler.transform(df) inputs
X_test = []
Y_test = []
for i in range (60, inputs.shape[0]):
    X_test.append(inputs[i-60:i]) Y_test.append(inputs[i, 0])
    X_test, Y_test = np.array(X_test), np.array(Y_test) X_test.shape, Y_test.shape
    Y_pred = regressor.predict(X_test) Y_pred, Y_test
    
scaler.scale_
scale = 1/5.18164146e-05
Y_test = Y_test*scale Y_pred = Y_pred*scale
Y_pred
Y_test
plt.figure(figsize=(14,5))
plt.plot(Y_test, color = 'red', label = 'Real Bitcoin Price')
plt.plot(Y_pred, color = 'green', label = 'Predicted Bitcoin Price')
plt.title('Bitcoin Price Prediction using RNN-LSTM')
plt.xlabel('Time')
plt.ylabel('Price')
plt.legend()
plt.show()

结语

RNN和LSTM是优秀的技术,有很好的架构,可以用来分析和预测时间序列信息。这篇文章的重点是实现一个简单的模型,如果你对这个主题感兴趣,可以尝试不同的东西。