當前位置:
首頁 > 最新 > 如何一夜暴富?深度學習教你預測比特幣價格

如何一夜暴富?深度學習教你預測比特幣價格

關鍵時刻,第一時間送達!

參與 |王赫

編輯 | Donna

近年來,以比特幣為代表的加密數字貨幣一直是社交媒體和搜索引擎上的熱門。但是,比特幣價格浮動也使各位看官們經歷了過山車般的體驗。

隨著本周各大權威機構紛紛表示看好區塊鏈的未來,從1月17日到18日凌晨,比特幣成功止住前一日暴跌的頹勢,漲幅接近20%(18.46%)。

如果我們能夠智能化的制定投資策略的話,就能發現這些反覆無常的波動背後潛藏著巨大的利潤。

與傳統金融工具相比,加密貨幣由於缺乏指標數據,預測變得非常困難。 本文以當下最火的比特幣為例,來探討如何用深度學習預測加密數字貨幣的價格,並了解它們未來的發展趨勢。

免責聲明:比特幣等數字貨幣的交易屬於投資行為。交易有風險,買幣須謹慎。

第一步

要運行本文中的代碼,請確保已經安裝了以下環境和代碼庫:

Python 2.7

Tensorflow=1.2.0

Keras=2.1.1

Pandas=0.20.3

Numpy=1.13.3

h5py=2.7.0

sklearn=0.19.1

數據採集

用於分析預測的數據可以從Kaggle或者Poloniex上收集到。 為確保在不同數據集之間代碼適用的一致性,從Poloniex上收集數據的列名都會更改為與Kaggle相匹配的列名。

數據準備

從數據源收集而來的數據需要先被解析一下才能送到模型中進行預測。下面代碼中,PastSampler類是參考這個博客上的方法將數據分成一列子數據集和相應的標籤數據集。模型輸入數據大小(N)為256個,輸出大小(K)為16個。

值得注意的是,從Poloniex收集來的數據是以5分鐘為基礎間隔時序數據。 這表明輸入模型的數據跨度為1280分鐘,而輸出的數據跨度超過了80分鐘。

在創建完PastSampler類之後,我將利用此類來收集數據。 由於原始數據的取值範圍從0到10000以上,因此需要對數據進行縮放操作來使神經網路更容易理解數據。

模型構建

CNN

一維卷積神經網路可以通過核窗口在輸入數據上滑動的情況下很好地捕捉數據的局部特徵。如下圖所示。

CNN 圖例,來自 http://cs231n.github.io/convolutional-networks/

上述代碼是我建立的第一個卷積神經網路模型。 以下代碼將我的GPU編號為「1」(這是因為我有4個GPU,您可以將其設置為您任何一個GPU)。 由於Tensorflow在多GPU上運行似乎不盡人意,因此把它限制在一個GPU上運行很合適的。 如果您沒有GPU也請不要擔心,儘管忽略下面的代碼就好。

構建CNN模型的代碼是非常簡單的。加入dropout層是為了避免過擬合問題。 損失函數的定義為均方誤差(MSE),而優化器選用最先進的Adam自適應優化。

唯一需要擔心的是每層之間的輸入數據和輸出數據的維度。 計算某個卷積層輸出數據維度的公式是:

輸出時間步長=(輸入時間步長 - 核窗口大小)/步幅+ 1

在下面代碼的末尾,我添加了兩個回調函數CSVLogger和ModelCheckpoint。 前者可以幫助我跟蹤所有的訓練和驗證過程,而後者則可以存儲每個周期的模型權重參數。

LSTM

長期短期記憶(LSTM)網路是遞歸神經網路(RNN)的一種變體,發明它的目的是為了解決在普通RNN中存在的梯度消失問題。 據稱LSTM能夠記住更長的時序輸入步長。

