Python部落(python.freelycode.com)组织翻译。禁止转载。欢迎转发。
如果要数2017年最荒诞的三大流行趋势,那一定是指顶、人工智能和数字加密货币。玩笑归玩笑,加密货币的基本概念确实令人印象深刻。我个人非常看好这项颠覆性技术的长期前景。忘了指尖陀螺吧。事实上,我没有任何秘密硬币。但即使我没有去月球的票,至少我可以通过成功预测秘密硬币的价格来参与这场盛大的派对。
我原以为深度学习和秘密金钱的结合是一个全新的概念,但是在研究的过程中,我发现已经有人提出了一个非常相似的概念。但是,那篇文章只提到了比特币,我在这里也会谈到以太坊。而且以太坊明显优于比特币,所以我这个肯定比那个好:P
我们将使用LSTM(长短期记忆)模型,这是一种深度学习模型,主要适用于时间序列数据。如果你真的想了解它的底层理论,我推荐你去读这些博客[1]、[2]和这篇论文[3]。我恬不知耻地想在这里吸引更多非机器学习的人,所以我会保持代码最少。如果你想自己摆弄这些数据或者模型,我这里有Jupyter(Python)的笔记[4]。废话少说,我们开始吧!
数据
在建立模型之前,我们必须先获得一些数据。Kaggle上有一组过去几年比特币每分钟价格的数据集。但是在这样的时间线上,噪音会埋没有用的信号,所以我们只能选择日线价格。但问题是我们没有足够的数据。在深度学习中,没有模型可以弥补数据的不足。而且,我不想依赖静态的数据文件,因为如果以后有新的数据,更新模型会很复杂。总的来说,我们仍然从网站和API中获取数据。
因为我们打算使用一个模型来预测多个秘密硬币的价格,所以我们的数据最好是从同一个数据源获得的。这里我们使用coinmarketcap.com的数据。目前我们只考虑比特币和以太坊,但是用同样的方法添加其他秘密币很容易。在介绍数据之前,我们先加载几个Python库,这样后续的工作会轻松很多。
解释一下刚刚发生的事情。我们加载了一些Python库,然后在网站上添加了表格数据。在做了一些数据清理后,我们得到了上表。以太坊的话,把链接里的‘比特币’换成‘以太坊’就行了。
为了证明数据的准确性,我们可以做一个这两种秘币的价格和成交量随时间变化的曲线图。
训练集、测试集和随机游走。
现在我们有了一些数据,我们需要开始建立模型。在深度学习中,数据集一般分为训练集和测试集。先用训练集训练模型,再用未知测试集评估模型。在时间序列模型中,我们通常使用一段时间的数据集进行训练,然后使用另一段时间的数据进行测试。这里我随机选取2017年6月1日作为分割线,前面的数据作为训练数据,后面的数据作为测试数据。
可以看到培训期的价格相对便宜。在这种情况下,定型数据可能不代表测试数据,从而降低了模型预测未知数据的能力。在使用深度学习模型之前,我们先用一个简单的模型。最基本的模型是把明天的价格定为等于今天的价格。我们暂时称之为滞后模型。定义这个模型的数学公式是:pred价格(t)=实际价格(t1)。
由于股票价格往往被视为随机游走,我们用它来扩展基本延迟模型,其数学公式定义为:pred price (t)=实际价格(t1),n (,)。
我们从训练集计算和,然后将随机游走模型应用于比特币和以太坊的测试集。
哇!看预测线。除了少数转折点,这两种货币的预测都非常接近实际价格。甚至7月中旬和8月底以太坊的崛起都是被它预测到的。届时,如果我发起一个自己的令牌,相信ICO会有大丰收。正如我在另一篇博客中指出的,一个只预测下一步的模型的准确性是具有欺骗性的,因为它不会把错误的信息带入下一次预测。无论误差有多大,最终都会在每一点重置,就像真实价格一样。比特币的随机游走特别具有欺骗性,因为Y轴的幅度很大,使得预测线显得很平滑。
遗憾的是,在评估时间序列模型时,单点预测其实很常见。稍微好一点的方法是通过多点预测来衡量精度。在这种情况下,前一次预测的误差不会在下一点立即重置,而是会被吸收到下一次预测中。这样,坏典型会受到更严厉的惩罚。数学公式为:predprice (t)=predprice (t1),n (,) predprice (0)=price (0)。
模型预测对随机种子选择极其敏感。我选择了一个非常接近整个随机漫步和以太坊数据的模型。在Jupyter notebook中,您可以交互式地选择种子的值,以查看模型有多糟糕。
请注意,在单个点上的随机行走看起来总是准确的,尽管它背后没有什么实质性的东西。我希望你能对任何博客中声称的准确预测多一点警惕。不过,这种担心可能是多余的,因为比起秘币对粉丝眼花缭乱的营销推广的诱惑力,这根本不算什么。
LSTM
我之前说过,如果你对LSTM背后的理论感兴趣,我推荐你去读[5]、[6]和[7]。幸运的是,我们不需要从头开始构建模型行,甚至不需要理解它。很多库中已经包含了各种深度学习算法的标准实现,比如TensorFlow、Keras、PyTorch等等。我选择Keras是因为我发现它对非专业人士来说最直观。如果对Keras不熟悉,可以参考我之前的教程。
我创建了一个名为Model_data的新数据框架。而且我之前的一些栏目,比如开盘价、日最高价、最低价都去掉了,做了一些新的栏目。Close_off_high是收盘价和最高价之差的表示,-1和1分别代表当天的最低价和最高价。波动率栏是最高价减去最低价除以开盘价。你可能已经注意到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代表表的个数。此函数还包含更一般的神经网络功能,如退出和激活函数。现在,我们只需要指定LSTM层中神经元的数量。我选20,这样运行时间可以合理,然后模型训练的输入数据。
epoch 50/506s-亏损:0.0625我们建立了一个LSTM模型,可以预测明天以太坊的收盘价。让我们拭目以待它的表现。我们先来看看它在训练集中的表现。下面的数字是对训练集进行50次迭代后模型的平均绝对误差(mae)。我们模型的输出是每日收盘价,而不是相对变化。
对于它的准确性,我们不必过于惊讶。该模型能够找到误差源并自动调整。其实要做到零误差并不难。我们可以得到数百个神经元,迭代数千次。这个过程是过拟合的,本质上是预测噪声。我们应该更加关注它在测试集上的表现,因为这是模型的新数据。
除了单点预测的误导,我们的LSTM模型似乎对这些前所未有的数据表现良好。最明显的缺陷是未能预测到6月中旬和10月以太坊价格的突然上涨。其实这是一个固有的问题,只是在这些尖峰中表现的比较明显。预测价格基本上就像真实价格向后移动了一天。更重要的是,该模型似乎系统性地高估了以太坊的价值。基本上,预测线总是在实际价格线之上。我猜是因为训练集时期的数据以太坊增长太过剧烈,所以模型认为这种趋势还会继续。我们可以为比特币建立一个类似的LSTM模型,测试集上的预测数据如下图所示。
正如我前面提到的,单点预测是有欺骗性的。仔细观察,你会发现预测数据基本上是之前数据的镜像。我们很酷的深度学习LSTM模型已经部分复制了一个自回归模型。数学公式为:pred price(t)=0 1 price(t1)…PP price(TP)(t),(t) n (0,)。
好消息是,自回归模型经常用于顺序任务,这表明LSTM模型的方向是可靠的。坏消息是,这是对LSTM能力的浪费。我们可以花更少的时间,建立一个简单得多的自回归模型,也可以得到类似的结果。更复杂不代表更准确。
可以看出,这里的结果比单点预测差。无论如何,我对模型的一些微妙行为感到满意。它并不是简单地预测价格会朝着同一个方向移动。所以还是有值得乐观的地方。
回到单点预测,我们的深度神经模型看起来还可以,但是简单的随机游走结果也不差。像随机漫步模型一样,LSTM模型对随机种子的选择很敏感。所以如果我们想比较这两个模型,我们会将每个模型运行几次,以估计模型的误差。该误差通过测试集上的实际收盘价和预测收盘价之间的差异来计算。
也许AI的炒作是值得的!这些图显示了两个模型在25种不同初始值下的误差。LSTM模型在比特币和以太坊的平均误差分别为0.04和0.05,碾压随机游走模型。
以战胜随机游走为目标太低了。将LSTM与其他时间序列模型进行比较会更有趣。另一方面,改进我们的LSTM模型也不是太难,比如逐步增加更多的层次和神经元,改变每批数据的大小,学习速度等。但是,我希望你能意识到我对使用深度学习预测秘密硬币价格的疑虑。因为我们忽略了最好的框架:人类智能。显然,预测秘密货币的完美“模型”是它将永远上涨。
摘要
我们收集了一些秘密的硬币数据,然后将它们馈送给我们很酷的深度机器学习模型LSTM。可惜预测的结果和简单延长前的价格相差不大。怎样才能让模型学习更复杂的行为?
1.改变损失函数。平均误差不鼓励冒险。有了平均误差方差,LSTM模型将更加关注尖峰和低谷。
2.保守自回归类的模型惩罚。这将刺激深度学习算法探索更冒险和有趣的模型。但是说起来容易做起来难。
3.获得更多更好的数据。如果仅仅依靠过去的价格还不能很好的预测未来的价格,我们就需要加入其他的特征,让这种预测能力更加强大。通过这种方式,LSTM模型将不会如此依赖于过去的数据,并且可能能够解开更复杂的行为。这可能是最好也是最难的解决方案。
以上是正面的解读,负面的解读是,其实没有模型可以预测秘币的价格,不管你的水平有多深。比如看看2016年的比特币,2017年底的比特币疯狂。任何基于2016年数据的模型都无法预测到2017年的变化。所以我建议你用自回归模型,可以节省很多时间。
但是我相信深度学习在某个地方是可以有用的。同时,你可以在这里下载Python代码[8]并训练你自己的LSTM模型。感谢阅读!
[4]:https://github . com/dashee 87/blog scripts/blob/master/Jupyter/2017-11-20-predicting-crypto currency-prices-with-deep-learning . ipynb
[8]:https://github . com/dashee 87/blog scripts/blob/master/Jupyter/2017-11-20-predicting-crypto currency-prices-with-deep-learning . ipynb
中文:https://dashee87.github.io/deep学习/python/预测-加密货币-价格-深度学习/译者:桂金濠