主页 > 最新imtoken官方下载 > 技术帖:如何用深度学习模型预测加密货币价格

技术帖:如何用深度学习模型预测加密货币价格

最新imtoken官方下载 2023-10-13 05:12:02

比特币以太币行情_比特币行情预测分析教程_火币网比特币行情

BlockChange 有效

编译:张南星、王梦泽、袁媛、夏亚威

本文来自一位资深机器学习驱动,他对机器学习和加密技术感兴趣,并试图探索两者之间的共同点。 在这篇文章中,他将一步步告诉你如何用深度学习模型预测货币价格。

如果要评选出2017年的三大热门金酸莓奖,毫无疑问获奖者必须是指尖陀螺、人工智能和加密货币。 加密货币是一种颠覆性的技术,其背后的原理令人信服,我非常看好它未来的发展。

我实际上并不拥有任何加密货币,但在通过深度学习、机器学习和人工智能成功预测加密货币价格方面,我认为自己是一位经验丰富的老手。

一开始,我认为将深度学习和加密货币研究相结合是一个非常新颖独特的想法,但在准备这篇文章时,我发现了一篇类似的文章。 那篇文章只谈到了比特币。 我还将在本文中讨论以太坊(它有几个别名:ether、eth 或 lambo-money)。

同类文章链接:

我们将使用长短期记忆 (LSTM) 模型,这是深度学习中的一种特定模型,非常适合分析时间序列数据(或任何时间/空间/结构序列数据,如电影、句子等) .

如果你真的想了解基础理论,那么我推荐你阅读这三篇文章:《理解 LSTM 网络》、《探索 LSTMs》,以及原白皮书。 出于私心,我主要是想吸引更多非专业的机器学习爱好者,所以我会尽量减少代码的长度。 如果您想自己使用数据或构建自己的模型,本文还提供了 Jupyter (Python) 注释以供参考。 那么,让我们开始吧!

数据

在建立模型之前,我们需要获取相应的数据。 Kaggle 上有详细的比特币这几年的每分钟价格数据(以及其他一些相关的功能,可以在另一篇博客中看到)。 但是如果使用这个时间粒度,噪声可能会掩盖真实的信号,所以我们使用天作为粒度。

另一个博客:

但是这样的话,我们就会面临数据不足的问题(我们的数据量只能达到几百行,达不到几千、几百万行)。 在深度学习中,没有模型可以解决数据太少的问题。 我也不想依赖静态文件来构建模型,因为这会使使用未来注入的新数据更新模型的过程变得复杂。 相反,让我们尝试从网站和 API 中抓取数据。

由于我们需要在一个模型中使用多种加密货币,因此从同一数据源抓取数据也许是个好主意。 我们将使用网站 coinmarketcap.com。

到目前为止,我们只考虑了比特币和以太坊,但使用相同的渠道获取最近流行的山寨币的数据并不太困难。 在我们导入数据之前,我们必须加载一些 python 包,这将使分析过程更加容易。

import pandas as pd

import time

import seaborn as sns

import matplotlib.pyplot as plt

import datetime

import numpy as np



# get market info for bitcoin from the start of 2016 to the current day

bitcoin_market_info = pd.read_html("https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20130428&end="+time.strftime("%Y%m%d"))[0]

# convert the date string to the correct date format

bitcoin_market_info = bitcoin_market_info.assign(Date=pd.to_datetime(bitcoin_market_info['Date']))

# when Volume is equal to '-' convert it to 0

bitcoin_market_info.loc[bitcoin_market_info['Volume']=="-",'Volume']=0

# convert to int

bitcoin_market_info['Volume'] = bitcoin_market_info['Volume'].astype('int64')

# look at the first few rows

bitcoin_market_info.head()

比特币行情预测分析教程_火币网比特币行情_比特币以太币行情

为了解释刚刚发生的事情,我们加载了一些 python 包并导入了在这个网站上看到的表格(下面的链接)。 经过简单的数据清洗,我们得到了上表。 只需将URL地址中的“bitcoin”(此处代码忽略)替换为“ethereum”,即可得到相应的以太坊数据。

网站链接:

为了验证数据的准确性,我们可以制作一张两种货币的价量时间线图。

比特币行情预测分析教程_火币网比特币行情_比特币以太币行情

图例:上部-收盘价; 下部 - 交易量

火币网比特币行情_比特币行情预测分析教程_比特币以太币行情

图例:上部-收盘价; 下部 - 交易量

训练、测试和随机游走

我们有了数据,现在我们可以开始创建模型了。 在深度学习领域,数据一般分为训练数据和测试数据,用训练数据集建立模型,再用训练样本以外的测试数据集进行评估。

在时间序列模型中,一般我们使用一段时间的数据进行训练,然后使用另一段时间的数据进行测试。 我随便把时间节点定为2017年6月1日(即模型会在6月1日之前用数据训练,之后用数据评估)。

