原标题:用机器学习来预测股价(代码+文档)——2018年iNTUtion决赛大作!

本期作者:Roman Moser

本期翻译:deigozhao

未经授权,严禁转载

机器学习和深度学习在时间序列数据的预测上具有很高的准确率,在金融机构中获得了广泛的应用。有大量的研究来进一步提升金融数据相关模型的准确率,本文要介绍的AlphaAI项目就是其中之一,AlphaAI使用栈式神经网络的架构(stacked neural network architecture )来预测多只股票的价格。

工作流程

AlphaAI的关键流程包括以下5步:

1、获取股票价格数据

2、用小波变换(Wavelet Transform)去除数据中的噪声

3、用栈式自编码器(stacked autoencoder)来提取特征

4、用这些特征来训练LSTM模型

5、测试模型的准确率

下面详细介绍以上5个步骤的具体细节。

数据获取

获取股票价格比较简单,直接用pandas_datareader这个API从雅虎财经获取数据即可。代码是:

stock_data = pdr.get_data_yahoo(self.ticker, self.start, self.end)

数据去噪和小波变换

由于股票市场动态的复杂性,股票的价格数据往往充满噪音,可能会影响机器学习的效果。因此很有必要把噪音从股票价格的趋势和结构中剔除出去。

去噪的方法可以是傅里叶变换,也可以是本文中使用的小波变换。

小波变换的公式如上,具体的操作是:

a. 做小波变换

b. 把落在一个标准差之外的系数剔除掉

c. 只用新的系数,生成新的去噪后的股价数据

下图是一个用小波变换来处理时间序列数据的效果图:

第1个图形是原始数据,经过小波变换后得到第2和第3个图形;可以看出后两个图形中毛刺的噪声数据已经被有效剔除。

Pywt是一个很好用的python库,用这个库来处理上述小波变换的python代码如下:

x = np.array(self.stock_data.iloc[i: i + 11, j])

(ca, cd) = pywt.dwt(x, "haar")

cat = pywt.threshold(ca, np.std(ca), mode="soft")

cdt = pywt.threshold(cd, np.std(cd), mode="soft")

tx = pywt.idwt(cat, cdt, "haar")

提取特征和栈式自编码器

通常在机器学习中,往往需要利用领域知识来构建特征提取的方法,也可以使用受限玻尔兹曼机(restricted Boltzmann machines )来自动提取特征。本文采用的是栈式自编码器(stacked autoencoders),主要是考虑到栈式自编码器的可解释性更好。

栈式自编码器把数据先从高维压缩到低维、然后再扩展到高维,这个过程的压缩部分就是很有效的一种特征提取的方法。栈式自编码器的网络结构图如下:

输入数据可以被压缩到任意的维度(网络的一个节点可以看做一维特征),通过先压缩后扩展的方式,输入数据中有效的特征被提取了出来。另外,栈式自编码器的输入层和输出层是一样的,是一种无监督学习的算法,不需要特定的人工标注数据。

我们用keras来生产这样一个模型:

classAutoEncoder:

def__init__(self, encoding_dim):

self.encoding_dim = encoding_dim

defbuild_train_model(self, input_shape, encoded1_shape, encoded2_shape, decoded1_shape, decoded2_shape):

input_data = Input(shape=(1, input_shape))

encoded1 = Dense(encoded1_shape, activation="relu", activity_regularizer=regularizers.l2(0))(input_data)

encoded2 = Dense(encoded2_shape, activation="relu", activity_regularizer=regularizers.l2(0))(encoded1)

encoded3 = Dense(self.encoding_dim, activation="relu", activity_regularizer=regularizers.l2(0))(encoded2)

decoded1 = Dense(decoded1_shape, activation="relu", activity_regularizer=regularizers.l2(0))(encoded3)

decoded2 = Dense(decoded2_shape, activation="relu", activity_regularizer=regularizers.l2(0))(decoded1)

decoded = Dense(input_shape, activation="sigmoid", activity_regularizer=regularizers.l2(0))(decoded2)

autoencoder = Model(inputs=input_data, outputs=decoded)

encoder = Model(input_data, encoded3)

# Now train the model using data we already preprocessed

autoencoder.compile(loss="mean_squared_error", optimizer="adam")

train = pd.read_csv("preprocessing/rbm_train.csv", index_col=0)

ntrain = np.array(train)

train_data = np.reshape(ntrain, (len(ntrain), 1, input_shape))

# print(train_data)

# autoencoder.summary()

autoencoder.fit(train_data, train_data, epochs=1000)

LSTM模型

LSTM由于各种结构的cell和gate的存在,可以有效的捕捉相隔很远的两个node之间的关系,从而在时间序列的预测问题上效果非常好。让我们来详细讨论下细节:

1、优化方法(Optimizer)

一个好的优化方法,应该要具有更快的收敛速度、同时也要尽量避免陷入局部最优点从而无法收敛到全局最优值。本文使用的是Adam optimizer ,该方法兼具Adagrad和RMSprop的优点。

