0
fokus pada
0
Pengikut

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

Dicipta dalam: 2020-05-20 15:45:23, dikemas kini pada: 2020-05-20 15:46:37
comments   1
hits   1740

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

Nota: Kes ini hanya digunakan untuk tujuan kajian dan bukan sebagai cadangan pelaburan.

Data harga bitcoin adalah berdasarkan urutan masa, oleh itu harga bitcoin diramalkan menggunakan model LSTM.

Memori jangka pendek jangka panjang (LSTM) adalah model pembelajaran mendalam yang sangat sesuai untuk data urutan masa (atau data yang mempunyai urutan masa / ruang / struktur, seperti filem, ayat, dan lain-lain) dan merupakan model yang ideal untuk meramalkan arah harga cryptocurrency.

Artikel ini ditulis terutamanya mengenai data yang disatukan melalui LSTM untuk meramalkan harga masa depan Bitcoin.

Perpustakaan yang diperlukan untuk import

import pandas as pd
import numpy as np

from sklearn.preprocessing import MinMaxScaler, LabelEncoder
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout

from matplotlib import pyplot as plt
%matplotlib inline

Analisis data

Muat naik data

Baca data dagangan harian BTC

data = pd.read_csv(filepath_or_buffer="btc_data_day")

Terdapat 1380 data yang terdiri daripada tarikh, buka, tinggi, rendah, tutup, jumlah (BTC), jumlah (mata wang), dan harga berat.

data.info()

Lihat 10 baris pertama.

data.head(10)

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

Visualisasi data

Matplotlib digunakan untuk memetakan harga tertimbang dan melihat bagaimana ia diedarkan. Di dalam grafik, terdapat bahagian data 0 yang perlu kita pastikan terdapat pengecualian.

plt.plot(data['Weighted Price'], label='Price')
plt.ylabel('Price')
plt.legend()
plt.show()

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

Pemprosesan data yang tidak normal

Anda boleh lihat jika terdapat data yang mengandungi nan dan anda boleh lihat jika terdapat data yang tidak mengandungi nan.

data.isnull().sum()

Date                 0
Open                 0
High                 0
Low                  0
Close                0
Volume (BTC)         0
Volume (Currency)    0
Weighted Price       0
dtype: int64

Kemudian kita lihat data sifar, kita dapat lihat bahawa data kita mengandungi nilai sifar, dan kita perlu melakukan sesuatu terhadap nilai sifar.

(data == 0).astype(int).any()

Date                 False
Open                  True
High                  True
Low                   True
Close                 True
Volume (BTC)          True
Volume (Currency)     True
Weighted Price        True
dtype: bool

data['Weighted Price'].replace(0, np.nan, inplace=True)
data['Weighted Price'].fillna(method='ffill', inplace=True)
data['Open'].replace(0, np.nan, inplace=True)
data['Open'].fillna(method='ffill', inplace=True)
data['High'].replace(0, np.nan, inplace=True)
data['High'].fillna(method='ffill', inplace=True)
data['Low'].replace(0, np.nan, inplace=True)
data['Low'].fillna(method='ffill', inplace=True)
data['Close'].replace(0, np.nan, inplace=True)
data['Close'].fillna(method='ffill', inplace=True)
data['Volume (BTC)'].replace(0, np.nan, inplace=True)
data['Volume (BTC)'].fillna(method='ffill', inplace=True)
data['Volume (Currency)'].replace(0, np.nan, inplace=True)
data['Volume (Currency)'].fillna(method='ffill', inplace=True)

(data == 0).astype(int).any()

Date                 False
Open                 False
High                 False
Low                  False
Close                False
Volume (BTC)         False
Volume (Currency)    False
Weighted Price       False
dtype: bool

Dan kemudian kita lihat pada peredaran dan pergerakan data, di mana pada masa ini, ia sangat berterusan.

plt.plot(data['Weighted Price'], label='Price')
plt.ylabel('Price')
plt.legend()
plt.show()

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

Pembahagian set data latihan dan set data ujian

Menggabungkan data ke 0-1

data_set = data.drop('Date', axis=1).values
data_set = data_set.astype('float32')
mms = MinMaxScaler(feature_range=(0, 1))
data_set = mms.fit_transform(data_set)

Bahagikan dataset ujian dan dataset latihan dengan 2:8

ratio = 0.8
train_size = int(len(data_set) * ratio)
test_size = len(data_set) - train_size
train, test = data_set[0:train_size,:], data_set[train_size:len(data_set),:]

Buat set data latihan dan set data ujian dengan satu hari sebagai tempoh tetingkap untuk mencipta set data latihan dan set data ujian kami.

def create_dataset(data):
    window = 1
    label_index = 6
    x, y = [], []
    for i in range(len(data) - window):
        x.append(data[i:(i + window), :])
        y.append(data[i + window, label_index])
    return np.array(x), np.array(y)

train_x, train_y = create_dataset(train)
test_x, test_y = create_dataset(test)

Mendefinisikan dan melatih model

Kali ini kita akan menggunakan model yang mudah, dan model ini mempunyai struktur seperti berikut:. LSTM2. Dense。