比特币行情预测分析教程_比特币以太币行情_火币网比特币行情

图例:紫线-训练集; 蓝线 - 测试集

上半部分 - 比特币价格($); 下半场 - 以太坊价格 ($)

可以观察到训练集中的大部分数据都是在币价低的时候,所以训练数据的分布可能并不能很好的代表测试数据的分布,这会削弱模型泛化到out的能力-of-sample 数据(你可以参考这个网站将数据转化为平稳的时间序列)。

网站链接:

%2520science/general/A-Road-Incident-Model-Analysis/

但为什么要让不尽如人意的现实干扰我们的分析呢? 在我们开始使用深度 AI 机器模型之前,有必要讨论一个更简单的模型。 最简单的模型是假设明天的价格等于今天的价格,我们简单粗暴地称之为延期模型。 让我们用数学语言定义这个模型:

火币网比特币行情_比特币以太币行情_比特币行情预测分析教程

比特币行情预测分析教程_火币网比特币行情_比特币以太币行情

图:简单的延迟模型

上半部分 - 比特币价格($); 下半场 - 以太坊价格 ($)

把这个简单的模型稍微扩展一下,一般认为股价是一个随机游走,用数学模型表示为:

比特币以太币行情_火币网比特币行情_比特币行情预测分析教程

我们将从训练数据集中取 μ 和 σ 的值,然后将随机游走模型应用到比特币和以太坊的测试数据集上。

比特币行情预测分析教程_比特币以太币行情_火币网比特币行情

图:单点随机游走模型(测试数据)

上半部分 - 比特币价格($); 下半场 - 以太坊价格 ($)

哈哈,看看这些预测线,除了一些小毛病,基本都是按照各个币种的实际收盘价,甚至预测了以太币在6月中旬和8月下旬的上涨(以及随后的下跌)。

仅预测未来一个点的模型表现出误导性的准确性,因为错误不会延续到后续预测。 不管前一个值的误差有多大,由于每个时间点的输入都是真实值,误差都会被重置。

比特币随机游走模型尤其具有欺骗性,因为 y 轴上的大范围使得这条预测曲线看起来非常平滑。

不幸的是,单点预测在时间序列模型的评估中非常常见(如文章 1,文章 2)。 更好的方法是通过多点预测来评估其准确性,这样以前的错误不会被重置,而是被纳入以后的预测中。 模型的预测性越差,它的局限性就越大。 数学模型如下:

我们根据所有测试数据集和预测收盘价推导出随机游走模型。

比特币行情预测分析教程_火币网比特币行情_比特币以太币行情

图:完整区间随机模型

上半部分 - 比特币价格($); 下半场 - 以太坊价格 ($)

模型预测对随机种子的选择极其敏感,我选择了一个可以很好地预测以太结果的完整区间随机游走模型。 在对应的Jupyter笔记中,大家可以通过界面尝试下面动画中的种子值,看看随机游走模型表现如何。

火币网比特币行情_比特币以太币行情_比特币行情预测分析教程

图:单点行走模型/完全区间随机模型对比

纵坐标 - 以太币价格 ($)

需要注意的是,单点随机游走看起来总是非常准确,即使它背后没有任何意义。 我希望您以怀疑的眼光看待任何声称能够准确预测价格的文章。 但也许我不必担心,加密货币爱好者似乎不会被华而不实的口号所吸引。

长短期记忆 (LSTM)

之前说过,如果你对LSTM的原理感兴趣,可以阅读:《Understanding LSTM Networks》、《Exploring LSTM》,原白皮书。 (上面的链接)

幸运的是,我们不需要从头开始构建网络(甚至不需要了解它)比特币行情预测分析教程,我们可以使用一些包含各种深度学习算法(例如 TensorFlow、Keras、PyTorch 等)的标准实现的包。 我选择 Keras,因为我发现它对于非专家来说是最直观的。 如果你对 Keras 不熟悉,可以看看我之前的教程。

model_data.head()

比特币以太币行情_比特币行情预测分析教程_火币网比特币行情

我新建了一个数据表model_data,去掉了一些列(开盘价,当日最高价,当日最低价),重新排列了新的列:close_off_high代表收盘价和当日最高价的差值,-A值 1 和 1 表示收盘价分别等于每日最低价或最高价。

波动率栏是最高价和最低价之差除以开盘价。 您可能还会注意到 model_data 数据集是按时间顺序从古到今排列的。 实际上模型输入不包括日期,所以我们不再需要这一列了。

我们的 LSTM 模型将使用过去的数据(比特币和以太坊)来预测特定货币的第二天收盘价。 我们需要决定在模型中使用多少天的过去数据。

