用深度学习预测比特币价格

2017 年 12 月 23 日 Python程序员

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

如果要数2017年三个最荒诞的流行时尚,那一定非指尖陀螺,人工智能和数字加密货币(译者注:以下统称密币)莫属了。玩笑归玩笑,密币的底层概念确实是让人印象非常深刻,我个人对这种颠覆性的技术的长期前景是非常看好的。指尖陀螺就算了吧。其实我自己是没有持有任何密币的。但是,即使我没有登月的船票,至少我还能通过成功预测密币的价格来参与到这场盛大的派对。

我原以为结合深度学习和密币是一种全新的概念,但是研究过程中我发现原来已经有人提出了很相似的概念。不过那篇文章只提到了比特币,我这里还会涉及到以太币。而且以太币明显是要优于比特币的,所以我这篇肯定要比那篇更好了:P

我们会用到LSTM(Long Short Term Memory)模型,它是深度学习模型的一种,主要适用于时间序列数据。如果你真的想要理解它的底层的理论,我推荐你去读这些博客[1],[2]和这篇论文[3]。这里我无耻地想要吸引更多的非机器学习群众,所以我会让代码保持最简。如果你想要自己动手玩玩这些数据或者模型,我有一个Jupyter(Python)的笔记在这里[4]。废话少说,我们开始吧!


数据

在构建模型之前,我们得先去获取一些数据。在Kaggle上有比特币过去几年里每分钟价格的数据集。但是在这样的时间轴上,噪声会淹埋有用的信号,所以我们只能选择每天的价格。但是这样带来的问题是我们没有足够的数据。在深度学习里,没有什么模型能够弥补数据量的不足。而且我也不希望依赖于静态的数据文件,因为这样的话以后有了新的数据,想要更新模型就会非常复杂。综合考虑,我们还是从网站和API里拉取数据。

因为我们打算用用一个模型预测多重密币的价格,所以最好我们的数据是从同一个数据源获取的。这里我们使用coinmarketcap.com的数据。目前,我们只考虑比特币和以太币,但是用同样的方法,要把其它的密币加进来也是很容易的。在引入数据之前,让我们先加载几个Python库,这会让后续的工作轻松许多。

解释一下刚刚发生了什么,我们加载了一些Python库,然后加入了网站上的表格数据,做了一些数据清洗之后,就得到了如上表格。对于以太币,只用将链接里的"bitcoin"替换成"ethereum"就可以了。

为了证明数据是准确的,我们可以作出这两种密币的价格和成交量随时间变化的图。

训练集,测试集以及随机漫步

我们有了一些数据,现在需要开始搭建模型了。在深度学习里,一般将数据集分为训练集和测试集。先用训练集来训练模型,然后用没有见过的测试集来评估模型。在时间序列模型里,我们通常用一段时间的数据集来训练,然后用另外一段时间的数据来测试。这里,我就随意地选取2017年六月一号作为分界线,之前的数据作为训练数据,之后的数据作为测试数据。

你可以看到训练期的价格相对便宜。这样的话,训练数据可能就不能代表测试数据,从而降低了模型预测未知数据的能力。在用深度学习模型之前,我们先用一种简单的模型。最基本的模型是把明天的价格跟今天的价格设为相等,我们暂且叫它延迟模型(lag model)。用数学公式来定义这个模型就是:PredPrice(t)=ActualPrice(t−1)。

因为股票价格经常被认为是一种随机漫步,所以我们就用它来扩展基本的延迟模型,用数学公式来定义就是:PredPrice(t)=ActualPrice(t−1)∗ϵ,ϵ∼N(μ,σ)。

我们从训练集中推算出μ和σ,然后将随机漫步模型用到比特币和以太坊的测试集上。

哇!看看这预测的线条。除了少数几个转折点,对这两种币它的预测都跟实际价格很接近。甚至以太坊在七月中旬和八月底的上涨都被它预测到了。在那个时候,如果我发起一个我自己的代币,相信ICO一定会大丰收。就像我在另一篇博客里指出的,只预测未来一步的模型的精准度是有欺骗性的,因为它不会将错误信息带入到接下来的预测。不管错误多大,最终在每一点上都会被重置,就跟真正的价格差不多。比特币的随机漫步尤其具有欺骗性,因为y轴的范围很大,使得预测线显得很平滑。