Input Shape mempunyai dimensi input sebagai ((batch_size, time steps, features)). Di sini, nilai langkah masa adalah selang waktu tetingkap ketika data dimasukkan, di sini kita menggunakan 1 hari sebagai tetingkap masa, dan data kita adalah data harian, jadi langkah masa kita adalah 1

Memori jangka pendek panjang (LSTM) adalah sejenis RNN khas yang digunakan untuk menyelesaikan masalah kehilangan gradien dan letupan gradien semasa latihan urutan panjang.

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

Dari diagram struktur rangkaian LSTM, dapat dilihat bahawa LSTM sebenarnya adalah model kecil yang mengandungi 3 fungsi pengaktifan sigmoid, 2 fungsi pengaktifan tanh, 3 penggandaan dan 1 penambahan.

Status sel

Keadaan sel adalah pusat LSTM, ia adalah garis hitam di bahagian atas dalam gambar di atas, di bawah garis hitam ini terdapat beberapa pintu, yang akan kami jelaskan di bawah. Keadaan sel akan dikemas kini mengikut hasil setiap pintu. Di bawah ini kami akan memperkenalkan pintu-pintu ini, anda akan memahami proses keadaan sel.

Rangkaian LSTM dapat menghapuskan atau menambah maklumat mengenai keadaan sel melalui struktur yang dikenali sebagai pintu. Pintu dapat membuat keputusan pilihan mengenai maklumat mana yang boleh dilalui. Struktur pintu adalah gabungan lapisan sigmoid dan operasi penggandaan titik. Oleh kerana output lapisan sigmoid adalah nilai 0-1, 0 tidak dapat dilalui, 1 dapat dilalui.

Pintu Lupakan

Langkah pertama LSTM adalah untuk menentukan maklumat yang perlu dibuang oleh keadaan sel. Operasi ini dilakukan melalui unit sigmoid yang dikenali sebagai pintu lupa.

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

Kita dapat melihat bahawa pintu lupa akan melihat maklumat \(h_{l-1}\) dan \(x_{t}\) untuk menghasilkan vektor antara 0 - 1, nilai 0 - 1 dalam vektor ini menunjukkan berapa banyak maklumat yang disimpan atau dibuang dalam keadaan sel \(C_{t-1}\). 0 menunjukkan tidak disimpan, dan 1 menunjukkan disimpan.

Ungkapan matematik: \(f_{t} =\sigma\left(W_{f} \cdot\left[h_{t-1}, x_{t}\right]+b_{f}\right)\)

Pintu masuk

Langkah seterusnya ialah memutuskan apa maklumat baru yang akan ditambahkan kepada status sel, dan langkah ini dilakukan dengan membuka pintu masuk.

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

Kita lihat \(h_{l-1}\) dan \(x_{t}\) dimasukkan ke dalam sebuah gerbang lupa (sigmoid) dan gerbang input (tanh). Oleh kerana output gerbang lupa adalah nilai 0-1, oleh itu, jika gerbang lupa mengeluarkan nilai 0, hasilnya \(C_{i}\) tidak akan ditambahkan ke dalam keadaan sel semasa, jika 1, semuanya akan ditambahkan ke dalam keadaan sel, oleh itu fungsi gerbang lupa di sini adalah untuk menambahkan hasil input gerbang secara terpilih ke dalam keadaan sel.

Formula matematik ialah: \(C_{t}=f_{t} * C_{t-1}+i_{t} *\tilde{C}_{t}\)

Pintu keluar

Selepas mengemas kini keadaan sel diperlukan untuk menilai ciri-ciri keadaan sel output berdasarkan jumlah \( h_ {l-1} \) dan \( x_ {t} \) input, di mana input perlu dinilai melalui lapisan sigmoid yang dipanggil pintu keluar, dan kemudian keadaan sel melalui lapisan tanh untuk mendapatkan nilai antara -1 ~ 1 vektor, yang berganda dengan pintu keluar untuk mendapatkan output unit RNN akhir.

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

def create_model():
    model = Sequential()
    model.add(LSTM(50, input_shape=(train_x.shape[1], train_x.shape[2])))
    model.add(Dense(1))
    model.compile(loss='mae', optimizer='adam')
    model.summary()
    return model

model = create_model()

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

history = model.fit(train_x, train_y, epochs=80, batch_size=64, validation_data=(test_x, test_y), verbose=1, shuffle=False)

plt.plot(history.history['loss'], label='train')
plt.plot(history.history['val_loss'], label='test')
plt.legend()
plt.show()

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

train_x, train_y = create_dataset(train)
test_x, test_y = create_dataset(test)

Ramalan

predict = model.predict(test_x)
plt.plot(predict, label='predict')
plt.plot(test_y, label='ground true')
plt.legend()
plt.show()

Ramalan harga Bitcoin masa nyata menggunakan rangka kerja LSTM

Pada masa ini, penggunaan pembelajaran mesin untuk meramalkan pergerakan harga jangka panjang Bitcoin masih sangat sukar, dan artikel ini hanya boleh digunakan sebagai kes pembelajaran. Kes ini akan dimuat naik dan pengguna yang berminat boleh mengalaminya secara langsung dalam gambar demo dari Matrix Cloud.