同样,我武断地决定使用前 10 天的数据,因为 10 是一个很好的整数。 我们使用连续 10 天的数据(称为窗口)来创建多个小数据表。 第一个窗口将包含训练数据集中的第 0-9 行(Python 从 0 开始计数),下一个窗口将包含第 1-10 行,依此类推。

选择较小的窗口大小意味着我们可以在模型中使用更多的窗口,缺点是模型没有足够的信息来预测复杂的长期行为(如果可以的话)。

深度学习不喜欢变化很大的输入值。 查看列,有些值介于 -1 和 1 之间,有些则以百万为单位。 我们需要对数据进行标准化,以确保我们输入值的变化范围是一致的。

一般-1到1的值比较理想,off_high列和volatility列的值满足要求,但是对于其他列,我们需要根据第一行的值对输入值进行归一化处理窗户。

火币网比特币行情_比特币行情预测分析教程_比特币以太币行情

该表显示了 LSTM 模型的部分输入(实际上会有数百个类似的表)。 我们规范化一些列,使它们在第一个时间点的值为 0,以便预测从那个时间点开始的价格变化。

现在我们准备构建 LSTM 模型,实际上用 Keras 构建它非常容易,你只需将几个模块堆叠在一起即可。

如需更好的解释,请单击此处:

%2520science/deep%2520learning/python/another-keras-tutorial-for-neural-network-beginners/

代码如下:

# import the relevant Keras modules

from keras.models import Sequential

from keras.layers import Activation, Dense

from keras.layers import LSTM

from keras.layers import Dropout



def build_model(inputs, output_size, neurons, activ_func = "linear",

               dropout =0.25, loss="mae", optimizer="adam")
:

   model
= Sequential()



   model.add(LSTM(neurons, input_shape=(inputs.shape[1], inputs.shape[2])))

   model.add(Dropout(dropout))



   model.add(Dense(units=output_size))

   model.add(Activation(activ_func))



   model.compile(loss=loss, optimizer=optimizer)

return model

不出所料,build_model函数创建了一个名为model的空模型(也就是这行代码model=Sequential),模型中已经添加了LSTM层,大小匹配输入(n*m表,n和m代表时间点/行和列)。

函数还包括更通用的神经网络特征,例如 dropout 和激活函数。 现在我们只需要确定放入 LSTM 层的神经元数量(我选择 20 以保持合理的运行时间)并为模型创建训练数据。

代码如下:


# random seed for reproducibility


np.random.seed(202)

# initialise model architecture

eth_model = build_model(LSTM_training_inputs, output_size=1, neurons = 20)

# model output is next price normalised to 10th previous closing price

LSTM_training_outputs = (training_set['eth_Close'][window_len:].values/training_set['eth_Close'][:-window_len].values)-1

# train model on data

# note: eth_history contains information on the training error per epoch

eth_history = eth_model.fit(LSTM_training_inputs, LSTM_training_outputs,

                           epochs=50, batch_size=1, verbose=2, shuffle=True)

#eth_preds = np.loadtxt('eth_preds.txt')



结果:

Epoch 50/50

6s - loss: 0.0625

我们建立了一个 LSTM 模型,可以预测以太坊明天的收盘价。 让我们看看模型的表现如何。 首先查看模型在训练集上的表现(2017年6月之前的数据)。 代码下方的数字是模型在训练集上进行 50 次训练迭代(或 epochs)后的平均绝对误差(mae)。 我们可以将模型的输出视为每日收盘价,而不是相对变化。

比特币行情预测分析教程_比特币以太币行情_火币网比特币行情

训练集:单时间点预测

蓝线——实际价格; 绿线 - 预测价格

纵轴:以太坊价格($)

平均绝对误差:0.0583

正如我们所期望的那样,准确性看起来很高。 在训练期间,模型可以了解其错误来源并进行相应调整。

其实要达到几乎零训练误差并不难,我们只需要用几百个神经元,训练几千个循环即可(这就是过拟合,其实就是预测噪声,我在build_model函数Dropout()中加入的,降低了我们相对较小的模型过度拟合的风险)。

我们应该更多地关注模型在测试集上的表现,因为我们可以看到模型在新数据上的表现。

比特币以太币行情_比特币行情预测分析教程_火币网比特币行情

测试集:单时间点预测

蓝线——实际价格; 绿线 - 预测价格

纵轴:以太坊价格($)

平均绝对误差:0.0531

撇开单点预测具有误导性的限制不谈,LSTM 模型似乎在测试集上表现良好。 但其最明显的缺陷是以太币价格在暴涨后(如 6 月中旬和 10 月)不可避免的下跌,而模型无法检测到这一点。

其实这个问题一直都存在,只是在这个剧变的时候表现的更加明显而已。 预测的价格曲线几乎是实际价格曲线向未来某一天移动的结果(例如 7 月中旬的下跌)。 此外,该模型似乎总体上高估了以太币的未来价值(我们确实如此~),预测曲线总是高于实际曲线。

