还是不靠谱!多维LSTM网络预测比特币价格【机器学习应用区块链系列二】
量化投资与机器学习
为中国的量化投资事业贡献一份我们的力量!
公众号今天为大家带来机器学习应用区块链系列的第二篇文章。
这篇文章的作者是公众号之前推过一位原作者,具体文章《通过LSTM神经网络进行时序预测针对股票市场(附Python源码)》,虽然有一段时了,但是,我们觉得这篇文章的结论很有用,希望大家可以认真阅读。
结论很精彩,见文末。
也侧面告诉我们使用一些机器学习算法做股价预测,效果并没有那么好!大家不要觉得什么高大上就一定好,有时候真实的交易其实并没有那么复杂!
至于怎么预测的过程大家可以下载代码自行去研究。
写这篇文章,主要是为了预测比特币的价格和张量,使用一个不只是看价格而且还看BTC交易量和货币(在这种情况下为美元)的多维LSTM神经网络,并创建一个多变量序列机器学习模型。
时间数据集
Kaggle上有一个数据集,包含了7种要素的比特币历史数据。
链接:https://www.kaggle.com/mczielinski/bitcoin-historical-data
具体处理的过程大家自行查看内容,只把clean_data()函数的核心代码贴出来:
num_rows = len(data)
x_data = []
y_data = []
i = 0
while((i+x_window_size+y_window_size) <= num_rows):
x_window_data = data[i:(i+x_window_size)]
y_window_data = data[(i+x_window_size):(i+x_window_size+y_window_size)]
#Remove any windows that contain NaN
if(x_window_data.isnull().values.any() or y_window_data.isnull().values.any()):
i += 1
continue
if(normalise):
abs_base, x_window_data = self.zero_base_standardise(x_window_data)
_, y_window_data = self.zero_base_standardise(y_window_data, abs_base=abs_base)
#Average of the desired predicter y column
y_average = np.average(y_window_data.values[:, y_col])
x_data.append(x_window_data.values)
y_data.append(y_average)
i += 1
预测结果
我们将尝试做两种类型的预测:
第一种:逐点预测,即预测t+1点,然后移动真实数据的窗口并继续预测下一个点。
model = lstm.load_network('data/model_saved.h5')
predictions = model.predict_generator(
generator_strip_xy(data_gen_test, true_values),
steps=steps_test
)
#Save our predictions
with h5py.File(configs['model']['filename_predictions'], 'w') as hf:
dset_p = hf.create_dataset('predictions', data=predictions)
dset_y = hf.create_dataset('true_values', data=true_values)
plot_results(predictions[:800], true_values[:800])
第二种:是t+n的多步超前预测,我们在移动窗口填充真实数据窗口预置的预测,并绘制N个步骤。
#Reload the data-generator
data_gen_test = dl.generate_clean_data(
configs['data']['filename_clean'],
batch_size=800,
start_index=ntrain
)
data_x, true_values = next(data_gen_test)
window_size = 50 #numer of steps to predict into the future
#We are going to cheat a bit here and just take the next 400 steps from the testing generator and predict that data in its whole
predictions_multiple = predict_sequences_multiple(
model,
data_x,
data_x[0].shape[0],
window_size
)
plot_results_multiple(predictions_multiple, true_values, window_size)
结论(我们认为很有用的结论)
不以人工智能的角度,而是从投资的角度来解释一些事实。
预测回报是一项相当没有意义的行为。我的意思是说,预测回报是预测的圣杯,而一些顶级对冲基金视图通过在现实中找到新的alpha指标来做到这一点,这是一件非常困难的事情,因为复杂的外部因素会影响到价格的走动。实际上,它可以看作是试图预测随机的下一步。
但是,我们做的也并不是完全没有意义。有限的时间序列数据,即使有多个维度,也很难预测回报,我们可以看到,特别是从第二个图表看到,是有一个预测波动的方法。而不仅仅是波动,而且我们也可以通过扩张它来预测市场环境,使我们能够了解我们目前所在的市场环境。
我们可以看到,通过了解我们当前的市场环境,预测未来的市场环境是在任何时候将正确的策略分配到市场的关键。虽然这更多是传统市场的一般投资方式,但同样适用于比特币市场。
所以,预测比特币的长期价格目前相当的困难,没有人可以只是通过时间序列数据技术做到,因为有很多因素加入使价格发生了变动。在这样的数据集上使用LSTM神经网络的另一个问题是我们将整个时间序列数据集作为一个固定的时间序列。也就是说,时间序列的属性在整个时间内都是不变的。然而这不可能,因为影响价格变化的因素也会随时间而变化,所以假设网络发现的属性或模式在现在仍然使用是一种不合理的做法。
当然,可以通过一些方法来克服这个非平稳性问题,目前前沿的研究方向是利用贝叶斯方法和LSTM一起克服时间序列非平稳性的问题。
- 3个域名交易:fde.com11万被秒
- 新手指南OpenStack:Nova的基础知识
- Python-装饰器详解
- Contact Manager Web API 示例[2] Web API Routing
- Android一些关于分辨率和布局的设置
- log4net 中错误 System.Web.HttpException (0x80004005): 文件不存在
- Contact Manager Web API 示例[2] Web API Routing
- Python内置函数
- NET实现微信公共平台上传下载多媒体文件
- css3基础知识——回顾
- Contact Manager Web API 示例[3] 分页和查询(Paging and Querying)
- @font-face css3自定义个性化字体
- 你不知道的javaScript笔记(7)
- Contact Manager Web API 示例[4] 异常处理(Exception Handling)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 天啊!鹅厂都开始做开发板了?网红腾讯物联网开发板终极开箱评测,让我们一睹为快!
- 我用 React 和 Vue 构建了同款应用,来看看哪里不一样(2020 版)
- 大点干!早点散----------深入剖析Redis集群原理与实验
- 微信群总是有人发广告?看我用Python写一个自动化机器人消灭他!
- 苏宁基于 ClickHouse 的大数据全链路监控实践
- CORS Cross Origin Resource Sharing
- 从0开始做播放器-第二季-第2章-Android NDK 工程的建立和 JNI 的基本用法
- 记一次线上问题排查-maven父子结构依赖所遇到的坑
- 『技术随手学』解决 pip conda install 网络故障中断
- boost asio
- 7.SwrContext音频重采样使用
- 8.ffmpeg-基础常用知识
- 9.下载ffmpeg、使QT支持同时编译32位和64位
- 10.QT-QAudioOutput类使用
- 11.QT-ffmpeg+QAudioOutput实现音频播放器