文档章节

TensorFlow-Bitcoin-Robot:一个基于 TensorFlow LSTM 模型的 Bitcoin 价格预测机器人。

f
 feiwang
发布于 2017/08/17 17:33
字数 1250
阅读 110
收藏 0

简介

TensorFlow-Bitcoin-Robot:一个基于 TensorFlow LSTM 模型的 Bitcoin 价格预测机器人。

文章包括一下几个部分: 1.为什么要尝试做这个项目? 2.为什么选取了这个模型? 3.模型的数据从哪里来? 4.模型的优化过程? 5.项目可以进一步提升的方向。

对于以比特币为首的数字货币近期的表现,只能用疯狂来形容。来自比特币交易平台的最新价格行情显示,就在此前一天,比特币盘中最高价格达到29838.5元,距离3万元大关仅有咫尺之遥。比特币最近火热的行情,吸引了众多的关注,还有一个人工智能似乎无所不能,那么问题来了,能否用人工智能来进行比特币交易呢?

使用什么模型来进行价格预测?现在热门的 深度神经网络,卷积神经网络,循环神经网络,因为卷积神经网络更适合处理图片,循环神经网络比较适合处理序列化内容,尤其是 LSTM 是 RNN 的升级版。

LSTM(Long Short-Term Memory)是长短期记忆网络,是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。LSTM 已经在科技领域有了多种应用。基于 LSTM 的系统可以学习翻译语言、控制机器人、图像分析、文档摘要、语音识别图像识别、手写识别、控制聊天机器人、预测疾病、点击率和股票、合成音乐等等任务。比特币的成交记录就是事件序列上的加个数据,可以基于过去的成交记录序列来对未来的价格作出预测,和 LSTM 的模型比较合适。接下来的价格可以作为预测结果。

数据集

新的问题来了,数据从哪里来? 需要的数据是一个包含成交价格的序列,然后可以截取一部分作为输入值,接下来的一部分作为预测值。后来找了一下,主流的交易平台都提供了部分历史数据,但都不是很多。最后采用了 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/TensorFlowNews/TensorFlow-Bitcoin-Robot/

训练设备:

GeForce GTX 980 Ti

训练结果:

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

后续更新发布

http://www.tensorflownews.com/

更新计划

因为交易平台提供的历史交易记录非常少,所以为了进一步提高训练效果,后续要持续的自己保存历史交易数据或者是找到更好的数据来源。还有一个方面是,模型训练完了之后,保存下来,后续可以直接使用。还有针对模型本身还可以做一定的优化,现在只是预测,涨,跌,维持,后续可以进行更加精细的评分,按照历史数据进行回测等等。 模型持久化,训练数据集持久化,测试数据集。

© 著作权归作者所有

共有 人打赏支持
f
粉丝 2
博文 10
码字总数 6605
作品 2
广州
私信 提问
最危险的开源项目——比特币

一时间,关于比特币的信息充斥着互联网的各个角落,11月19日上午,比特币的价格又如同做了次过山车,最高触及900美元的高价,然后在30分钟内跌到 了650美元,但这仍然比18日的最高价569美元上...

oschina
2013/11/20
13.4K
81
比特币最全暴跌暴涨史:暴跌之后暴涨更猛,历史会重演吗?

最近币圈很“红”,每天打开交易所软件,看到的都是一片刺目的血红。这颜色代表着每天数十亿甚至数百亿的财富蒸发,无数投资人的资金打了水漂。 以比特币为例,比特币的价格在17年12月达到最...

区势传媒
08/15
0
0
比特币未来价格走势预测,4年后能超一百万吗?

老韭菜的忠言逆耳 不得不感叹人性的贪婪和欲望真的是不容易满足的。我曾经也是个小韭菜,也介绍了不少韭菜朋友入坑。在传统行业做理财有百分之十每年的收益就应已经高兴地不得了,在股市一天...

jackiehoo
07/23
0
0
比特币现金今日价格_比特币现金价格_今日比特币现金价格_06.12

--目前已经严重跌破了ma360年线,比特币选择了向下的趋势,所以这种情况下我们应该逢反弹减仓。 影响价格的因素,也开始变得不再单一,而是多项因素的综合叠加。政治、监管、安全,都可能变成...

lpy411
06/12
0
0
比特币、股票价格是否有关联性?是,也不是

雷锋网按:本文翻译自cointelegraph,主要聚焦于本月比特币与全球股市接连暴跌事件,研究两个市场的相关性。本文不包含投资建议,每次投资和交易都伴随着风险,读者在决定前需要自行研究。 ...

Smiletalker
02/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一、什么是ActiveMQ

首先我们应该先了解J2EE中的一个重要规范:JMS(The Java Message Service)Java消息服务。而JMS的客户端之间可以通过JMS服务进行异步的消息传输。它主要有两种模型:点对点和发布订阅模型。 ...

watermelon11
5分钟前
0
0
课时17 第三课Spark内部原理剖析与源码阅读(五)

为何spark shuffle比mapreduce shuffle慢? 主要是spark shuffle的shuffle read阶段还不够优秀,它是基于hashmap实现的,shuffle read会把shuffel write阶段已经排序数据给重新转成乱序的,转...

刀锋
21分钟前
0
0
Function函数式接口

Function函数式接口传入一个参数,返回一个值。 然后我们使用这个写个demo看看: 输出: 接口内部还有两个default方法和一个static方法,然后我们先看一下static方法 返回一个始终返回其输入...

woshixin
36分钟前
1
0
开发者和架构师之间最大的区别是什么?

1、开发者和架构师之间最大的区别是什么? 架构师和开发者一样,也经常写代码,简单的说,开发者和架构师之间最大的区别就是技术领导力。 软件架构师的角色需要理解最重要的架构驱动力是什么...

James-
今天
2
0
java框架学习日志-4

补充一些spring配置文件的方法。 设置别名: <!--通过name直接设置别名--> <bean name="user2" class="cn.sxt.factory.UserDynamicFactory"> </bean> <!--有id的情况下也可以设置......

白话
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部