关注:决策智能与机器学习,深耕AI脱水干货

者 | Mat Steininger

源 |  Towards data science

前言

你有没有听人说过,他们多么希望能回到过去,投资苹果或亚马逊?好吧,他们做不到,而且无论他们花多少时间在股市,他们都不会预测下一个快速致富的投资。事实上,如果你沉迷股市,你可能会在一周内破产,这是我在这篇文章中唯一能保证的。

然而,让我们看看,我们是否可以使用直接的量化金融和机器学习的概念,是否可以在一定程度上准确的预测股票走势。在本教程中,我们将看看我们是否能够准确地预测特定股票的短期走势。

什么是量化金融?

量化金融是利用大数据集和数学模型来分析金融市场。假设我们有一堆公式可以让我们更好地理解某只股票,我们用它们来猜测预测趋势,这就是量化金融。如果我发现了任何开创性的指标、公式或模型,那我肯定是在撒谎,但让我们看看我们是否能自己创造,或许在未来,能从中赚钱。最终,我们或许能够将《华尔街之狼》(The Wolf of Wall Street)中的乔丹•贝尔福特(Jordan Belfort)变成一种算法。

交易术语

我将使用一些投资和交易领域特有的术语,所以如果你有任何不确定,不要害怕去检索术语。我不是金融专家,所以我会尽量少用。

以下是一些你应该知道的术语:

  • 指标:表示股票价格趋势的统计数据

  • 标准普尔500指数:500家最大上市公司的加权指数

  • 短期走势:股票的30天趋势

  • 移动平均线:一段时间内股票收盘价的平均

收集数据

所有好的数据科学项目都依赖于输入数据的质量。幸运的是,由于股票交易的性质,我们可以使用pandas-datareader(熊猫的一个扩展,内置web抓取功能)和令人惊讶的不朽的Yahoo!金融网站。

import pandas_datareader as pdr
import datetime
# We can choose any date up to that stock’s IPO
start = datetime.datetime(2014, 1, 1)
# Up to most recent data
end = datetime.date.today()
# We’ll look at F which is Ford
stock = ‘F’
pdr.DataReader(stock, ‘yahoo’, start, end)
# This returns a data frame of scraped stock data from yahoo

这样我们就完成率任何数据科学应用程序中最简单也是最重要的部分,只需几行简单的代码即可完成。我们可以进一步扩展这一点,从任何股票收集数据,只使用他们的股票代码。例如,在我们的应用程序中,我们收集了所有标普股票的数据。

简单的分析

在量化金融中,最简单的趋势指标是交叉。交叉被定义为当短移动平均线穿过长移动平均线。在这个分析中,我们将使用简单移动平均线(所有收盘价加权相等)和指数移动平均线(加权较新的价格更大)。然后,当我们的脚本检测到交叉时,我们将执行交易。

当空头移动平均线从高于多头移动平均线到低于多头移动平均线,这是一个交叉点,表示卖出(或卖空)机会,反之亦然,表示买入(或多头)机会。

移动平均交叉的图示

当我们的脚本检测到有利于股票上涨的交叉时,买入被触发,反之亦然。然后,使用回溯分析,我们可以用历史数据测试我们的策略,甚至绘制我们算法所做的交易。

我们先来计算所有的移动平均线。对于我们的示例,我们将使用50和200天窗口的指数移动平均线。

import pandas as pd
# List where we will keep track of long and short average points
indicators = pd.DataFrame(index=data.index)
# 50 day
short_window = 50
# 200 day
long_window = 200
# Exponential moving averages using the closing data
indicators[‘short_avg’] = data[‘Close’].ewm(span=50, adjust=False).mean()
indicators[‘long_avg’] = data[‘Close’].ewm(span=200, adjust=False).mean()

交叉点和股票方向趋势(福特公司股票)

正如您所看到的,通过简单而有效的分析,我们的算法通常可以准确地预测趋势。算法可以利用期权交易,而不是典型的只有买卖机会的摆动交易,进一步利用这些波动。交叉是交易员最简单和最常用的技术指标之一,现在在算法交易的帮助下,你也可以。

机器学习