不幸的是,在评估时间序列模型的时候,单点预测其实是很普遍的。稍微好一点的方法是用多点预测来衡量精确性。那样的话,之前预测的错误不会在下一点马上被重置,而是会被吸收到接下来的预测中。这样,坏的模型受到的惩罚会更重。用数学公式来表示就是:PredPrice(t)=PredPrice(t−1)∗ϵ,ϵ∼N(μ,σ) & PredPrice(0)=Price(0)。

模型预测对随机的种子的选择极为敏感。我选择了一个跟全程随机漫步跟以太坊数据非常接近的模型。在Jupyter notebook里,你可以交互式的选择种子的值,看看模型可以烂到什么程度。

注意单点随机漫步总是看上去很精确,虽然这背后没什么实质的东西。希望你对任何博客里宣称准确的预测多一点警惕。不过这种担心可能是多余的,因为比起密币炫目的市场宣传对粉丝的诱惑力,这根本不算什么。

LSTM

我之前说过,如果你对LSTM背后的理论感兴趣,我推荐你去读[5], [6]和[7]。幸运的是,我们不需要从头开始构建模型行,甚至都不用理解它。有许多的库已经包含了各种深度学习算法的标准实现,比如TensorFlow,Keras,PyTorch等等。我选择Keras,因为我发现它对于非专业人员最直观。如果你对Keras不熟,可以参考我之前的教程。

model_data.head()

我创建了一个新的数据帧叫做model_data。而且我之前的一些列,如开盘价,每日最高价和最低价等去掉了,同时制定了一些新的列。close_off_high是收盘价和最高价的差的一种表示,-1和1分别代表当日最低价和最高价。volatility列就是最高价减去最低价除以开盘价。你可能注意到了,model_data是从前到后排列的。这样我们其实就不需要日期了,因为模型并不需要输入日期。

对于两种密币,我们的LSTM模型都是用之前一段时间的数据来预测下一天的收盘价。我们需要决定用之前多少天的数据,这里,我就选10天了,没什么道理,就是选个整数。然后我们创建一系列连续10天的数据窗口,第一个是0到第9天,第二个是第1天到第10天,以此类推。选择的时间窗口越短,我们就能给模型喂的数据越多,但是不好的是这样模型就没有足够的信息来探测到复杂的长期行为,如果它们存在的话。

深度学习模型不喜欢大范围变化的输入数据。我们的数据里,有些值在-1到1之间,有些则是百万级别。我们需要给这些数据转化到差不多的量级。一般做法是让值在-1到1之间。off_high和volatility列都还好。其它的列,我们都要做一些转换处理。

这个表就是我们的LSTM模型的输入的一个样本了,我们会有几百个类似的表。对于有些列,我们将它们的第一个时间点的值设为0,然后我们的目标就是预测跟这个时间点的相对变化价格。现在我们就准备好开始创建我们的LSTM模型了。用Keras其实这一步非常简单,就是一步一步往模型上套。

这样,build_model函数就构建了一个空的模型,没有想象力的被称为model,并且LSTM层已经加上了。这一层接收我们的输入,n*m个表格,n代表时间点的个数,m代表表格数。这个函数还包含了更多的通用神经网络特征,如dropout和activation functions。现在,我们只需要指定LSTM层的神经元数,我选20,这样运行时间能比较合理,然后是模型训练的输入数据。

Epoch 50/50
6s - loss: 0.0625

我们已经建立好了一个可以预测明天的以太坊收盘价的LSTM模型了。让我们对它的表现拭目以待。我们先检查一下它在训练集上的表现。代码下方的数字是在训练集上50次迭代之后的模型平均绝对误差(mae)。我们模型的输出是每天收盘价而非相对变化量。

对于它的精确程度我们不必太吃惊。模型能够找到误差的源头并且自动调整。事实上,就算要达到零误差也不是难事。我们可以弄几百个神经元,迭代个几千次。这个过程就是过拟合,本质上是在预测噪音。我们更应该关注的是它在测试集上的表现,因为这个对于模型是新的数据。

