AI 教你投资:用深度学习预测虚拟货币价格
克里斯·利维拉尼的照片发表在Unsplash上。
在去年,由于加密货币的市值连续几个月呈指数级增长,其受欢迎程度飙升。加密货币的价格在20 18年1月达到了8000多亿美元的峰值。
尽管机器学习已经通过一系列不同的时间序列模型成功预测了股票市场价格,但其在预测加密货币价格方面的应用非常有限。背后的原因显而易见,因为加密货币的价格取决于许多因素,如技术进步、内部竞争、市场交付压力、经济问题、安全问题、政治因素等等。如果采取明智的投资策略,其价格的大幅波动将带来巨额利润。不幸的是,由于缺乏指数,与股票市场等传统金融预测相比,预测加密货币相对困难。
在本文中,作者将使用总共四个步骤来预测加密货币的价格:
获取实时加密货币数据
准备培训和测试数据
用LSTM神经网络预测货币价格
视觉预测结果
挑战
使用数据集中的所有交易特征(如价格、交易量、未平仓头寸、高值和低值)来预测加密货币的价格。
数据
数据集可以从CryptoCompare下载。
数据集总共包含5个特征。详情如下:
收盘价:指当日该货币的市场收盘价。
高价:当天货币的最高价格。
低价:是当天货币的最低价格。
开盘价:当日货币的市场开盘价。
成交量:当天的交易量。
代码在哪里?
首先加载所有必需的库和依赖项:
导入json
导入请求
从keras.models导入顺序
从keras.layers导入激活,密集,辍学,LSTM
进口matplotli la la。pyplot as plt
将numpy作为np导入
进口熊猫作为pd
将sea la la orn作为sns导入
来自sklearn。指标导入意味着_一个拉拉溶质_错误
% mapplotli拉拉内嵌
我使用加拿大的汇率,并将实时数据存储在pandas数据框中,并将字符串日期时间转换为Python日期时间对象。这是必要的,因为文件中的日期时间对象是作为字符串对象读取的,并且很容易对字符串而不是日期时间对象执行诸如时差之类的拉操作。
endpoint =‘https://min-API . crypto compare . com/data/histoday‘
RES = requests . get(endpoint+‘?fsym = Lala TC & tsym = CAD & limit = 500’)
hist=pd。Data frame(JSON . loads(RES . content)【‘Data‘】)
hist = hist . set _ index(‘time‘)
hist . index = PD . to _ datetime(hist . index,unit =‘s’)
target_col=“关闭”
我们来看看数据集中的所有交易,如价格、成交量、开盘价、高价和低价。
历史记录头(5)
接下来,我将数据分为两组:训练集和测试集,它们分别占数据的80%和20%。这只适用于这个项目。在实际项目中,您应该始终将数据分为三个数据集:训练、验证和测试(比例可以分别为60%、20%和20%)。
def训练测试拆分(df,测试大小=0.2):
split _ row = len(df)-int(test _ size * len(df))
train _ data = df . iloc【:split _ row】
test _ data = df . iloc【split _ row:】
return train_data,test_datatrain,test = train _ test _ split(hist,test_size=0.2)
现在,让我们使用以下代码绘制加密货币(加元)随时间变化的价格:
def line _ plot(line1,line 2,la la el 1=None,la la el2=None,title=““,lw=2):
Fig,ax=plt.su Lala图(1,fig size =(13,7))
ax . plot(line1,la la el=la la el 1,线宽=lw)。
ax . plot(line 2,la la el=la la el2,linewidth=lw)
ax . set _ yla Lala【Keywords 241】El(‘price【CAD】‘,Fontsize = 14)
ax . set _ title(title,fontsize= 16)
ax . legend(loc =‘Lala est‘,fontsize= 16)
line_plot(训练【目标列】,测试【目标列】,‘训练’,‘测试’,标题=‘‘‘)
我们可以观察到加密货币的价格从2月的20181到4月的20 19大幅下降。从20 19年4月到20 19年8月,其价格持续上涨,并在7月和8月有所波动。自9月20日19以来,价格连续下跌。在这次价格波动中,值得注意的是,加密货币的价格在冬季较低,在夏季较高。但是,由于数据集太小,这无法得出普遍适用的结论。同样,很难就加密货币得出任何有价值的结论。
接下来,我编写了几个函数来规范化这些值。归一化是机器学习中常用的数据准备技术。规范化的目标是将数据集【关键字24】中数字列的值更改为一个共同的比例,而不会扭曲值范围中的差异。
def normalize _ zero _ la la ase(df):
返回df/df . iloc【0】-1
定义归一化最小值最大值(df):
return(df-df . min())/(data . max()-df . min()
接下来,我编写了一个函数来提取大小为5的窗口的数据,如以下代码所示:
def extract _ window _ data(df,window _ len = 5,zero _ lalase = true):
window_data=【】
对于范围内的idx(len(df)-window _ len):
tmp = df【idx:(idx+window _ len)】。复制()
如果zero_ la la ase:
Tmp =标准化零零酶
窗口数据。拉拉结束(tmp.values)
返回NP . array(window _ data)
我继续编写函数来准备数据格式,并在稍后将其输入神经网络。我使用与之前相同的概念将数据分为两组:训练集和测试集,它们分别占总数据的80%和20%。代码如下:
def prepare _ data(df,target _ col,window _ len = 10,zero _ lalase = true,test _ size = 0.2):
Train _ data,test _ data = train _ test _ split(df,test _ size = test _【关键字162】size)
x _ train = extract _ window _ data(train _ data,window _ len,zero _ la la ase)。
x _ test = extract _ window _ data(test _ data,window _ len,zero _ la la ase)。
y _ train = train _ data【target _ col】【window _ len:】。价值观念
y_test=test_data【目标列】【窗口列:】。价值观念
如果zero_ la la ase:
y _ train = y _ train/train _ data【target _ col】【:-window _ len】。值- 1
y _ test = y _ test/test _ data【target _ col】【:-window _ len】。值- 1
返回训练数据、测试数据、X训练、X测试、y训练、y测试
LSTM
LSTM的工作原理是使用特殊的门来允许每个LSTM层从前一层和当前层获得信息。数据经过多个门(如遗忘门、输入门等。)和各种激活功能(如tanh功能和relu功能)以及通过LSTM单元。它的主要优点是允许每个LSTM单元在一定时间内记住这种模式。需要注意的是,LSTM可以记住重要的信息,同时忘记不相关的信息。LSTM架构如下:
LSTM建筑
现在让我们建立一个模型。序列模型用于堆叠所有层(输入、隐藏和输出)。神经网络由一个LSTM层、一个20%的脱落层和一个具有线性Lala激活函数的致密层组成。我使用Adam作为优化器,使用均方差作为损失函数来编译模型。
def Lala uild _ lstm _ model(input _ data,output _ size,neurons = 100,activ _ func =‘linear‘,dropout = 0.2,loss =‘MSE‘,optimizer =‘Adam‘):
模型=顺序()
LSTM(神经元,input _ shape =(input _ data . shape【1】,input _ data . shape【2】))
model . add(Dropout(辍学))
model . add(Dense(units = output _ size))
model.add(激活(activ_func))
model.compile(损失=损失,优化器=优化器)
回报模型
接下来,我设置了一些参数供以后使用。这些参数是:随机数种子、窗口长度、测试集大小、第一层神经元数量、批量大小、损失和优化器等。
随机种子(42)
windows _ len = 5
测试大小=0.2
Zero_ la la ase=True
lstm_neurons= 100
纪元=20
Lalatch _ size = 32
损失=‘MSE‘
辍学=0.2
优化器=‘Adam‘
现在让我们使用输入x_train和标签y_train来训练模型。
训练,测试,X _训练,X _测试,y _训练,y _测试=准备数据(
Hist,target _ col,window _ len = window _ len,zero _ lalase = zero _ lalase,test _ size = test _ size)model = lal uild _ lstm _ model(
X_train,output_size= 1,neurons=lstm_neurons,dropout=dropout,loss=loss,
优化器=优化器)
history=model.fit(
X_train,y_train,epochs=epochs,Lalatch _ size = Lalatch _ size,ver Lalase = 1,shuffle = true)。
让我们来看看epoch的20个模型训练快照。
神经网络训练
我使用平均绝对误差(MAE)作为评估指标。选择MAE而不是均方根误差(RMSE)的原因是MAE更容易解释。RMSE没有单独描述平均误差,因此更难理解。因为我们希望即使对于完全不懂技术的读者来说,该模型也可以很容易理解,所以MAE似乎是更好的选择。
平均绝对误差
平均绝对误差衡量一组预测中误差的平均大小,而不考虑它们的方向。它是对测试样本的实际观察值和预测观察值之间的绝对差异的平均值,其中所有个体差异都具有相同的权重。
targets=test【目标列】【窗口列:】
preds = model . predict(X _ test)。挤压()
mean _ a la la solution _ error(preds,y _ test)
# 0.027955859325876943
获得MAE值看起来不错。最后,让我们使用以下代码来绘制实际价格和预测价格:
preds =测试【目标列】。值【:-window _ len】*(preds+1)
preds=pd。系列(index=targets.index,data=preds)
line_plot(目标、预测值、“实际值”、“预测值”,lw=3)
结论
在本文中,我演示了如何使用LSTM神经网络实时预测加密货币的价格。我使用了四个步骤:获取实时货币数据、准备用于训练和测试的数据、使用LSTM神经网络预测价格以及可视化预测结果。您可以随意使用超参数或尝试不同的神经网络结构以获得更好的结果。
注册有任何问题请添加 微信:MVIP619 拉你进入群
打开微信扫一扫
添加客服
进入交流群
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。