如果我们想利用我们的数据做出更好的预测呢?借助机器学习的美妙之处,我们可以创建一个模型,给出一个短期的价格预测,并且希望它在一定程度上是准确的。

我们将像以前一样开始收集数据,但是,这次我们将需要更多的数据。对于我们的模型,我们使用相同的API从所有标普500股票中收集了30年以上的股票数据,但是我们需要做更多的数据处理。

首先,我们需要一个目标变量,它可以是分类的,也可以是数值的。这个项目利用了相对于整体标准普尔500指数的变化百分比。这一点很重要,因为如果标准普尔500指数也上涨了10%,那么一只股票在30天内上涨10%就不重要了。例如,如果苹果股价上涨8%,而标准普尔500指数下跌2%,那么短期结果(我们的目标变量)将是10%,随后被归类为强烈买入。

# Getting the S&P 500 relative price difference.
SP = pdr.DataReader(‘SPY’, ‘yahoo’, start_time, end_time)
SP[‘sp_percent_change’] = SP[‘Adj Close’].pct_change(periods=1).astype(float)
data = data.merge(SP[‘sp_percent_change’], left_index=True, right_index=True)
data[‘percent_change’] = data[‘Adj Close’].pct_change(periods=1).astype(float)
# Daily percent change as compared to the S&P 500
data[‘relative_change’] = data[‘percent_change’] — data[‘sp_percent_change’]

现在我们有了一个包含所有训练数据的基本数据框架,我们可能需要添加更多的指标。这是因为我们的API以及我们的目标变量为我们的模型提供了每个实体只有有限数量的特性,因此无法预测趋势。像这样的机器学习模型需要一段时间的数据。因此,我们将不得不利用这些趋势和其他一些定量的财务指标增加更多的特性。

谢天谢地,像往常一样,有一个工具库可以为我们做这些。我们使用FinTA(金融技术分析),它能够计算76个交易指标使用我们所有的数据。理解每一个细节并不是完全必要的,但是可以帮助您最大限度地提高模型的准确性。在我们的模型中,我们使用了几个不同的移动平均线和强度指数,因为专家们最常使用这些指标来衡量市场的短期走势。

为了实现,我们只使用python的eval函数,因为它最容易快速实现所选的所有指示符方法,并将它们作为特性添加到我们的数据集。

from finta import TA
# Here are all indicators we are using
indicators = [‘SMA’, ‘SMM’, ‘SSMA’, ‘EMA’, ‘DEMA’, ‘TEMA’, ‘TRIMA’, ‘TRIX’, ‘VAMA’, ‘ER’, ‘KAMA’, ‘ZLEMA’, ‘WMA’, ‘HMA’, ‘EVWMA’, ‘VWAP’, ‘SMMA’, ‘MACD’, ‘PPO’, ‘VW_MACD’, ‘EV_MACD’, ‘MOM’, ‘ROC’, ‘RSI’, ‘IFT_RSI’]
df = None
# Using python’s eval function to create a method from a string instead of having every method defined
df = eval(‘TA.’ + indicator + ‘(data)’)
# Some method return series, so we can check to convert here
if not isinstance(df, pd.DataFrame):
df = df.to_frame()
# Appropriate labels on each column
df = df.add_prefix(indicator + ‘_’)
# Mege data frames based on the date
data = data.merge(df, left_index=True, right_index=True)

你可能会想,“这些特征中有一些不会制造不必要的噪音吗?”你是对的;然而,我们可以用几种方法来解决这个问题。我们可以收集更多的数据,我们已经做到了,并且/或者我们可以利用交叉验证,利用重新采样我们的数据来更好地概括我们的模型的预测。

制作模型

现在是我们如何完成预测的岔路口了。我们可以手工制作模型的其余部分;优化我们自己的超参数(它只是控制学习过程的参数)、标准化特性并使用不同的ML技术,或者我们可以自行处理这些问题。但是,如果您是ML新手,我强烈建议您遵循我们的代码并学习不同的技术,但是如果您对更大的自动优化感兴趣,您一定要查看Amazon Web Services SageMaker,特别是如果您有一些AWS学分的话。

创建SageMaker实验、模型和命令行的过程