LSTM 圖例 (來自 http://colah.github.io/posts/2015-08-Understanding-LSTMs/>)

LSTM比CNN更容易通過代碼實現,這是因為你根本不需要關心核窗口的大小,步長,輸入和輸出的數據維度大小之間的關係等。 只需要確保輸入網路數據和輸出網路的數據維度就可以了。

GRU

門控循環單元(GRU)是RNN的另一種變體。 它的網路結構不如LSTM那麼複雜,只有一個複位門和忘記門,而不是記憶單元。 據稱GRU的性能與LSTM是相當的,但效率可以更高。 (在本文中也是如此的,因為LSTM大約需要跑45秒/周期,而GRU則不到40秒/周期)

來自http://www.jackdermody.net/brightwire/article/GRU_Recurrent_Neural_Networks)

只需將LSTM模型中的第二行

替換為

繪圖結果

由於三個模型的計算結果圖像很相似,所以我只會查看CNN模型的圖像。 首先,我們需要重建模型並將訓練權重載入到模型中。

然後,我們需要對預測後的數據進行反向縮放,因為之前使用了MinMaxScaler,因此此時預測的數據範圍是在[0,1]。

如上所示的兩個Dataframes分別構造了真實值(實際價格)以及比特幣的預測價格。為了更好的可視化,繪製的圖像只顯示了2017年8月之後的數據。

我們使用pyplot繪製圖形。 由於預測出的價格是以16分鐘為間隔的,所以為了讓我們更方便的查看結果,我就不把它們全部鏈接起來了。 結果,這裡預測的數據被繪製成紅點,如第三行中的「ro」所示。

下圖中的藍線表示真實值(實際價格數據),而紅點表示預測的比特幣價格。

使用2層CNN模型預測的最佳比特幣價格

從上圖可以看出,預測價格與比特幣的實際價格是非常相似的。 為了得到最佳模型效果,我決定測試集中配置下的神經網路,如下表所示。

不同模型下的預測結果

上表中的每一行都是從100個訓練周期中得到的最佳驗證損失的模型。 從以上結果可以看出,LeakyReLU似乎總是比通常的ReLU產生更好的損失效果。 但是,使用Leaky ReLU作為激活函數的4層CNN模型會得到較大的驗證損失值,這可能是由於重新驗證的模型所導致的問題。 CNN模型可以訓練得非常快(使用GPU時,2秒/周期),在性能上要比LSTM和GRU稍差一點。 雖然3層CNN似乎可以更好地捕捉數據的局部時間依賴性,但最好的模型似乎是用 tanh和Leaky ReLU作為激活函數的LSTM模型。

用Tanh和Leaky ReLu作為激活函數的LSTM模型

用Leaky ReLu作為激活函數的3層CNN模型

雖然預測看起來都相當不錯,但是過度擬合還是很值得留意的。 當用LeakyReLU訓練LSTM時,訓練損失和驗證損失之間存在差距(5.97E-06 vs 3.92E-05),應該使用正則化來最小化這個差異。

正則化

為了找到最佳的正則化方案,我用L1和L2在不同的幾個值中實驗。 首先,我們需要定義一個新的函數來使得數據能夠擬合到LSTM中。 在這裡,我將使用在偏置正規化方法對偏差向量進行正則化。

通過重複訓練模型30次,每次30個周期為標準進行實驗。

如果你使用的是Jupyter notebook,則可以直接從輸出數據中查看如下表格。

使用偏置正則化的結果

為了可視化比較,我們可以使用boxplot繪圖:

通過比較可知,L2正則化中偏差向量的係數為0.01時可以似乎得到了最好的結果。

為了找出所有超參數正則化之間的最佳組合,包括激活,偏置,核窗口,循環矩陣等等,有必要逐一測試所有正則化方案,但這對我目前的硬體配置來說並不現實。 因此,我將擱置下來以後再議。

結論

從本文,你已經了解到:

如何收集時序的比特幣數據。

如何準備數據進行訓練和預測。

如何使用深度學習技術預測比特幣的價格。

如何可視化預測的結果。

如何在模型上應用正則化技術。

作者:黃功詳 Steeve Huang


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

飛機上終於能開著手機連 Wi-Fi 了,它背後的技術原理是什麼?

TAG:CSDN |