TensorFlow-Bitcoin-Robot:一個基於 TensorFlow LSTM 的 Bitcoin 價格預測機器人

簡介

TensorFlow-Bitcoin-Robot:一個基於 TensorFlow LSTM 模型的 Bitcoin 價格預測機器人。git

文章包括一下幾個部分:
1.爲何要嘗試作這個項目?
2.爲何選取了這個模型?
3.模型的數據從哪裏來?
4.模型的優化過程?
5.項目能夠進一步提高的方向。github

對於以比特幣爲首的數字貨幣近期的表現,只能用瘋狂來形容。來自比特幣交易平臺的最新價格行情顯示,就在此前一天,比特幣盤中最高價格達到29838.5元,距離3萬元大關僅有咫尺之遙。比特幣最近火熱的行情,吸引了衆多的關注,還有一我的工智能彷佛無所不能,那麼問題來了,可否用人工智能來進行比特幣交易呢?json

使用什麼模型來進行價格預測?如今熱門的 深度神經網絡,卷積神經網絡,循環神經網絡,由於卷積神經網絡更適合處理圖片,循環神經網絡比較適合處理序列化內容,尤爲是 LSTM 是 RNN 的升級版。網絡

LSTM(Long Short-Term Memory)是長短時間記憶網絡,是一種時間遞歸神經網絡,適合於處理和預測時間序列中間隔和延遲相對較長的重要事件。LSTM 已經在科技領域有了多種應用。基於 LSTM 的系統能夠學習翻譯語言、控制機器人、圖像分析、文檔摘要、語音識別圖像識別、手寫識別、控制聊天機器人、預測疾病、點擊率和股票、合成音樂等等任務。比特幣的成交記錄就是事件序列上的加個數據,能夠基於過去的成交記錄序列來對將來的價格做出預測,和 LSTM 的模型比較合適。接下來的價格能夠做爲預測結果。app

數據集

新的問題來了,數據從哪裏來?
須要的數據是一個包含成交價格的序列,而後能夠截取一部分做爲輸入值,接下來的一部分做爲預測值。後來找了一下,主流的交易平臺都提供了部分歷史數據,但都不是不少。最後採用了 btctrade ,用 requests 爬取,它包含比特幣的 50 個交易記錄。函數

獲取數據集的腳本
get_trades.py 會獲取這些交易記錄,從新轉化爲 json ,而且用圖片的方式展現出來,供下一步數據分析使用。學習

運行前須要安裝的依賴:
爲了爬取數據,須要使用 requests 庫,一個很是好用的 HTTP 庫。爲了把交易的數據可視化,使用了 matplotlib。測試

pip install requests
pip install matplotlib

模型

rnn_predicter.py 優化

使用 LSMT 模型。截取 10個交易記錄做爲輸入,若是 第 11個價格比第10個高,就把輸出設置爲 [1,0,0],若是低就設置爲 [0,0,1] ,若是相同 [0,1,0]。人工智能

for i in range(0,20):
    #print(price)
    one_predictor=np.array(price[i:i+20],dtype=float)
    #print(one_predictor)
    train_x.append(one_predictor)
    if(int(price[i+20])>int(price[i+21])):
        train_y.append(np.array([1,0,0]))
    elif (int(price[i + 20]) == int(price[i + 21])):
        train_y.append(np.array([0,1,0]))
    elif(int(price[i+20])<int(price[i+21])):
        train_y.append(np.array([0,0,1]))

下一步定義模型:
tensorflow lstm 模型,須要把 tensor 拆分紅序列,而後傳入模型。不然回報錯,也就是代碼中的 x = tf.unstack(x, n_steps, 1) 。

def RNN(x, weights, biases):
    #首先把數據拆分爲 n 個序列,每個的維度 (batch_size, n_input)
    x = tf.unstack(x, n_steps, 1)

    # 定一個 lstm cell
    lstm_cell = rnn.BasicLSTMCell(n_hidden, forget_bias=1.0)

    # 得到 lstm 的輸出
    outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32)
    # 加個線性激活
    return tf.matmul(outputs[-1], weights['out']) + biases['out']

得到結果,定義損失函數和優化函數

如何優化模型?
預測值獲取以後,對比實際的價格,會有一個損失函數。損失函數使用 softmax_cross_entropy_with_logits 來計算預測值和標記值的差,而後用 AdamOptimizer 來優化損失函數優化模型。

pred = RNN(x, weights, biases)
# Define loss and optimizer
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

# Evaluate model
correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

項目開源地址和訓練結果

https://github.com/TensorFlow...

訓練設備:

GeForce GTX 980 Ti

訓練結果:

Iter 998000, Minibatch Loss= 0.730588, Training Accuracy= 0.75000 Optimization Finished!

後續更新發布

http://www.tensorflownews.com/

更新計劃

由於交易平臺提供的歷史交易記錄很是少,因此爲了進一步提升訓練效果,後續要持續的本身保存歷史交易數據或者是找到更好的數據來源。還有一個方面是,模型訓練完了以後,保存下來,後續能夠直接使用。還有針對模型自己還能夠作必定的優化,如今只是預測,漲,跌,維持,後續能夠進行更加精細的評分,按照歷史數據進行回測等等。模型持久化,訓練數據集持久化,測試數據集。

相關文章
相關標籤/搜索