先来看最基础的SGD:

Adagrad则用的是动态的学习率,根据历史迭代的梯度来计算当前的学习率;基本思想是如果历史梯度比较小、则该特征需要用小的学习率(避免步子卖得太大),如果历史梯度比较大、则该特征可以用大的学习率(避免收敛的太慢)。 Adagrad的公式如下

其中G是历史该特征历史梯度的平方和。

RMSprop和Adagrad很像,但其在对历史梯度计算移动均值时,最近几轮的梯度影响会更大。其公式如下:

Adam不仅考虑了动态的学习率,而且还考虑了动态的梯度。其动态学习率的处理和RMSprop是类似的。Adam的公式如下:

其中学习率的调整方式是:

而梯度的动态调整时:

总结一下Adam的三个特点:

1、动态调整学习率

2、有效的避免梯度消失

3、梯度和学习率的迭代时,都用了动量的方法

正则化

训练深度模型的另外一个需要注意的地方是正则化,避免让模型参数过大、避免让训练过程陷入过拟合状态。文本采用的是Tikhonov正则方法,加上正则化之后的优化目标变成了:

常用的L2正则是Tikhonov正则的一个特例(K=2)。

Dropout

Dropout也是一种避免过拟合的方法, 方式是在训练的过程中随机的把某些中间节点丢弃掉。这样会迫使网络中某一层的节点不过分依赖上一层节点中的,因而使得这个网络具有更好的鲁棒性。下图是加了Dropout层的效果,可以看到加了Dropout使得分类错误率明显下降。

模型实现

上面的所有步骤都可以用keras来实现,下面是部分代码(全部代码文末查看):

classNeuralNetwork:

def__init__(self, input_shape, stock_or_return):

self.input_shape = input_shape

self.stock_or_return = stock_or_return

defmake_train_model(self):

input_data = kl.Input(shape=(1, self.input_shape))

lstm = kl.LSTM(5, input_shape=(1, self.input_shape), return_sequences=True, activity_regularizer=regularizers.l2(0.003),

recurrent_regularizer=regularizers.l2(0), dropout=0.2, recurrent_dropout=0.2)(input_data)

perc = kl.Dense(5, activation="sigmoid", activity_regularizer=regularizers.l2(0.005))(lstm)

lstm2 = kl.LSTM(2, activity_regularizer=regularizers.l2(0.01), recurrent_regularizer=regularizers.l2(0.001),

dropout=0.2, recurrent_dropout=0.2)(perc)

out = kl.Dense(1, activation="sigmoid", activity_regularizer=regularizers.l2(0.001))(lstm2)

model = Model(input_data, out)

model.compile(optimizer="adam", loss="mean_squared_error", metrics=["mse"])

# load data

train = np.reshape(np.array(pd.read_csv("features/autoencoded_train_data.csv", index_col=0)),

(len(np.array(pd.read_csv("features/autoencoded_train_data.csv"))), 1, self.input_shape))

train_y = np.array(pd.read_csv("features/autoencoded_train_y.csv", index_col=0))

# train_stock = np.array(pd.read_csv("train_stock.csv"))

# train model

model.fit(train, train_y, epochs=2000)

实验结果

下面是几只公司股票的股价预测和实际值的对比情况,可以看出效果不错。

雪佛龙公司的MSE是2.11。

艾森克美孚公司的MSE是0.0945。

在线学习(online learning)

股价预测模型应该具有较好的online learning的能力,针对历史数据训练出来的模型训,应该在新的股价数据产生之后做出及时的更新。除了使用真实的股价数据来训练之外,还可以补充一些辅助数据,比如twitter中的推文和新闻中文章。推文数据和新闻文章中包含着大量和公司、股票走势相关的信息,针对这些信息可以做NLP分析(比如: 情感分析)。

获取全部Twitter推文的官方API是收费的,但幸运的是可以免费获取最近的10天数据。我们利用TextBlob 这个工具对这些推文数据做情感分析, 这部分数据对在线学习模型是非常有用的。

同样的,获取完整的新闻数据也是比较困难的,想从Bloomberg网站上爬取自2000年以来的所有文章几乎不可行。因此我们利用Aylien API 来获取数据,这个工具的爬虫功能很强大。我们只爬取了股票价格和金融新闻领域的数据,只保留了top150个站点的文章。所有的数据通过情感分析之后,按时间衰减算出平均值,送到在线学习的模型中去。

有了推文和新闻文章中情感分析数据,我们可以把这些数据加到神经网络的额外层中。不过在写作文本的时候,这部分模型的结果还没有准备完毕。

结论

神经网络是处理时间序列数据的非常有用的工具,再加上一些情感分析的数据就可以得到实际可用的模型。尽管目前的实验数据不错,后续我们还将进一步提升效果,希望最终可以变成一个可以完全自动化的模型。

