温馨提示:本案例仅供学习研究之用,不构成投资建议。
比特币的价格数据是基于时间序列的,所以比特币的价格预测大部分是通过LSTM模来实现的。
LSTM是一种深度学习模,特别适用于时间序列数据(或具有时间/空间/结构顺序的数据,如电影、句子等),是预测加密货币价格走势的理想模。
本文主要描述通过LSTM进行数据拟合来预测比特币未来的价格。
要导入的库
1 importpandasaspd2importnumpyasnp34fromsklearn。PreprocessingimportMinMaxScaler LabelEncoder5fromkeras。ModelsimportSequential6fromkeras。LayersimportLSTM, density, Dropout78frommatpLootlibimportpypLootasplt9 % matpLootlibinline
数据分析
1. 数据加载
读取BTC的日常交易数据
1 data = pd。Read_cs (filepath_or_buffer = "btc_data_day")
根据数据,共有1380条数据,由日期、开盘、高、低、收盘、成交量(BTC)、成交量(货币)、加权价格等栏目组成。除了Date列之外,其余的数据列都属于float64数据类。
1的数据。info ()
看看前10行
1的数据。头(10)
2.数据可视化
利用matpLootlib绘制加权后的价格,可以看到数据的分布和趋势。在图中,我们发现有一段数据0,所以我们需要确认数据中是否有异常。
1 PLT。pLoot (data [' WeightedPrice], label = 'Price') 2 PLTYlabel (' Price ') 3 PLT图例()4 PLTshow ()
3.异常数据处理
检查数据是否包含nan数据,可以看到在我们的数据中没有nan数据
1数据。Isnull ()。sum ()
1 date02open03high04low05close06olume (BTC) 07 olume (Currency) 08 weightedprice09dtype: int64
如果我们再次查看0的数据,我们可以看到我们的数据中有一个0的值。我们需要处理0的值
1 (data = = 0). Astype (int) any ()
1 datefalse2opentrue3hightrue4lowtrue5closetrue6olume (BTC) True7Volume (Currency) True8WeightedPriceTrue9dtype: bool
数据,数据。替换(0,np。2数据[' WeightedPrice] fillna (mETHod = 'ffill', ' inplace = True) 3数据[' Open ']。替换(0,np。4 data [' Open '] fillna (mETHod = 'ffill', inplace = True) 5 data [' High ']。替换(0,np。[' High '] fillna (mETHod = 'ffill', ' inplace = True] 7 data [' Low ']。替换(0,np。8 data [' Low '] fillna (mETHod = 'ffill', ' inplace = True] 9 data [' Close ']。替换(0,np。[' Close '] fillna (mETHod = 'ffill', ' inplace = True) 11 data [' Volume (BTC)']。替换(0,np。12数据[' Volume (BTC)']。Fillna (mETHod = 'ffill', inplace = True) 13数据[' Volume(货币)']。替换(0,np。Nan, inplace = True)数据14 [' Volume(货币)']。Fillna (mETHod = 'ffill', inplace = True)
1 (data = = 0). Astype (int) any ()
1 datefalse2open谬误3 high谬误4 low谬误5close谬误6卷(BTC)谬误7卷(货币)谬误8 weightedpricalse9dtype: bool
如果你观察数据的分布和趋势,曲线是非常连续的
1 PLT。pLoot (data [' WeightedPrice], label = 'Price') 2 PLTYlabel (' Price ') 3 PLT图例()4 PLTshow ()
4. 划分训练数据集和测试数据集
将数据规范化为0 – 1
1 data_set = data。删除(' Date ',轴= 1). Values2data_set = data_set。Astype (' float32) 3 MMS = MinMaxScaler (feature_range = (0,1)) 4 data_set = MMS。Fit_transform (data_set)
测试数据集和训练数据集按2:8划分
1 thewire = 0.82 train_size = int (len (data_set) * thewire) 3 test_size = len (data_set) - train_size4train, test = data_set [0: train_size,:], data_set [train_size: len (data_set),:)
创建培训数据集和测试数据集。以1天为窗口创建我们的培训数据集和测试数据集。
1 . DeFicreate_dataset (data): 2 window = 13 label_index = 64 x, y = [], [] 5 foriinrange (len (data) - Windows): 6 x. Append (data/I + window: (I),:) 7 y. Append (data/I + Windows, label_index) 8 returnnp。数组(x), np。数组(y)
1 . train_x train_y = create_dataset (test) 2 . test_x, test_y = create_dataset (test)
定义模并对其进行培训
这次我们使用一个简单的模,其结构如下。
这里需要解释LSTM的输入形状。输入形状的输入维度是(batch_size、时间步长、特性)。其中,时间步长值为数据输入时的时间窗区间。这里,我们用1天作为时间窗口,我们的数据都是每天的数据,所以这里的时间步长是1。
长短时记忆(LSTM)是一种特殊的RNN,主要用于解决长序列训练过程中的梯度消失和梯度爆炸问题。下面是LSTM的简要介绍。
从LSTM的网络结构图可以看出,LSTM实际上是一个小模,包括3个sigmoid激活函数、2个tanh激活函数、3个乘法函数和1个加法函数。
细胞状态
单元格状态是LSTM的核心,它是上图顶部的黑线,黑线下面是我们后面要讲的门。单元状态将根据每个gate的结果进行更新。让我们通过这些门,你们就会理解细胞状态的流动。
LSTM网络可以通过一个称为门的结构删除或添加有关单元状态的信息。盖茨可以有选择地决定让什么信息通过。栅极结构是乙状结肠层和点积运算的组合。因为sigmoid层的输出是0-1,0表示它们都不能通过,1表示它们都能通过。LSTM包含三个控制单元状态的门。我们来谈谈每一扇门。
忘记门
LSTM中的第一步是确定单元状态需要丢弃哪些信息。这部分操作是通过一个名为遗忘门的sigmoid单元来处理的。让我们看看动画。
我们可以看到那扇被遗忘的门正在向外张望
和
该信息用于输出一个介于0和1之间的向量,其中0和1的值表示单元格的状态
有多少信息被保留或丢弃。零意味着没有,一意味着两者都有。
数学表达式:
进入门
下一步是通过打开输入门来决定要向单元格状态添加什么新信息。我们先来看动画,
我们可以看到,
和
信息被放入遗忘门(sigmoid)和输入门(tanh)。因为忘记门的输出是0和1的价值,因此,如果混沌之门的输出为0,结果进入门美元C_{我}$不会被添加到当前状态的细胞,如果它是1,都将被添加到细胞的状态,这是混沌之门进入门的作用选择性的结果添加到细胞状态。
数学公式为:
输出门
在更新单元格的状态之后,我们需要数据
和
输入的和用于确定输出单元的状态特征。这里,我们需要将输入通过一个名为output gate的sigmoid层传递,以获得判断条件,然后通过tanh层传递单元格的状态,以获得一个值介于-1和1之间的向量。这个向量乘以输出门得到的判断条件,得到RNN单元的最终输出。动画图如下,
1 DeFicreate_model (): 2 model =顺序模()3添加(LSTM (50, input_shape = (train_x))。形状[1],train_x形状[2]))4个模。添加(密集(1))5 model.com运行(损失= 'mae',优化器= 'Adam') 6模。返回model89m Odel = create_model ()
1 . history = model fit (train_x train_y, epochs = 80, batch_size = 64, alidation_data = (test_x test_y), erbose = 1, shuffle = False)
1 PLT。情节(历史。History [' loss '], label = 'train') 2 PLT。情节(历史。历史[' al_loss], label = 'test') 3 PLT。图例()4 PLTshow ()
预测
1 predict =模。预测(test_x) 2 PLT。pLoot (predict, label = 'predict') 3 PLT。pLoot (test_y, label = 'groundtrue') 4 PLT。图例()5pltshow ()
目前,通过机器学习来预测比特币的长期价格走势仍然非常困难。本文只能作为一个学习案例。之后的案例将在线与瞬间池云演示镜像,有兴趣的用户可以直接体验。
文章标题:使用LSTM框架实时预测比特币价格
文章链接:https://www.btchangqing.cn/21372.html
更新时间:2021年05月29日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。