不算单点预测的误导性的话,我们的LSTM模型看上去在这些没有见过的数据上表现的也很好。最明显的一个缺陷是它没有预测到以太坊价格在六月中旬和十月的突然上涨。事实上这是一个固有的问题,只是在这些尖刺上表现得更明显。预测的价格基本上就像是真实价格向后移动了一天。更重要的是,模型似乎系统性地对以太坊的价值高估,基本上预测线一直是在实际价格线的上方。我猜测是因为训练集时期的数据以太坊增长的太过惊人,所以模型认为这种趋势会持续。我们可以对比特币也建立一个类似的LSTM模型,测试集上的预测数据在下图中描绘出来了。

前面我已经提到,单点预测是有欺骗性的。更近距离的看,你会发现预测数据基本上就是之前数据的镜像。我们炫酷的深度学习LSTM模型已经部分重现了一个自回归模型。用数学公式来表示就是:PredPrice(t)=ϕ0+ϕ1∗Price(t−1)+…+ϕp∗Price(t−p)+ϵ(t), ϵ(t)∼N(0,σ)。

好消息是自回归模型经常被用于时序任务,说明LSTM模型的方向是靠谱的。坏消息是这是浪费LSTM的能力,我们可以花更少的时间,建一个简单的多的自回归模型,也能达到差不多的效果。更复杂并不意味着就更精确。

可以看出来对比单点预测这里的结果要差一些。无论如何,我对模型体现出的一些细微的行为还是很高兴的,它没有简单的预测价格一致的向同一个方向移动。所以还是有一些可以乐观的地方。

回到单点预测,我们的深度神经模型看上去还行,但是简单的随机漫步结果也不差。跟随机漫步模型一样,LSTM模型也会对随机种子的选择敏感。所以如果我们想要比较这两种模型,我们会在每个模型上运行多次,来估算模型的误差。这个误差用实际收盘价和预测的收盘价在测试集上的差来计算。

也许AI的炒作是值得的!这些图表现了两个模型在25个不同的初始值下的误差。LSTM模型在比特币和以太坊中平均误差分别是0.04和0.05,碾压随机漫步模型。

以打败随机漫步为目标太low了。拿LSTM和其它的时序模型来比较会更有意思。另外一方面,要改进我们的LSTM模型也不是太难,比如逐渐增加更多的层次和神经元,改变每一批数据的规模大小,学习速度等。不过,希望你能觉察到我对用深度学习预测密币的价格的一些怀疑。因为我们忽略了最好的框架:人类智能。显然,预测密币的完美『模型』是:它会永远上涨。

总结

我们收集了一些密币数据,然后将它们喂给了我们超酷的深度机器学习模型LSTM。不幸的是,预测的结果跟简单地延伸之前的的价格没有多大区别。我们如何能让模型学习更复杂的行为呢?
1. 改变损失函数。平均绝对误差(MAE)不鼓励冒险。而用平均误差方差,LSTM模型就会对尖刺和波谷更看重。
2. 对保守的自回归类的模型惩罚。这样会刺激深度学习算法去探索更冒险,更有趣的模型。但是说比做容易。
3. 得到更多,更好的数据。如果单纯的用过去的价格不能够很好的预测将来的价格,我们就需要加入其他的特征,让这种预测能力更加强大。这样的话,LSTM模型就不会对过去的数据如此依赖,可能能解锁更复杂的行为。这可能是最好也是最难的解决方案。

以上是正面的解读,负面的解读是密币的价格其实根本没有模型可以预测,不管你的层次有多深。就比如看2016年的比特币和2017年年末比特币的疯狂。任何建立在2016年数据上的模型都不可能预测到2017年的变化。所以建议你就用自回归模型吧,能省不少时间呢。

但是我相信深度学习一定能够在某写地方有用。同时,你可以在这里[8]下载Python代码,训练你自己的LSTM模型。谢谢阅读!