群里已经分享了60篇干货

没有代码的量化都是耍流氓

在后台输入

20181120

责任编辑:

神经网络预测股价python talib_用机器学习来预测股价(代码+文档)——2018年iNTUtion决赛大作!...相关推荐

  1. Python使用标准库zipfile+re提取docx文档中超链接文本和链接地址

    推荐教材: <Python程序设计实用教程>,ISBN:978-7-5635-6065-3,董付国,北京邮电大学出版社 教材封面: 全国各地新华书店有售 京东购买链接: 配套资源:教学大纲 ...

  2. python word 合并单元格_在word文档选项卡中检测合并单元格

    一点背景 我有一个软件规范,我需要以表格的形式解析需求.它们的格式也不总是相同的.我继承了一个python脚本,它使用win32com解析word文档,然后openpyxl将需求导出到excel文件, ...

  3. Python数据分析大作业 4000+字 图文分析文档 销售分析

    资源地址:Python数据分析大作业 4000+字 图文分析文档 销售分析 +完整python代码 数据来自某商场,具体商业数据保密 资源地址:Python数据分析大作业 4000+字 图文分析文档 ...

  4. Python数据分析与机器学习45- 股票预测

    文章目录 一. 股票数据下载 1.1 AKshare介绍 1.2 安装AKShare 1.3 如何使用AKShare? 1.3.1 获取股票实时的交易数据 1.3.2 获取股票历史行情数据 二. 股票 ...

  5. 初学者怎样看懂python代码_Python零基础入门-(如何让人读懂你的代码)文档注释

    目标注释的作用 单行注释(行注释) 多行注释(块注释) 01. 注释的作用使用用自己熟悉的语言,在程序中对某些代码进行标注说明,增强程序的可读性 02. 单行注释(行注释)以 # 开头,# 右边的所有 ...

  6. python语法手册chm-python3.5.2官方帮助文档 参考手册(CHM版)

    python3.5.2官方帮助文档 参考手册(CHM版) python3.5.2官方帮助文档 参考手册(CHM版),欢迎下载! 新语法特性: PEP 492,具有async和await语法的协同程序. ...

  7. python开源项目博客_Blog_mini首页、文档和下载 - Python Flask开源博客 - OSCHINA - 中文开源技术交流社区...

    使用Blog_mini,你完全不用担心博客的管理问题! Blog_mini是一个用Python Flask开发的,拥有简洁页面(支持响应式布局!)和强大后台管理功能的开源博客系统,使用Blog_min ...

  8. python获取天气信息写入原有的excel文档

    最近想统计对比全国各大城市的天气,先把他记录下来,于是通过python脚本来获取每天的天气信息. 注意首先要创建一个excel文档,并且包含一个sheet1工作薄. 代码如下: #coding:utf ...

  9. python手机销售系统详细设计_数据库详细设计文档 .doc

    [原创]定制代写r/python/spss/matlab/WEKA/sas/sql/C++/stata/eviews数据挖掘和统计分析可视化调研报告等服务(附代码数据), 咨询邮箱: 30253934 ...

最新文章

  1. 如何用Netty实现一个轻量级的HTTP代理服务器
  2. 利用scipy包计算表格线的峰值,还原表格得到表格结构
  3. 华为手机应用鸿蒙os,华为手机内置应用逐渐向鸿蒙 OS 靠拢
  4. sed命令 linux下的超强查找和替换命令
  5. 使用TryParse()来执行数值转换
  6. 使用Maven在jar中包含依赖项
  7. pyaudio 声音处理
  8. u深度重装系统详细教程_u深度u盘启动盘装win10教程
  9. postgresql开启日志
  10. 浪潮服务器 U盘安装 Windows server 2016系统
  11. 如何写好一份数据分析报告?
  12. 那些著名的网络攻击事件 一
  13. 文创样机大合集100套,设计师必备
  14. 中断向量表 异常相量表 中断向量(中断函数入口地址)ARM和X86异常向量表不同
  15. 用php和mysql开发招聘网站
  16. Python实战 | 如何一次检查大量网页是否更新?
  17. 盒图(N-S图)级相关例子
  18. cs反恐特警3d版2java_CS反恐特警增值版
  19. 剑灵认证服务器系统出错,剑灵手游程序错误怎么办 和服务器断开官方解决
  20. 写轮眼常见的一些问题

热门文章

  1. 通过BAPI方式展示长文本ADA_POPUP_WITH_TABLE
  2. 【案例】长安汽车:构建全资产安全治理平台,夯实汽车行业数据安全基底
  3. 腾讯游戏扫码登录源码
  4. C++ Learning 3
  5. 软件测试 — 常见的端口整理
  6. Sniper模拟器的安装
  7. Excel中的格式刷如何使用?
  8. java 给word加水印,Java 实现在线给word 文档添加水印
  9. 45.0.概率论与数理统计-区间估计,枢轴量法
  10. python的flask框架