SageMaker为您完成了构建、培训和部署ML模型的所有繁重工作,并且非常易于使用。他们有一些很好的教程,设置一个自动驾驶试验只是简单的点击几下。一旦完成,您就可以选择最好的模型并部署它。

部署AWS提供的SageMaker模型流程

不管你是使用基于回归的模型还是分类模型,买卖股票的核心问题是分类问题。但是,从一个回归模型开始,并对是否买入或卖出设置上限/下限的桶是有效的。在我们的模型中,我们使用与目标变量≥10和≤-10的预测评级相关联的标签“强烈购买”和“强烈销售”。购买和出售的分类与等级相关联(10)和(-10)分别和持有价值(5,5)。重要的是要注意,所有股票表现更好或比标准普尔500指数和持有只是用于预测,我们不能和足够高的预测精度。预测等级越高,我们对股票走势的信心就越大。例如,两只股票可能被列为强烈买入,但我们可以对拥有更高评级的那只更有信心。

分析

为了分析我们的模型的有效性,我们可以根据未经测试的数据验证我们的模型。我们可以创建的一个度量是一个预测区间(类似于置信区间),它将告诉我们在我们的预测的真实范围内具有高度的可信度。我们可以使用均方根误差,对我们来说是8.91,所以80%的预测区间就是预测评级±8.91*1.28,等于预测评级±11.40。这意味着,我们有80%的信心认为,股市的实际相对表现将在我们预测的11.40以内。

值得注意的是,我们的区间使用的均方误差,没有考虑超出预期的上限或下限区间。例如,预测为10和实际短结果为30的短结果与短结果为-10的短结果相同,即使第二个结果不那么幸运,其平方误差也将相同。但是,如果我们单独分析每个标签,我们可以创建更具体的预测区间。

由模型预测的每个标签的预测区间

我们还可以创建混淆矩阵,使我们能够可视化每个结果的预测模型在统计上的成功。通过分解预测买入或卖出的可能结果(我们忽略持有预测,因为它的高度不确定性),我们可以明确地可视化我们的正确性比率。例如,在预测卖出和实际卖出单元中值最高的混淆矩阵意味着模型预测的卖出结果比买入结果更准确。下面是在未经测试的数据上验证我们的模型的结果,每只标普500股票都代表:

  • 强大的买/卖分类,准确预测正确趋势的67.6%

  • 使用任何买卖分类预测正确趋势的准确性为55.8%

  • 强大的买卖混淆矩阵

  • 购买/出售混淆矩阵

总结

机器学习是一种非常强大的技术,可以利用历史数据做出预测,股票市场就是一个很好的应用。然而,重要的是要注意,股票市场通常是非常不可预测的,技术分析应该总是遵循基本面分析,而且我有义务说,这些都不应该用作财务建议。

恭喜!如果你继续做下去,你的模型现在可以与之前发布的预测短期股票走势的模型相媲美。我们取得了类似的成功,因为我们利用了大量的可用数据和几种类型的指标。这表明在数据科学领域,数量绝对驱动质量。

交流合作

请加微信号:yan_kylin_phenix注明姓名+单位+从业方向+地点,非诚勿扰。