[1]: http://colah.github.io/posts/2015-08-Understanding-LSTMs/
[2]: http://blog.echen.me/2017/05/30/exploring-lstms/
[3]: http://www.bioinf.jku.at/publications/older/2604.pdf
[4]: https://github.com/dashee87/blogScripts/blob/master/Jupyter/2017-11-20-predicting-cryptocurrency-prices-with-deep-learning.ipynb
[5]: http://colah.github.io/posts/2015-08-Understanding-LSTMs/
[6]: http://blog.echen.me/2017/05/30/exploring-lstms/
[7]: http://www.bioinf.jku.at/publications/older/2604.pdf
[8]: https://github.com/dashee87/blogScripts/blob/master/Jupyter/2017-11-20-predicting-cryptocurrency-prices-with-deep-learning.ipynb

英文原文:https://dashee87.github.io/deep%20learning/python/predicting-cryptocurrency-prices-with-deep-learning/
译者:桂浩晋


登录查看更多
11

相关内容

在数学中,随机漫步是一种数学对象,称为随机过程或随机过程,它描述的路径由在某些数学空间(例如整数)上的一系列随机步骤组成。随机行走等是指基于过去的表现,无法预测将来的发展步骤和方向。核心概念是指任何无规则行走者所带的守恒量都各自对应着一个扩散运输定律 ,接近于布朗运动,是布朗运动理想的数学状态,现阶段主要应用于互联网链接分析及金融股票市场中。
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
255+阅读 · 2020年6月10日
专知会员服务
165+阅读 · 2020年6月4日
一份循环神经网络RNNs简明教程,37页ppt
专知会员服务
168+阅读 · 2020年5月6日
【复旦大学-SP2020】NLP语言模型隐私泄漏风险
专知会员服务
24+阅读 · 2020年4月20日
【资源】100+本免费数据科学书
专知会员服务
105+阅读 · 2020年3月17日
【MIT深度学习课程】深度序列建模,Deep Sequence Modeling
专知会员服务
76+阅读 · 2020年2月3日
【模型泛化教程】标签平滑与Keras, TensorFlow,和深度学习
专知会员服务
20+阅读 · 2019年12月31日
金融时序预测中的深度学习方法:2005到2019
专知会员服务
165+阅读 · 2019年12月4日
25年,110个经典财务欺诈案例,都在这儿了
虎嗅网
70+阅读 · 2019年8月19日
2019年深度学习的十大预测
人工智能学家
6+阅读 · 2019年1月31日
手把手教你用Python库Keras做预测(附代码)
数据派THU
14+阅读 · 2018年5月30日
LSTM模型预测效果惊人的好,深度学习做股票预测靠谱吗?
数据挖掘入门与实战
6+阅读 · 2018年1月3日
自创数据集,用TensorFlow预测股票教程 !(附代码)
如何用TensorFlow预测时间序列:TFTS库详细教程
人工智能头条
9+阅读 · 2017年8月30日
如何用Python做舆情时间序列可视化?
CocoaChina
10+阅读 · 2017年7月21日
Arxiv
19+阅读 · 2019年11月23日
Adaptive Neural Trees
Arxiv
4+阅读 · 2018年12月10日
Physical Primitive Decomposition
Arxiv
4+阅读 · 2018年9月13日
Arxiv
3+阅读 · 2018年3月27日
Arxiv
5+阅读 · 2015年9月14日
VIP会员
相关VIP内容
相关资讯
25年,110个经典财务欺诈案例,都在这儿了
虎嗅网
70+阅读 · 2019年8月19日
2019年深度学习的十大预测
人工智能学家
6+阅读 · 2019年1月31日
手把手教你用Python库Keras做预测(附代码)
数据派THU
14+阅读 · 2018年5月30日
LSTM模型预测效果惊人的好,深度学习做股票预测靠谱吗?
数据挖掘入门与实战
6+阅读 · 2018年1月3日
自创数据集,用TensorFlow预测股票教程 !(附代码)
如何用TensorFlow预测时间序列:TFTS库详细教程
人工智能头条
9+阅读 · 2017年8月30日
如何用Python做舆情时间序列可视化?
CocoaChina
10+阅读 · 2017年7月21日
Top
微信扫码咨询专知VIP会员