# 如何用深度学习技术预测虚拟货币价格？

### 获取数据

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
# 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

### 训练，测试和随机游走

wow！看看这些预测线。除了少许部分扭曲，基本上紧贴每个虚拟货币的实际价格变动情况。模型甚至捕捉到了 6 月中旬和 8 月下旬的暴涨状况。然而正如另一篇预测比特币价格的博客中所说，只在某个点预测未来的模型常常会让人误以为它很准确，因为在接下来的预测中模型没有将误差因素考虑在内。不管误差大小如何，它在每个时间点本质上会被重置，因为输入模型的是真实价格。比特币的随机游走尤其具有误导性，因为y轴的值可以很大，这让预测线看起来很平滑。

### 长短期记忆模型（LSTM）

# 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.compile(loss=loss, optimizer=optimizer)
return model

# 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)
Epoch 50/50
6s - loss: 0.0625

### 总结

• 改变损失函数：平均绝对误差并不真的鼓励我们去冒险。例如，在绝对平方误差情况下，LSTM 模型会被迫将检测峰值视为更重要的事情。而且，更适合模型的损失函数会让模型不再那么保守。

• 抑制过于保守的自回归模型：这能激励深度学习算法去探索更有趣或更冒险的模型。这一步说起来容易，做起来难！

• 获取更多更好的数据：即便靠单单过去的价格就能很好地预测未来价格，我们还可以添加其它一些能提升模型预测能力的数据特征。这样，LSTM模型就不必只依赖过去的价格数据了，可能还能解锁更复杂的功能的。这一步可能是最值得尝试但也最难的部分。