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/
由于交易平台提供的历史交易记录很是少,因此为了进一步提升训练效果,后续要持续的本身保存历史交易数据或者是找到更好的数据来源。还有一个方面是,模型训练完了以后,保存下来,后续能够直接使用。还有针对模型自己还能够作必定的优化,如今只是预测,涨,跌,维持,后续能够进行更加精细的评分,按照历史数据进行回测等等。模型持久化,训练数据集持久化,测试数据集。