使用Python預(yù)測(cè)比特幣價(jià)格
本文轉(zhuǎn)載自微信公眾號(hào)「區(qū)塊鏈研究實(shí)驗(yàn)室」,作者鏈三豐。轉(zhuǎn)載本文請(qǐng)聯(lián)系區(qū)塊鏈研究實(shí)驗(yàn)室公眾號(hào)。
在本文中,我們將討論與比特幣價(jià)格預(yù)測(cè)有關(guān)的程序。
涉及的主題:
1.什么是比特幣
2.如何使用比特幣
3.使用深度學(xué)習(xí)預(yù)測(cè)比特幣價(jià)格
什么是比特幣?
比特幣是所有加密愛(ài)好者普遍使用的加密貨幣之一。即使有幾種突出的加密貨幣,如以太坊,Ripple,Litecoin等,比特幣也位居榜首。
加密貨幣通常用作我們貨幣的加密形式,廣泛用于購(gòu)物,交易,投資等。
它使用對(duì)等技術(shù),該技術(shù)背后是,沒(méi)有驅(qū)動(dòng)力或任何第三方來(lái)干擾網(wǎng)絡(luò)內(nèi)完成的交易。此外,比特幣是“開(kāi)源的”,任何人都可以使用。
功能:
- 快速的點(diǎn)對(duì)點(diǎn)交易
 - 全球支付
 - 手續(xù)費(fèi)低
 
使用的原理-密碼學(xué):
加密貨幣(比特幣)背后的工作原理是“加密”,他們使用此原理來(lái)保護(hù)和認(rèn)證協(xié)商,并控制加密貨幣新組件的建立。
如何使用比特幣?
- 保護(hù)錢(qián)包:應(yīng)該更安全地保護(hù)比特幣錢(qián)包,以便輕松順利地進(jìn)行交易
 - 比特幣價(jià)格易變:比特幣價(jià)格可能會(huì)波動(dòng)。價(jià)格可以根據(jù)通貨膨脹率,數(shù)量等幾個(gè)因素而增加或減少。
 
使用深度學(xué)習(xí)預(yù)測(cè)比特幣價(jià)格
1. 數(shù)據(jù)收集:
導(dǎo)入CSV文件數(shù)據(jù)集。
- import pandas as pd
 - import numpy as np
 - import matplotlib.pyplot as plt
 
現(xiàn)在,使用pandas和numpy導(dǎo)入數(shù)據(jù)集。Numpy主要用于python中的科學(xué)計(jì)算,
- coindata = pd.read_csv(‘Dataset.csv’)
 - googledata = pd.read_csv(‘DS2.csv’)
 
