前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【干货】基于TensorFlow卷积神经网络的短期股票预测

【干货】基于TensorFlow卷积神经网络的短期股票预测

作者头像
WZEARW
发布2018-04-11 16:14:26
2.8K0
发布2018-04-11 16:14:26
举报
文章被收录于专栏:专知

【导读】近期,意大利公数据科学家Mattia Brusamento撰写了基于Tensorflow卷积网络的

短期股票预测教程,在这篇博文中,你将会看到使用卷积神经网络进行股票市场预测的一个应用案例,主要是使用CNN将股票价格与情感分析结合,来进行股票市场预测,CNN网络通过TensorFlow实现。博文一步步展示了从数据集创建、CNN训练以及对模型评估等等入手,带你进入基于TensorFlow实现的股票市场预测分析。

▌摘要


在机器学习中,卷积神经网络(CNN)是已经成功地应用于计算机视觉任务中的一类神经网络。在这个项目中,我将使用CNN将股票价格与情感分析结合,来进行股票市场预测。本文CNN网络的实现是利用TensorFlow来实现的。在本文中,我将按以下步骤进行阐述:数据集创建、CNN训练和对模型评估。

  • 数据集:

在本节中,简要描述了构建数据集、数据源和情感分析的过程。

  • Tick 数据(买单/买单数据)

为了构建数据集,我首先选择了一个行业,然后专注于研究该行业。我决定选取卫生健康领域在2016年1月4日至2017年9月30日期间数据,并将它们分为训练集和评估集。特别值得一提的是,这些Tick 数据是从nasdaq.com网站上下载的,只保留那些非常大或中等市值的公司。从这些Tick 数据开始,股票和新闻数据分别使用Google财经和内部的API进行检索。

  • 股票数据:

正如前面提到的,从Google财经历史API中检索股票数据。

"https://finance.google.com/finance/historical?q={tick}&startdate={startdate}&output=csv",(对于表中的每个tick)

时间单位是一天,我所保留的值是收盘价。为了训练,使用线性插值(pandas.DataFrame.interpolate)填充缺失的天数:

  • 新闻数据和情感分类:

为了检索新闻,我使用intrinio的API。对于每个tick,我从“https://api.intrinio.com/news.csv?ticker={tick}”下载相关的新闻数据。数据以csv格式显示,如下图:

TICKER,FIGI_TICKER,FIGI,TITLE,PUBLICATION_DATE,URL,SUMMARY,例子如下

我们会根据标题已经删除了重复的新闻。最后,TICKER, PUBLICATION_DATE 和 SUMMARY列被保留。

情绪分析在SUMMARY列上进行,使用Loughran和McDonald 金融情感字典进行金融情绪分析,在pythonntiment python库中实现。

这个库提供了一个tokenizer,它也执行词干还原和停用词的删除,以及一个标记化的文本评分的方法。从get_score方法中选择的作为情感代理的值是对立的,计算公式如下:

代码语言:javascript
复制
import pysentiment as ps
 
lm = ps.LM()
df_news['SUMMARY_SCORES'] =df_news.SUMMARY.map(lambda x: lm.get_score(lm.tokenize(str(x))))
df_news['POLARITY'] =df_news['SUMMARY_SCORES'].map(lambda x: x['Polarity'])

没有新闻的日期用0极性填充。

最后,数据被TICK和日期分组,总结了TICK有多个消息的日期的极性分数。

  • 完整数据集:

通过合并股票和新闻数据,我们得到如下的数据集,从2016-01-04到2017-09-30的所有日期划分为154个刻度,并且股票的收盘价和极性值分别为:

  • 基于TensorFlow的CNN:

为了在Tensorflow中实现卷积神经网络,我使用了官方教程作为参考。

(https://www.tensorflow.org/tutorials/layers)

它展示了如何使用层来构建卷积神经网络模型并识别MNIST数据集中的手写数字。为了应用于我们的工作,我们需要调整我们的输入数据和网络。

  • 数据建模:

输入数据这样来建模:单个特征元素是一个154x100x2张量:

  • 154ticks
  • 100个连续交易日
  • 2个通道,一种是股票价格,一种是极性值

Lables被建模为长度154的向量,如果第二天的股票价格上升,其中每个元素都是1,否则是0。

这样,就有了一个包含100天的时间滑动窗口,所以前100天不能用作标签。训练集包含435个条目,而评估集数目为100。

  • 基卷积神经网络:

已经从TensorFlow教程的例子开始构建CNN,然后使之适用于我们的任务。前两层卷积层和pooling层的高度都等于1,因此它们对单个股票进行卷积和汇集,最后一层的高度等于154,以了解股票之间的相关性。最后是密集层,最后一个长度为154,每个股票对应一个。网络的规模可以用笔记本电脑在数据集上进行几个小时的训练。部分代码如下:

  • 评估:

为了评估模型的性能,我们没有使用标准的度量方法,但是已经建立了一个更接近于模型实际应用的模拟。

假定以初始资本(C)等于1开始,对于评估集的每一天,我们将资本分成N个等份,其中N从1到154。 我们把C / N放在我们模型预测的具有最高概率的前N个股票上,其他的0个。 此时我们有一个代表我们每天分配的向量A,我们可以计算每日收益/损失,用A乘以当天每个股票的百分比变化。 我们用户一个新的资本C = C +delta,我们可以在第二天再投资。 最后,我们会得到大于或小于1的资本,这取决于我们的选择的优劣。

该模型的一个良好的baseline已经在N = 154中被确定:这代表了所有股票的通用表现,它模拟了我们在所有股票上平均分配资本的情景。这产生了大约4.27%的收益。

出于评估的目的,数据已经得到纠正,消除了市场关闭的日期。

对于不同N的取值,模型性能表现如下图:

红色虚线表示的是0基线,而橙色的线是N=154的基线。最好的表现是在N=12的情况下获得的,其收益约为8.41%,几乎是市场基线的两倍。对于几乎每个大于10的N,都有一个不错的表现,都比基线好,而N太小会降低性能。

  • 结论:

第一次尝试Tensorflow和CNN并将其应用到财务数据中是非常有趣的。这是一个玩具型例子(非实用性的),使用相当小的数据集和网络结构,但它显示了这个模型的潜力。

请随时提供反馈和意见,或在LinkedIn上与我联系。

  • 个人简历:

Mattia获得了米兰理工大学计算机(ComputerEngineering from Politecnico di Milano)工程硕士学位,之后在代尔夫特理工大学(TUDelft)从事推荐系统。Mattia现在在一家意大利公司担任网络安全领域的数据科学家。

▌相关文献


  • Understanding Deep Convolutional Neural Networks with a practical use-case in Tensorflow and Keras
  • Exploring Recurrent Neural Networks
  • Data Scientist: The Hottest Job on Wall Street

参考链接:

https://www.kdnuggets.com/2017/12/tensorflow-short-term-stocks-prediction.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 专知 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档