摘要:通过实际操作,作者利用循环神经网络对比特币和以太坊的价格进行了预测。
2017年是人工智能和加密货币的重要一年,我们见证了许多新的研究进展和突破。毫无疑问,人工智能是当今乃至未来很长一段时间内最显著的技术之一。加密货币在这一年的流行程度出乎意料。这是一个加密货币的大牛市,加密货币(如比特币、以太坊、莱特币、波纹币等)的投资回报率。)都快疯了。
我从2017年初就开始深入研究机器学习的相关技术。和其他机器学习专家和爱好者一样,我也认为将这些技术应用到加密货币市场是非常有吸引力的。通过各种方法将机器学习和深度学习中的模型应用到证券市场或加密货币市场的研究中是非常有趣的。
我认为建立单点预测模型来探索深度学习在时间序列数据(如证券价格数据)中的应用是一个很好的方法。当然,这只是开始,还有很大的提升空间。我目前正在尝试使用深度强化学习进行程序化交易。然而,学会使用长短期记忆网络(step长短期记忆)并建立一个良好的预测模型是第一步。
前提条件和开发环境在开始下面的内容之前,你可能需要掌握Python的基本编程技巧,机器学习的基础知识,尤其是深度学习的相关知识。如果你没有这方面的知识,建议你先浏览一下这篇文章。
我选择的开发环境是Google的Colab。因为它的环境操作简单,有免费的GPU资源,对训练时间很有帮助。这里有一个
如何在Google Cloud中设置和使用Colab的教程。你也可以在GitHub上找到我自己关于Colab的笔记。
如果你想使用AWS环境,我还写了一个教程,教你如何使用Docker在GPU上设置AWS实例。这是教程的链接。
什么是递归神经网络(RNN)?为了解释递归神经网络,我们来看一个简单的例子,它是一个只有一个隐层的感知器网络。这样的网络可以胜任简单的分类问题。通过添加更多的隐藏层,网络将能够推断出更复杂的数据模式,并提高预测的准确性。然而,这种类型的网络只能很好地对时间序列无关的数据进行分类。比如训练中前一个样本的图像分类,不会影响下一个样本的分析。换句话说,感知机没有记忆。专门为图像识别设计的卷积神经网络也是如此。
具有一个隐藏层和两个输出的简单感知器神经网络
循环神经网络用于解决数据与时间序列相关的问题。它将前一个隐藏状态的输出循环输入到感知器中,并作为当前输入进入网络进行处理。
具体来说,每次向网络输入新样本时,网络都没有能力记住上一步处理的数据。解决时间序列相关数据处理问题的一个方法是将上一步和当前步的输入样本输入到网络中,这样我们的网络就可以知道之前发生了什么。但是,这种方法还是无法知道之前发生的一切。这样我们就想到了一个比较好的方法,就是把之前得到的隐层结果(隐层的权重矩阵)作为当前的输入样本反馈给网络。
我把隐层的权重矩阵看成是神经网络思维过程的一种状态,这样隐层就把上一步神经元中的数据以权重分布的形式记忆下来了。下图是循环神经网络的处理过程。
当Xt进入时,来自Xt-1的隐藏状态将与Xt一起成为t时刻的输入,进入网络。将按时间顺序对每个样品重复这一过程。
以上是对循环神经网络原理的介绍。这里有一些关于递归神经网络的其他资源,我强烈建议您阅读它们:
RNNs介绍(循环神经网络介绍)
初学者的递归神经网络(递归神经网络介绍)
递归神经网络(有效循环神经网络)的非理性有效性
什么是长期和短期记忆网络(LSTM)在我们开始了解LSTM之前,我们先来看看循环神经网络的最大问题。到目前为止,神经网络的训练看起来不错,直到它涉及到反向传播。随着我们训练样本的梯度在网络中的反向传播,它变得越来越弱,直到它们到达那些更老的数据点,它才能被正确地调整。这是消失梯度。LSTM是一种存储过去重要信息的递归神经网络。这样,当梯度反向传播时,就不会受到不必要信息的干扰。
例如,在阅读一本书时,我们经常会忘记前一章的内容,可能不会记住所有的要点。为了解决这个问题,我们把这些问题的要点摘抄下来,写下来,而忽略掉那些过于详细,与主题关联度不高的内容。克里斯托弗奥拉对LSTM网络的理解深入解释了这一原理。
首先,让我们开始导入所需的库。
史料在这里,我用了www.coinmarketcap.com的史料。当然也可以用其他任何资源,但是我觉得用起来很方便。由此我们可以得到比特币的每日价格数据。我还在Colab notes中加入了关于以太坊价格的代码,这样我的代码就可以在其他加密货币中重用。下面是一个如何获取市场数据的函数。
def get_market_data(market,tag=True):
'''
市场:coinmarketcap.com上拼写的加密货币的全称。例如:“比特币”
标签:例如:“btc”,如果提供它将添加一个标签到每个列的名称。
返回:熊猫数据帧
此功能将使用所提供的硬币/代币页面的coinmarketcap.com URL。
阅读OHLCV和市值。
将日期格式转换为可读格式。
通过将非数字值转换为非常接近0的数字来确保数据的一致性。
最后标记每一列(如果提供的话)。
'''
market _ data=PD . read _ html(' https://coinmarketcap . com/currences/' market
/historical-data/?start=2013 04 28 end=' time . strftime(' % Y % m % d '),flavor='html5lib')[0]
market _ data=market _ data . assign(Date=PD . to _ datetime(market _ data[' Date ']))
market _ data[' Volume ']=(PD . to _ numeric(market _ data[' Volume '],errors=' compete ')。菲尔娜(0))
如果标签:
market _ data . columns=[market _ data . columns[0]][tag ' _ ' I for I in market _ data . columns[1:]]
返回市场_数据
现在,让我们获取比特币数据,并将其加载到变量“btc_data”中,并显示前五行。
btc_data=get_market_data('比特币'tag='btc ')
btc_data.head()
比特币市场数据
我们来看看比特币的收盘价和一段时间内的日交易量。
show_plot(btc_data,tag='BTC ')
数据准备构建任何深度学习模型的很大一部分都是准备数据,这些数据将被神经网络用于训练或预测。这一步称为预处理,根据我们使用的数据类型,它可能包括多个步骤。这里,我们将做以下预处理:
数据清理,填充缺失的数据点
把不同的数据结合起来,把比特币和以太坊的数据放在一个数据框架下。
删除不必要的数据列
根据日期对数据进行升序排序。
分离训练样本和测试样本数据。
创建一个输入样本,并将其标准化为0和1。
创建训练样本和测试样本集的目标输出,并将其标准化为0和1。
将数据转换成Numpy数组供模型使用。
当我们加载数据时,数据清理部分已经完成。在下面的代码中,您可以找到相关的必要功能:
下面是绘制函数和创建日期标签的代码。这里我们将调用上面的函数来创建最终的数据集。
train_set=train_set.drop('Date '1)
现在我们来构建LSTM-RNN模型。在这个模型中,我使用了三层LSTM层,每层512个神经元,每层LSTM之后设置了0.25 的辍学,以防止过拟合。最后是全链接层来进行输出。
def build_model(inputs,output_size,neurons,activ _ func=activation _ func,dropout=dropout,loss=loss,optimizer=optimizer):
'''
输入:以numpy数组的形式输入数据
输出大小:每个输入样本的预测数
神经元:LSTM层中的神经元数量/单位
活动_功能:用于LSTM层和密集层的激活函数
辍学率:辍学率,默认值为0.25
损失:用于计算梯度的损失函数
优化器:反向传播渐变的优化器类型
该功能将建立3层RNN模型,每个LSTM层后带有水滴的LSTM单元
最后是使用克拉斯的顺序模型产生输出的密集层。
返回:Keras顺序模型和模型摘要
'''
模型=顺序()
模型. add(LSTM(神经元,return_sequences=True,input_shape=(inputs.shape[1],inputs.shape[2]),activation=activ_func)
model.add(辍学(辍学))
模型. add(LSTM(神经元,return_sequences=True,activation=activ_func))
model.add(辍学(辍学))
模型. add(LSTM(神经元,激活=activ_func))
model.add(辍学(辍学))
模型。add(密集(单位=输出大小))
模型。添加(激活(activ _ func))
model.compile(loss=loss,optimizer=optimizer,metrics=['mae'])
模型。摘要()
回报模型
张量板导出的张量流计算图
我用坦恩作为激活函数,均方误差作为损失和亚当的作为优化者。你也可以试试不同的设置选项,看看它们如何影响模型的性能。
这是该模型的概述:
我代码的开始部分已经声明了超参数,这样对于不同情况的调参比较方便一点。这是我设的超参数:
现在开始对我们收集的数据进行模型训练
#清理记忆
gc.collect()
#用于再现性的随机种子
随机种子(202)
#初始化模型架构
btc_model=build_model(X_train,output_size=1,neurons=neurons)
#根据数据训练模型
BTC历史=BTC模型。fit(X _ train,Y_train_btc,epochs=epochs,batch_size=batch_size,verbose=1,validation_data=(X_test,Y_test_btc),shuffle=False)
根据你机器的性能,上述代码可能需要一段时间完成。一旦程序运行结束,你的训练模型也就完成了:)
我们来看看比特币和以太币的结果
结果看来还不错:)
这是大卫希恩写的一篇很棒的关于如何使用LSTM进行加密货币价格预测的博客文章。希望你也能像我一样从中收益!
以上为译文。
本文由阿里云云栖社区组织翻译。
文章原标题《How to predict Bitcoin and Ethereum price with RNN-LSTM in Keras》
作者:西亚瓦什法赫米
译者:2012年星期五。