已加載的原始數(shù)據(jù)集已打印,
- coindata = coindata.drop([‘#’], axis=1)
 - coindata.columns = [‘Date’,’Open’,’High’,’Low’,’Close’,’Volume’]
 - googledata = googledata.drop([‘Date’,’#’], axis=1)
 
未使用的列將放在此處。
從硬幣數(shù)據(jù)和Google數(shù)據(jù)集中刪除兩列,因?yàn)樗鼈兪俏词褂玫牧小?/p>
從數(shù)據(jù)集中刪除未使用的列后,將為兩個(gè)數(shù)據(jù)集打印最終結(jié)果。
- last = pd.concat([coindata,googledata], axis=1)
 
將兩個(gè)數(shù)據(jù)集(硬幣數(shù)據(jù)和谷歌數(shù)據(jù))連接起來(lái),并使用函數(shù)將其打印出來(lái)
- last.to_csv(‘Bitcoin3D.csv’, index=False)
 
2.一維RNN:
現(xiàn)在將兩個(gè)數(shù)據(jù)集串聯(lián)后,將導(dǎo)出最終數(shù)據(jù)集。
- import pandas as pd
 - import matplotlib.pyplot as plt
 - import numpy as np
 - import math
 - from sklearn.preprocessing import MinMaxScaler
 - from sklearn.metrics import mean_squared_error
 - from keras.models import Sequential
 - from keras.layers import Dense, Activation, Dropout
 - from keras.layers import LSTM
 
在這里使用Keras庫(kù)。Keras僅需幾行代碼即可使用有效的計(jì)算庫(kù)訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型。
MinMaxScaler會(huì)通過(guò)將每個(gè)特征映射到給定范圍來(lái)轉(zhuǎn)換特征。sklearn軟件包將提供該程序所需的一些實(shí)用程序功能。
密集層將執(zhí)行以下操作,并將返回輸出。
- output = activation(dot(input, kernel) + bias)
 - def new_dataset(dataset, step_size):
 - data_X, data_Y = [], []
 - for i in range(len(dataset)-step_size-1):
 - a = dataset[i:(i+step_size), 0]
 - data_X.append(a)
 - data_Y.append(dataset[i + step_size, 0])
 - return np.array(data_X), np.array(data_Y)
 
將在數(shù)據(jù)預(yù)處理階段收集的一維數(shù)據(jù)分解為時(shí)間序列數(shù)據(jù),
- df = pd.read_csv(“Bitcoin1D.csv”)
 - df[‘Date’] = pd.to_datetime(df[‘Date’])
 - df = df.reindex(index= df.index[::-1])
 
數(shù)據(jù)集已加載。該功能是從Bitcoin1D.csv文件中讀取的。另外,將“日期”列轉(zhuǎn)換為“日期時(shí)間”。通過(guò)“日期”列重新索引所有數(shù)據(jù)集。
- zaman = np.arange(1, len(df) + 1, 1)
 - OHCL_avg = df.mean(axis=1)
 
直接分配一個(gè)新的索引數(shù)組。
- OHCL_avg = np.reshape(OHCL_avg.values, (len(OHCL_avg),1)) #7288 data
 - scaler = MinMaxScaler(feature_range=(0,1))
 - OHCL_avg = scaler.fit_transform(OHCL_avg)
 
分配定標(biāo)器后規(guī)格化數(shù)據(jù)集,
- #print(OHCL_avg)
 - train_OHLC = int(len(OHCL_avg)*0.56)
 - test_OHLC = len(OHCL_avg) — train_OHLC
 - train_OHLC, test_OHLC = OHCL_avg[0:train_OHLC,:], OHCL_avg[train_OHLC:len(OHCL_avg),:]
 - #Train the datasets and test it
 - trainX, trainY = new_dataset(train_OHLC,1)
 - testX, testY = new_dataset(test_OHLC,1)
 
從平均OHLC(開(kāi)高低開(kāi))中創(chuàng)建一維維度數(shù)據(jù)集,
- trainX = np.reshape(trainX, (trainX.shape[0],1,trainX.shape[1]))
 - testX = np.reshape(testX, (testX.shape[0],1,testX.shape[1]))
 - step_size = 1
 
以3D維度重塑LSTM的數(shù)據(jù)集。將step_size分配給1。
- model = Sequential()
 - model.add(LSTM(128, input_shape=(1, step_size)))
 - model.add(Dropout(0.1))
 - model.add(Dense(1))
 - model.add(Activation(‘linear’))
 
創(chuàng)建LSTM模型,
- model.compile(loss=’mean_squared_error’, optimizer=’adam’)
 - model.fit(trainX, trainY, epochs=10, batch_size=25, verbose=2)
 
將紀(jì)元數(shù)定義為10,batch_size為25,
- trainPredict = model.predict(trainX)
 - testPredict = model.predict(testX)
 - trainPredict = scaler.inverse_transform(trainPredict)
 - trainY = scaler.inverse_transform([trainY])
 - testPredict = scaler.inverse_transform(testPredict)
 - testY = scaler.inverse_transform([testY])
 
完成了歸一化以進(jìn)行繪圖,
- trainScore = math.sqrt(mean_squared_error(trainY[0],
 - trainPredict[:,0]))
 - testScore = math.sqrt(mean_squared_error(testY[0],
 - testPredict[:,0]))
 
針對(duì)預(yù)測(cè)的測(cè)試數(shù)據(jù)集計(jì)算性能度量RMSE,
- trainPredictPlot = np.empty_like(OHCL_avg)
 - trainPredictPlot[:,:] = np.nan
 - trainPredictPlot[step_size:len(trainPredict)+step_size,:] =
 - trainPredict
 
將轉(zhuǎn)換后的train數(shù)據(jù)集用于繪圖,
- testPredictPlot = np.empty_like(OHCL_avg)
 - testPredictPlot[:,:] = np.nan
 - testPredictPlot[len(trainPredict)+(step_size*2)+1:len(OHCL_avg)-1,:]
 - = testPredict
 
將轉(zhuǎn)換后的預(yù)測(cè)測(cè)試數(shù)據(jù)集用于繪圖,
最終將預(yù)測(cè)值可視化。
- OHCL_avg = scaler.inverse_transform(OHCL_avg)
 - plt.plot(OHCL_avg, ‘g’, label=’Orginal Dataset’)
 - plt.plot(trainPredictPlot, ‘r’, label=’Training Set’)
 - plt.plot(testPredictPlot, ‘b’, label=’Predicted price/test set’)
 - plt.title(“ Bitcoin Predicted Prices”)
 - plt.xlabel(‘ Time’, fontsize=12)
 - plt.ylabel(‘Close Price’, fontsize=12)
 - plt.legend(loc=’upper right’)
 - plt.show()
 
3.多變量的RNN:
- import pandas as pd
 - from pandas import DataFrame
 - from pandas import concat
 - from math import sqrt
 - from numpy import concatenate
 - import matplotlib.pyplot as pyplot
 - import numpy as np
 - from sklearn.metrics import mean_squared_error
 - from sklearn.preprocessing import MinMaxScaler
 - from keras import Sequential
 - from keras.layers import LSTM, Dense, Dropout, Activation
 - from pandas import read_csv
 
使用Keras庫(kù)。Keras僅需幾行代碼就可以使用有效的計(jì)算庫(kù)來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型。sklearn軟件包將提供該程序所需的一些實(shí)用程序功能。
密集層將執(zhí)行以下操作,并將返回輸出。
- dataset = read_csv(‘Bitcoin3D.csv’, header=0, index_col=0)
 - print(dataset.head())
 - values = dataset.values
 
使用Pandas庫(kù)加載數(shù)據(jù)集。在這里準(zhǔn)備了可視化的列。
- groups = [0, 1, 2, 3, 5, 6,7,8,9]
 - i = 1
 
將系列轉(zhuǎn)換為監(jiān)督學(xué)習(xí)。
- def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
 - n_vars = 1 if type(data) is list else data.shape[1]
 - df = DataFrame(data)
 - cols, names = list(), list()
 - # Here is created input columns which are (t-n, … t-1)
 - for i in range(n_in, 0, -1):
 - cols.append(df.shift(i))
 - names += [(‘var%d(t-%d)’ % (j+1, i)) for j in range(n_vars)]
 - #Here, we had created output/forecast column which are (t, t+1, … t+n)
 - for i in range(0, n_out):
 - cols.append(df.shift(-i))
 - if i == 0:
 - names += [(‘var%d(t)’ % (j+1)) for j in range(n_vars)]
 - else:
 - names += [(‘var%d(t+%d)’ % (j+1, i)) for j in
 - range(n_vars)]
 - agg = concat(cols, axis=1)
 - agg.columns = names
 - # drop rows with NaN values
 - if dropnan:
 - agg.dropna(inplace=True)
 - return agg
 
檢查值是否為數(shù)字格式,
- values = values.astype(‘float32’)
 
數(shù)據(jù)集值通過(guò)使用MinMax方法進(jìn)行歸一化,
- scaler = MinMaxScaler(feature_range=(0,1))
 - scaled = scaler.fit_transform(values)
 
將規(guī)范化的值轉(zhuǎn)換為監(jiān)督學(xué)習(xí),
- reframed = series_to_supervised(scaled,1,1)
 - #reframed.drop(reframed.columns[[9,10,11,12,13,14,15]], axis=1, inplace=True)
 
數(shù)據(jù)集分為兩組,分別是訓(xùn)練集和測(cè)試集,
- values = reframed.values
 - train_size = int(len(values)*0.70)
 - train = values[:train_size,:]
 - test = values[train_size:,:]
 
拆分的數(shù)據(jù)集被拆分為trainX,trainY,testX和testY,
- trainX, trainY = train[:,:-1], train[:,13]
 - testX, testY = test[:,:-1], test[:,13]
 
訓(xùn)練和測(cè)試數(shù)據(jù)集以3D尺寸重塑以用于LSTM,
- trainX = trainX.reshape((trainX.shape[0],1,trainX.shape[1]))
 - testX = testX.reshape((testX.shape[0],1,testX.shape[1]))
 
創(chuàng)建LSTM模型并調(diào)整神經(jīng)元結(jié)構(gòu),
- model = Sequential()
 - model.add(LSTM(128, input_shape=(trainX.shape[1], trainX.shape[2])))
 - model.add(Dropout(0.05))
 - model.add(Dense(1))
 - model.add(Activation(‘linear’))
 - model.compile(loss=’mae’, optimizer=’adam’)
 
通過(guò)使用trainX和trainY訓(xùn)練數(shù)據(jù)集,
- history = model.fit(trainX, trainY, epochs=10, batch_size=25, validation_data=(testX, testY), verbose=2, shuffle=False)
 
計(jì)算每個(gè)訓(xùn)練時(shí)期的損耗值,并將其可視化,
- pyplot.plot(history.history[‘loss’], label=’train’)
 - pyplot.plot(history.history[‘val_loss’], label=’test’)
 - pyplot.title(“Test and Train set Loss Value Rate”)
 - pyplot.xlabel(‘Epochs Number’, fontsize=12)
 - pyplot.ylabel(‘Loss Value’, fontsize=12)
 - pyplot.legend()
 - pyplot.show()
 
對(duì)訓(xùn)練數(shù)據(jù)集執(zhí)行預(yù)測(cè)過(guò)程,
- trainPredict = model.predict(trainX)
 - trainX = trainX.reshape((trainX.shape[0], trainX.shape[2]))
 
對(duì)測(cè)試數(shù)據(jù)集執(zhí)行預(yù)測(cè)過(guò)程,
- testPredict = model.predict(testX)
 - testX = testX.reshape((testX.shape[0], testX.shape[2]))
 
訓(xùn)練數(shù)據(jù)集反轉(zhuǎn)縮放比例以進(jìn)行訓(xùn)練,
- testPredict = model.predict(testX)
 - testX = testX.reshape((testX.shape[0], testX.shape[2]))
 
測(cè)試數(shù)據(jù)集反轉(zhuǎn)縮放以進(jìn)行預(yù)測(cè),
- testPredict = concatenate((testPredict, testX[:, -9:]), axis=1)
 - testPredict = scaler.inverse_transform(testPredict)
 - testPredict = testPredict[:,0]
 - # invert scaling for actual
 - testY = testY.reshape((len(testY), 1))
 - inv_y = concatenate((testY, testX[:, -9:]), axis=1)
 - inv_y = scaler.inverse_transform(inv_y)
 - inv_y = inv_y[:,0]
 
通過(guò)將mean_squared_error用于train和測(cè)試預(yù)測(cè)來(lái)計(jì)算性能指標(biāo),
- rmse2 = sqrt(mean_squared_error(trainY, trainPredict))
 - rmse = sqrt(mean_squared_error(inv_y, testPredict))
 
訓(xùn)練和測(cè)試的預(yù)測(cè)集串聯(lián)在一起
- final = np.append(trainPredict, testPredict)
 - final = pd.DataFrame(data=final, columns=[‘Close’])
 - actual = dataset.Close
 - actual = actual.values
 - actual = pd.DataFrame(data=actual, columns=[‘Close’])
 
最后,將訓(xùn)練和預(yù)測(cè)結(jié)果可視化。
- pyplot.plot(actual.Close, ‘b’, label=’Original Set’)
 - pyplot.plot(final.Close[0:16781], ‘r’ , label=’Training set’)
 - pyplot.plot(final.Close[16781:len(final)], ‘g’,
 - label=’Predicted/Test set’)
 - pyplot.title(“ Bitcoin Predicted Prices”)
 - pyplot.xlabel(‘ Time’, fontsize=12)
 - pyplot.ylabel(‘Close Price’, fontsize=12)
 - pyplot.legend(loc=’best’)
 - pyplot.show()
 
目前為止,我們使用歷史比特幣價(jià)格數(shù)據(jù)集開(kāi)發(fā)價(jià)格預(yù)測(cè)模型,通過(guò)使用Python中的RNN和LSTM算法來(lái)找到價(jià)格預(yù)測(cè)。




















 
 
 





 
 
 
 