区块链网站|NFTS BTC教学指南 使用循环神经模型预测比特币(BTC)的价格

使用循环神经模型预测比特币(BTC)的价格

广告位

使用循环神经模型预测比特币(BTC)价格

尽管主观观点对于预测加密货币的未来是有价值的,但我们的预测方法从不同的角度处理这个问题,特别是从算法交易的角度。我们只是计划使用数字历史数据来训练一个递归神经网络(RNN)来预测比特币的价格。

获取历史比特币价格我们可能有相当多的资源可以获取历史比特币价格数据。虽然其中一些资源允许用户手动下载CSV文件,但其他资源提供的API可以连接到代码。因为当我们使用时间序列数据来训练模型时,我们希望它做出最新的预测。我更喜欢用API,这样我们在运行程序的时候总能得到最新的数据。我决定使用CoinRanking.com的API,它提供了我们可以使用的最新硬币价格。

递归神经网络因为我们使用时间序列数据集,所以只使用前馈神经网络是不可行的,因为明天的BTC价格与今天的价格最相关,而不是一个月前。

递归神经网络(RNN)是一种人工神经网络,其中节点之间的连接沿着序列形成有向图。

n表示时间序列的时间动态行为,可以利用其内部状态对序列进行处理。实际上,这可以通过LSTM和GRU层来实现。

在这里,你可以看到常规前馈神经网络和递归神经网络(RNN)的区别:

实施步骤为了能够创建一个程序来训练历史BTC价格并预测明天的BTC价格,我们需要完成以下任务:

1-获取、清理和归一化历史BTC价格2-使用LSTM构建RNN3-训练rnn 3并保存训练神经网络模型4-预测明天的BTC价格并将其“反序列化”。其他:反序列化X_Test预测并创建Plot.ly图表。

获取BTC数据如上所述,我们将使用CoinRanking.com的API作为BTC数据集,并使用以下Python代码将其转换为pandas dataframe:

import requests,json,numpy as np,pandas as PD # https://API . coin ranking . com/v1/public/coin/:coin_id/history/:timeframe # https://docs . coin ranking . com/def hist _ price _ dl(coin _ id=1335,timeframe='5y 'currency='USD '):' ' '它接受coin _ id、time frame和currency参数来清除从coinranking.com获取的历史硬币数据,它返回包含所选硬币的日平均值的Pandas系列,日期为base=' currency)coin=json . loads(r . text)[' data '][' history ']#读入JSON并清洗无关部分df=pd。data frame(coin)df[' price ']=PD . to _ numeric(df[' price '])df[' timestamp ']=PD . to _ datetime(df[' timestamp '],unit='ms').dt.date返回df.groupby('timestamp ')。mean()['price']

默认情况下,该函数将根据5年期BTC/美元价格进行调整。但是,您可以通过传入不同的参数值来更改这些值。

用自定义函数清洗数据在获取数据并转换成pandas dataframe后,我们可以定义自定义函数来清洗我们的数据,将其归一化到神经网络,因为这是获得准确结果的必要条件,应用自定义训练来测试分裂。我们创建了一个定制的训练测试分割函数(不是scikit-learn ),因为我们需要保持时序顺序来正确训练我们的RNN。为此,我们可以使用以下Python代码,您可以在以下代码片段中找到更多函数描述:

def price_matrix_creator(data,seq_len=30):' ' '它将序列转换为嵌套列表,其中列表中的每一项都包含30天的历史价格' ' ' ' price _ matrix=[]for index in range(len(data)-seq _ len 1):price _ matrix。append(data[index:seq _ len])返回price _ matrix def normalize _ windows(window _ data):' ' '它对每个值进行标准化,以反映从起点开始的百分比变化' ' ' normalized _ data=[]for window _ data:normalized _ window=[]' ' price _ matrix=NP。array(price _ matrix)# print(price _ matrix。shape)row=int(round(train _ size * len(price _ matrix)))train=price _ matrix[:row,]if shuffle==True:NP。随机的。shuffle(train)X _ train,y_train=train[:row,-1],train[:row,-1]X _ test=price_matrix[row:-1],price_matrix[row:-1]X _ train=NP。形状(X _ train

定义这些函数后,我们可以使用以下计算机编程语言代码调用它们:

#不传递任何参数,因为它们是由defaultser=hist_price_dl()#使用数据框价格矩阵=价格矩阵创建者(ser)创建矩阵#规范化其值以适应RNNprice _ matrix=normalize _ windows(price _ matrix)#应用训练测试拆分,同时返回拆分点row,X_train,y_train,X_test,y _ test=train _ test _ split _(price _ matrix)使用LSTM构建RNN在准备好我们的数据之后,是时候构建我们的机器学习模型了,我们稍后将使用清理和归一化的数据进行训练。我们将从导入克拉斯组件开始,并使用以下计算机编程语言代码设置一些参数:

从keras.models导入序列从keras .层导入LSTM,密集,激活导入时间# LSTM模型参数,我选择batch_size=2 #批处理大小(您可以尝试不同的值)历元=15 #历元(您可以尝试不同的值)seq_len=30 # 30序列数据(表示最近30天)损耗='均方误差' #因为度量为MSE/rms optimizer=' rms prop ' # rnn激活的推荐优化器=' Linear ' #线性激活输入_形状然后,我们将使用以下计算机编程语言代码创建具有两个LSTM和两个稠密的层的连续的模型:

model=Sequential()model . add(LSTM(单位=输出_尺寸,返回_序列=真,输入_形状=输入_形状))model.add(密集(单位=32,激活=激活))model.add(LSTM(单位=输出_尺寸,返回_序列=假))模型。添加(密集(单位=1,激活=激活))模型.编译(优化器=优化器,损失=损失训练RNN并保存训练模型现在是时候用清理过的数据训练我们的机器学习模型了。您还可以测量训练期间所花费的时间。请遵循以下代码:

开始时间=时间。时间()模型。fit(X=X _ train,y=y_train,batch_size=batch_size,epochs=epochs,validation _ split=0.05)end _ time=time。time()处理时间=结束时间-开始时间别忘了保存它:

model.save('coin_predictor.h5 ')预测明天的BTC价格并\”反序化\”它在我们训练模型之后,我们需要获得当前的预测数据,并且由于我们将数据归一化,因此预测也将被归一化。因此,我们需要将其反归一化到其原始值。首先,我们将通过以下代码以相似的、部分不同的方式获取数据:

导入请求,json,numpy作为np,pandas作为pd #我们需要ser,preds,rowser=hist _ price _ dl(time frame=' 30d ')[1:31]price _ matrix=price _ matrix _ creator(ser)X _ test=normalize _ windows(price _ matrix)X _ test=NP。array(X _ test)X _ test=NP。形状(X _ test。shape[0],X_test.shape[1],1))我们将只有预测的标准化数据:没有训练测试拆分。我们还将手动使再成形数据,以便能够在我们保存的模型中使用它。

在清理和准备我们的数据后,我们将加载经过训练的RNN模型进行预测并预测明天的价格。

从keras.models导入load _ model model=load _ model(' coin _ predictor。H5)preds=模型。predict(X _ test,batch_size=2)但是,我们的结果将介于-1和一之间,这没有多大意义。因此,我们需要将它们反归一化回原始值。我们可以通过自定义函数实现这一目标:

def反序列化程序(preds,data,train_size=0.9,train_phase=False):' ' '参数:预测值:要转换回其原始值的预测数据:它会考虑数据,因为归一化是基于完整的历史数据进行的列车尺寸:仅适用于在训练阶段中使用时训练阶段:当进行训练测试分割时,应将其设置为没错,以便根据火车_大小参数计算分界点(排),否则分馏点被设置为0返回:反序列化的预测值、原始真值和用于绘图的日期值的列表' ' ' ' price _ matrix=NP。array(price _ matrix _ creator(ser))if train _ phase:row=int(round(train _ size * len(price _ matrix)))else:row=0 date=ser。index[row 29:]date=NP。shape[0]))X _ test=price _ matrix[row:-1] y_test=price_matrix[row:-1]pred

定义自定义函数后,我们将调用这些函数并使用以下代码提取明天的BTC价格:

final_pred=deserializer(preds,ser,train_size=0.9,train _ phase=False)final _ pred[1][0]使用上面的计算机编程语言代码,您实际上可以获得机器学习模型对明天BTC价格的预测。

反序列化x _测试预测并创建Plot.ly图表您可能还对RNN模型的整体结果感兴趣,并希望将其视为图表。我们也可以通过使用本教程训练部分的x _测试数据来实现这些目标。

我们将首先加载我们的神经网络模型(将其视为单个预测案例的替代方案)并对x _测试数据进行预测,以便我们可以使用以下代码对适当的天数进行预测:

从keras.models导入load _ model model=load _ model(' coin _ predictor。H5)preds=模型。predict(X _ test,batch _ size=2)绘图列表=解串器(preds,ser,train_phase=True)接下来,我们将导入Plotly并设置属性以获得良好的绘图体验。我们将使用以下代码实现此目的:

从plotly导入_ _ version _ _来自plotly.offline导入download_plotlyjs,init_notebook_mode,plot,iplot导入plotly。graph _ objs as goi导入袖扣作为cf init _ notebook _ mode(connected=True)设置完所有属性后,我们最终可以使用以下代码绘制预测值和观察值:

价格=pd .数据框({ '预测'地块列表[1],'实际价格'地块列表[2]},索引=地块列表[0])。iplot(as figure=True,kind='scatter 'xTitle='Date 'yTitle='BTC价格,Title='BTC价格预测'))运行此代码时,您将获得以下图表的最新版本:

正如你所看到的,它看起来一点都不差。但是,您需要知道,即使模式非常接近,但是如果您每天查看结果,结果仍然是危险的。因此,必须进一步开发代码以获得更好的结果。

最后,您已经成功地创建并训练了一个可以预测BTC价格的RNN模型,甚至还保存了训练好的模型以供将来使用。通过切换到面向对象编程,您可以在Web或移动应用程序中使用这种培训模型。

广告位
本文来自网络,不代表区块链网站|NFTS立场,转载请注明出处:https://www.qklwz.com/btb/btbjiaoxue/35222.html

作者: 小王聊区块

上一篇
下一篇

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部