基於循環神經網路和LSTM的比特幣價格預測
- 2021 年 6 月 9 日
- AI
程式設計師寶藏庫://github.com/Jackpopc/CS-Books-Store
循環神經網路(RNN)是最先進的時間序列演算法,被蘋果的Siri和Google的語音搜索所採用。
它是一種由其內部存儲器記住其輸入的演算法,這使得該演算法完全適合解決涉及時序的機器學習問題,這也使得它在深度學習中取得巨大的成果。
在這篇文章中,討論了如何通過分析過去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是優秀的技術,有很好的架構,可以用來分析和預測時間序列資訊。這篇文章的重點是實現一個簡單的模型,如果你對這個主題感興趣,可以嘗試不同的東西。