【导读】近期,意大利公数据科学家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方法中选择的作为情感代理的值是对立的,计算公式如下:
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
-END-
专 · 知
人工智能领域主题知识资料查看获取:【专知荟萃】人工智能领域25个主题知识资料全集(入门/进阶/论文/综述/视频/专家等)
同时欢迎各位用户进行专知投稿,详情请点击:
【诚邀】专知诚挚邀请各位专业者加入AI创作者计划!了解使用专知!
请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料!
请扫一扫如下二维码关注我们的公众号,获取人工智能的专业知识!
请加专知小助手微信(Rancho_Fang),加入专知主题人工智能群交流!
点击“阅读原文”,使用专知!