DEMO | AI预测股票短期走势「AI工程论」相关推荐

  1. AI人工智能洗稿「OpenAI GPT-3模型」

    GPT-3模型达到千亿级参数:语言模型仍然可以是算术和编程,君子喻于义,小人喻于利.人类和ai相比有什么优势,与专用AI相比会高枕无忧,GPT-3更"通用":在这个过程中也许情同手 ...

  2. 法国队夺了世界杯冠军,却彻底打了AI预测的脸

    此前,高盛.瑞银.多蒙德大学等都利用AI技术对2018俄罗斯世界杯进行预测.比赛结果却大相径庭:高盛认为巴西最终会捧起大力神杯,瑞银推断是德国.AI预测足球赛,还没那么准. 随着法国和克罗地亚的决赛, ...

  3. 商汤“变法”:推中小学AI教材,mini自驾车,要打造AI时代的「清明上河图」...

    作者 | 阿司匹林 出品 | AI科技大本营(ID:rgznai100) 2019 年的进度条已经近半,这次商汤带来了一场令人"眼花缭乱"的发布会,一口气推出了覆盖五大行业的 11 ...

  4. AI预测的七宗致命罪恶

    摘要:作者比较理性和冷静地分析了AI预测,阐述了AI预测的七宗致命罪恶,文章其实也是表明人类真的不擅长预测.以下是译文. 错误的推断,有限的想象力,以及其他通常会犯的错误,都会使得我们很难更富有成效地 ...

  5. 百度发力AI药物发现领域,“AI生态型”公司“名副其实”?

    文|智能相对论(aixdlun) ​作者|青月 1956年,达特茅斯会议正式提出了AI的概念.六十多年过去了,AI行业起起伏伏,历经三起三落,在今年两会期间,AI再一次成为重要议题.在AI产业热闹非凡 ...

  6. 深圳即将启动首届「全国人工智能大赛」:超过 500 万大奖 政府资助,潜信息你读懂了吗!

    深圳即将启动首届「全国人工智能大赛」:超过 500 万大奖 & 政府资助,潜信息你读懂了吗! 人工智能加速"视频/视觉"发展,近期,深圳市即将迎来人工智能领域权威赛事之一- ...

  7. 下一个视觉「杀手级应用」来了,依图行人重识别ReID性能创纪录

    人脸识别之后的下一个风口是什么? 对于这个问题,业界似乎早已有了共识.从 AI 的人脸识别能力超越人类以来,学术界和产业界的目光逐渐转向另一个更具科研意义和应用价值的课题--行人重识别(Person ...

  8. 服务器被挤爆!9.9元解锁写真大片,「妙鸭相机」打脸海马体!

    整理 | 朱珂欣 出品 | CSDN程序人生(ID:coder_life) 拥有一套高品质的写真需要多少钱?699?1299?3999? 「妙鸭相机」的回答是:9.9 元! 近日,上线仅一周的「妙鸭相 ...

  9. 分享预告:「数据安全问题」+「 股权与期权」

    这些点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 本周星球分享话题预告 - 技术人系列:一个给阿里提的 ...

最新文章

  1. MySQL—更改索引
  2. html在线压缩tar.gz源码,c50_melp.tar.gz美国2400语音压缩编码算法,文件…
  3. Android Studio 插件开发详解三:翻译插件实战
  4. C语言中的转义字符【转ce123的技术博客】
  5. 最受欢迎中文机器学习课程,台大李宏毅老师公开课2019版上线!
  6. python动态规划算法最大k乘积_C语言使用DP动态规划思想解最大K乘积与乘积最大问题...
  7. 墙裂推荐 | 漫画解读Elasticsearch原理,看完你就懂
  8. Java编程:贪心算法
  9. 20191202每日一句
  10. linux中sendto函数路径,发送原始数据包时,sendto函数不使用struct sockaddr_ll中提供的MAC地址...
  11. (转)做好产品需求文档的10步
  12. 三阶魔方没有。四阶魔方 有的公式
  13. 深度学习入门笔记(十):正则化
  14. 【启动usb摄像头时出现的问题】
  15. 最全Mac系统快捷键一览 学会了一秒变大神!
  16. Nuxt 整合 element-tiptap 编辑器 上传图片到阿里云OSS关键方法
  17. Activiti之命令拦截器
  18. ArcGIS API+Canvas +Vue框架 制作前端地图打印功能
  19. wps云同步无法连接服务器_WPS云文档链接分享后对方没有访问权限?解决办法在此...
  20. php评论盖楼怎么实现,评论区设计(一):如何做好盖楼式评论?

热门文章

  1. 高并发采坑之路-----linux学习-----VMware虚拟机安装及介绍1
  2. java 圈复杂度_追求代码质量: 监视圈复杂度
  3. 券商要知道的港美股软件交易系统板块展示图
  4. 用libevent实现httpserver
  5. [转]奥斯卡王尔德(Oscar Wilde)有很多让人玩味的幽默的话
  6. 千方科技:阿里网络36亿元受让15%股份 成第二大股东
  7. US Domain Center SEO 搜索引擎优化
  8. 解决:org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request;
  9. 在培训班里学IT技术,真的有用吗?
  10. 数据库的三级模式与二级映像