机器学习股票价格预测初级实战

原文连接python

个人GitHub博客地址git

上一篇文章,我用了4000字这样比较长的篇幅,介绍了一些金融和量化交易相关的基本知识,还大概说了下人工智能在金融方面使用的优劣。这篇文章咱们将用一个具体代码来进行一波股票价格预测的实战。github

以前也说了,量化交易自己只是一种交易模式,只要在量化交易软件中输入了策略,计算机就会根据策略进行自动化交易。咱们机器学习生成的不过是量化交易步骤中的策略阶段,暂时咱们不用考虑交易方面的接入,这个涉及到不少交易 API 相关的知识。交易平台开发框架,我介绍一个Github上基于Python的开源框架,你们能够了解一下:vnpy算法

OK,下面我就把关注点集中在价格预测这件事上。咱们都知道,不论用机器学习作什么,首先咱们得须要一些数据源,而且还须要有一些途径来进行回测。那么像股票或者其余金融盘口的数据是有不少途径能够获取的,我今天给你们介绍一个我平时常常用的平台:RiceQuant米筐量化交易平台(非广告)。c#

这个平台有本身的一套Python API和编译器iPython NoteBook来进行量化交易策略的开发。代码只须要在特定的方法内实现好逻辑,就能够一键生成测试结果,结果会自动的解析出回测收益曲线以及一些指标来给你参考。就像这样api

具体的API我就很少介绍了,有兴趣的同窗能够直接去官网查看API文档,很是详细。www.ricequant.com/api/python/…app

在这里,我将经过数据进行一些简单的机器学习操做,并无用到可以获得回测的那些API。须要提早了解的一个API就是get_price函数,好比下面这句话就表明了获取CSI300指数过去一年的原始历史数据,返回类型是咱们很是熟悉的pandas中的DataFrame。框架

df = get_price('CSI300.INDX','2005-01-05','2015-01-01').reset_index()[['open','close']]
复制代码

这个函数只能在米筐线上编译器中使用。咱们拿到这个数据,就能够经过Python数据分析三剑客来进行花式操做了。咱们这里用一些比较简单的特征来进行咱们的预测。那就是前两天的涨跌幅,把前两天的涨跌幅做为特征输入,再把该天的实际涨跌幅做为输出,这样的一组数据做为训练样本。机器学习

固然了,这种特征的选择是很是简单的,预测结果确定不够理想,实际工程中,特征的定性和定量是最重要也是最复杂的,好比行情都会有不少指标,像MACD、VR,都是很重要的指标,咱们这里这样选择特征只是为了方便演示。函数

既然咱们是经过涨跌幅来做为特征,首先得把涨跌幅这个数据给弄出来,刚刚经过 get_price 得到的是每一天的开盘和收盘价格,那么计算涨跌幅就简单了

>>> up_and_down=df['close']-df['open'] > 0 # 获取涨跌状况
>>> rate_of_return = (df['close']-df['open'])/df['open'] # 获取涨跌幅
>>> up_and_down_statistic = up_and_down.value_counts() # 获取涨跌天数
复制代码

而后,咱们使用matplotlib.pyplot来绘制下涨跌天数的柱状图

很奇怪,在ipython notebook使用pyplot有时候会画出来弯曲的,将就看咯

从图上咱们能够清晰的看出来,这10年中,最后收盘价是涨的状况仍是偏多一点的。咱们还能够看一些别的数据,好比咱们就打印一下天天涨跌图。

rate_of_return.plot(kind='line', style='k--', figsize=(15, 10), title='Daily Yield Changes Over Time Series')
复制代码

从这个图咱们就能够比较清晰的看出来这2000多的交易日里面的一些行情状况了,好比中间有段宽幅波动奇大的区间,这说明这会是个牛市,对应到07年那会的牛市。我还记得那会我刚上初中,天天中午回家,我爸爸就告诉我他今天股票又赚了多少多少钱,可开心。

固然了,你还能够利用画图进行更多的数据分析,下面咱们将编写一个简单的机器学习代码,看看使用这样一个简单的特征,这段数据跑下来,能有多少的价格预测正确率。

咱们在这里预测的是收盘涨跌状况,是个分类问题,因此咱们这里选择SVM来进行分类。每一个新数据都会被再次进行fit拟合以便提升下次预测的准确率。代码以下:

import pandas as pd
import numpy as np
from __future__ import division  
from sklearn import svm
from collections import deque
import matplotlib.pyplot as plt

window = 2
# 米筐获取某一品种历史数据的DataFrame,注意得从2005-01-04开始
df = get_price('CSI300.INDX', '2005-01-05', '2015-07-25').reset_index()[['open', 'close']]
up_and_down = df['close'] - df['open'] > 0
print(len(up_and_down))
X = deque()
y = deque()
clf = svm.LinearSVC() # SVM
prediction = 0
test_num = 0 # 测试总数
win_num = 0 # 正确预测数

current_index = 400 # 起始位置

for current_index in range(current_index, len(up_and_down)-1, 1):
 fact = up_and_down[current_index+1]
       
 X.append(list(up_and_down[(current_index-window): current_index]))
 y.append(up_and_down[current_index])
 if len(y) > 100 and len(y) % 50 == 0:
   test_num += 1
   clf.fit(X, y)
   
   prediction = clf.predict(list(up_and_down[(current_index-window+1): current_index+1]))
       
   if prediction[0] == fact:
     win_num += 1
     print(win_num)
     
print("预测准确率为",win_num/test_num)
复制代码

最后输出的结果为58.53%,若是一个价格预测软件仅经过历史数据就能达到百分之60左右的正确率,实际上这已是一个很是不错的结果了,不过咱们这里的结果说服力不够强,首先咱们的特征过于简单,再有就是为了节省训练时间,实际上我把样本的拟合规模缩短了不少,我只在50的倍数位置进行预测,因此我最终的预测样本数量大概只有40来个。

上面的代码部分参考了米筐社区中一位叫陆东旭的同窗。这个社区如今仍是挺活跃的,我看的帖子仍是三年前的。能够说,早在几年前,国内就有这样量化交易和AI的社区了,可见前人们早已在路上,等到咱们都认为须要去接触这些东西的时候,他们已经跑的更加远了。

不过不要紧,后来者居上,也是一件挺有意思的事。

上面的代码其实是最粗暴和原始的代码,经过本身写循环未免也太麻烦了,因此这个平台后来更新了 API,就像我文章开头说的那样,只须要在提供好的空方法里填充逻辑,就能够快速的进行回测操做了。好比下面就是官方的API文档介绍。

# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间作传递。
def init(context):
   context.s1 = "000001.XSHE"
   # 是否已发送了order
   context.fired = False

# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
   # 开始编写你的主要的算法逻辑

   # bar_dict[order_book_id] 能够拿到某个证券的bar信息
   # context.portfolio 能够拿到如今的投资组合状态信息

   # 使用order_shares(id_or_ins, amount)方法进行落单

   # TODO: 开始编写你的算法吧!
   if not context.fired:
       # order_percent而且传入1表明买入该股票而且使其占有投资组合的100%
       order_percent(context.s1, 1)
       context.fired = True
复制代码

好了,今天就是简单的经过米筐来介绍下如何经过一些第三方数据获取API,并结合 Python 的数据分析库来作一些有趣的事情。下篇文章再见咯!


推荐阅读

机器学习股票价格预测从爬虫到预测(数据爬取部分)

分享一些学习AI的小干货

量化交易与人工智能究竟是咋回事

关注公众号获取更多干货文章-AI极客研修站

相关文章
相关标签/搜索