我怀疑这是由于在训练集所属的时间范围内以太币价格的天文数字上涨,因此模型推断这种趋势将持续(我们也是如此~)。我们还构建了一个类似的 LSTM 模型来预测比特币。 测试集的预测图如下

完整代码的 Jupyter notebook 链接:

火币网比特币行情_比特币以太币行情_比特币行情预测分析教程

测试集:单时间点预测

蓝线——实际价格; 绿线 - 预测价格

纵轴:比特币价格($)

平均绝对误差:0.0392

正如我之前所说,单点预测可能具有欺骗性。 如果仔细观察,您会发现预测值通常反映了之前的值(例如 10 月)。 深度学习模型LSTM已经部分推导了一个p元自回归模型(autoregression model,AR),未来的值只是之前p值的加权和。 AR模型的数学公式如下:

比特币以太币行情_火币网比特币行情_比特币行情预测分析教程

好消息是 AR 模型经常用于时间序列,因此 LSTM 模型似乎有合理的地方使用它们。 坏消息是这是对 LSTM 能力的浪费比特币行情预测分析教程,我们可以构建更简单的 AR 模型,花费更少的时间并可能得到类似的结果。

火币网比特币行情_比特币以太币行情_比特币行情预测分析教程

测试集:5个时间点的预测

连续蓝线:实际价格

其他彩色线条:预测价格

上半部分:比特币价格($); 下半部分:以太坊价格($)

这个预测结果显然没有单点预测结果那么抢眼。 然而,我很高兴该模型输出了一些微妙之处(例如第二行表示以太); 它并不是简单地预测价格将朝一个方向统一移动,这是一个好兆头。

回顾单点预测,Deep Robotic Artificial Neural 模型还可以,但 Random Walk 模型也不错。 与随机游走模型一样,LSTM 模型对随机种子的选择也很敏感(模型的权重最初是随机分配的)。

因此,如果我们要对两个模型进行比较,需要得到多次运行后模型误差的估计值(约25次),测试集中实际收盘价与预测收盘价之差的绝对值记为错误。

火币网比特币行情_比特币以太币行情_比特币行情预测分析教程

左图:比特币测试集(运行 25 次) 纵轴:平均绝对误差 横轴:LSTM 模型、随机游走模型

右图:以太坊测试集(运行 25 次) 纵轴:平均绝对误差 横轴:LSTM 模型、随机游走模型

也许 AI 值得广为流传,上图显示了每个模型在 25 次初始化后测试集上的错误。 LSTM 模型对比特币和以太坊价格的平均误差分别为 0.04 和 0.05,优于随机游走模型。

击败随机游走模型是一个低标准,将 LSTM 与更合适的时间序列模型(如加权平均、AR、ARIMA 或 Facebook 的 Prophet 算法)进行比较会更有趣。 另一方面,我相信改进 LSTM 模型并不难(尝试添加更多层和/或神经元、更改批量大小、学习率等)。

也就是说,希望您已经发现我对应用深度学习来预测加密货币价格变化的疑虑。 这是因为我们忽略了最好的框架:人类智能。 显然,预测加密货币的完美模型*是:

火币网比特币行情_比特币以太币行情_比特币行情预测分析教程

(译者注:如果加密货币的价格在时间流逝后接近月亮高度,所有不在 OmiseGo 区块链中的加密货币将永远升值)

*本文不涉及财务建议,不应用作此类用途。 虽然从长远来看,对加密货币的投资肯定会增值,但它们也可能会贬值。

总结

我们收集了一些加密货币数据并将其输入到一个很酷的深度智能机器学习 LSTM 模型中,不幸的是,预测值与之前的输入值没有太大区别。 那么问题来了,如何让模型学习到更复杂的行为呢?

如果以上是肯定的,那么下一个否定的是,有可能根本找不到加密货币的价格变化模式; 没有模型(无论多深)可以将信号与噪声分开(这与使用深度学习预测地震类似),即使出现某种模式,它也会很快消失。

想想2016年和2017年的差距有多大,任何基于2016年数据的模型肯定难以重现2017年前所未有的变化。以上讨论是建议大家不妨节省一些时间,坚持AR模型。

但我相信他们最终会找到进入深度学习的途径,与此同时,您可以通过下载 Python 代码来构建自己的 LSTM 模型。

蟒蛇代码:

深度学习.ipynb

原文链接:

%20learning/python/predicting-cryptocurrency-prices-with-deep-learning/

火币网比特币行情_比特币以太币行情_比特币行情预测分析教程

比特币行情预测分析教程_比特币以太币行情_火币网比特币行情

长按解锁 BlockChange

探索区块链造福社会!

联系报告:blockchange@gmail.com