python 预测算法_Python 与金融数据使用机器学习算法预测交易策略

记得 关注、分享、点在看 呀~ 这样您就能持续收到优质的推送啦
这一期,我们将使用上一期处理好的数据特征和标签训练机器,然后预测交易策略。我们将分别使用 K近邻算法和集成学习两种方法分别完成模型的训练和预测。
FinTech History

Python 与金融数据|股票数据的获取与可视化

Python 与金融数据|数据的滑动平均值及多图可视化

Python 与金融数据|数据的重采样与蜡烛图(K线图)的绘制

Python 与金融数据|网页爬取上证50股票代码

Python 与金融数据|批量抓取并保存上证50的交易数据

Python 与金融数据|上证50的收盘价汇总

Python 与金融数据|绘制股票间的相关性图表

Python 与金融数据|为机器学习预处理数据

Python 与金融数据|生成机器学习的标签和特征

f26de93ec44f6e3ab6f5ed7edc18f7f6.pngK近邻算法

在 Python 中有很多种免费的机器学习库,其中之一是 sklearn,是针对 Python 的免费软件机器学习库。

sklearn 具有各种分类,回归和聚类算法,包括支持向量机,随机森林,梯度提升,k均值和DBSCAN等内置方法。

K近邻算法是机器学习中比较简单的算法之一,在  sklearn 工具包中提供可以直接调用的方法。

K近邻算法是一个分类算法,可以把待分类的数据看作空间或者平面的一些点,如果一个样本点附近的K个最近的样本点大多数都是属于同一个类别,那么,这个样本点就也是属于这个类别。

与之前一样,使用一个特定的函数 doML() 来实现本期的内容,因为要使用上一期处理好的特征数据和标签来完成机器学习方法的训练,所以执行上一期的函数获取处理完成后的数据:

def doML(ticker):    X, y, dataFrame = extractFeaturesets(ticker)

接下来我们从所有的数据中划分出一部分来训练模型,另一部分的数据用来测试我们模型的准确性。

可以使用 train_test_split 这个方法来划分数据,这个方法来自于 sklearn 库,所以使用之前需要先导入这个方法:

from sklearn.model_selection import train_test_split

train_test_split 方法一般有三个参数,第一个参数为待划分的特征数据,第二个参数为待划分的标签数据,第三个参数为测试数据所占的比例,第三个参数的值是介于 0 和 1 之间:

XTrain, XTest, yTrain, yTest = train_test_split(X, y, test_size=0.25)

这里使用 X 作为特征数据,y 作为标签数据,随机取数据总量的 25% 作为测试数据。

接下来我们设置分类模型,这里选择 K近邻分类算法,前面说过,这是 sklearn 内置的一个方法,使用之前需要先导入一下:

from sklearn import neighbors

然后使用内置的 K近邻算法生成一个分类器 clf

clf = neighbors.KNeighborsClassifier()

下一步要做的就是训练模型,借助于 sklearn 这个机器学习库,训练模型也变得很简单:

clf.fit(XTrain, yTrain)

使用 fit 这个方法来训练模型,一般会有两个参数,第一个参数为训练用的特征数据,第二个参数为训练用的标签数据。

执行这行代码后,我们生成的分类器会自动用给定的数据按照既定的模型完成训练。

还记得前面我们除了生成训练数据,还生成了测试数据吗?这时就可以使用测试数据来测试训练好的模型的准确度,使用 score 这个方法可以返回测试测准确率。

这个方法一般有两个参数,分别为测试用的特征数据和测试用的标签数据:

confidence = clf.score(XTest, yTest)

这个方法会首先将特征数据作为输入,使用训练好的模型去给这些特征数据分类,也就是获取每组数据对应的标签。然后会将预测出来的结果与测试数据中的标签数据比对,得到并返回一个准确率。

获取了测试的准确率后,为了让结果更直观,我们把准确率输出:

print('Accuracy:', confidence)

完成了模型的训练,就可以对数据进行分类预测了。例如我们给定测试用的特征数据 XTest,使用 predict 方法就可以完成对特征数据的分类:

predictions = clf.predict(XTest)

根据我们的训练数据,这里得到的结果实际上是由 0、1 和 -1 这三个数构成的列表,根据前面的分析,0表示继续持有,1 表示买入,-1表示卖出。

为了更直观的展示结果,我们使用  统计每个数出现的次数并将其输出:

print('Predicted Spread:', Counter(predictions))

这样就完成了是用 K近邻算法预测交易策略。接下来调用 doML 这个函数,使用 '600036.SS' 这支股票来验证一下:

doML('600036.SS')

观察到的参考输出为:

dataSpread: Counter({1: 1104, -1: 1082, 0: 463})Accuracy: 0.41389728096676737Predicted Spread: Counter({-1: 340, 1: 200, 0: 122})

因为每次使用的训练数据都是随机选取的,所以每次得到的准确率可能都不太一样。

这里我们得到的准确率是 41% 左右。对于随机生成的测试数据,预测则结果是由 340 天是建议卖出,200天建议买入,122天建议继续持有。

如果实际中,我们想要去预测当日的策略,只需要用之前的交易数据去训练模型,然后得到当日的特征数据,将特征数据输入训练好的模型,就可以看到使用 K近邻分类算法输出的建议交易策略了。

如果在某次的训练过程中,获取到的准确率比较高,还可以将这一次训练的模型保存为 pickle 格式,以后需要使用的时候只需要直接获取这个模型即可。

c71dfe6452bd0c5ecce15c97458aefac.png

集成学习

集成学习实际上就是分类器的集成,就是构建多个机器学习模型来完成学习任务。机器学习有很多种模型,对于同一个问题,每一种模型都会产生不同的预测结果。对于多种模型预测结果如何选择最合适的一个结果呢?这就是集成学习要解决的问题之一:

把多种算法集中起来,每种算法都会有一个自己的预测结果,然后对每种算法的结果进行评估投票,综合选择出最好的结果。

在 sklearn 中提供一个封装好的集成学习方法 VotingClassifier,按照惯例,使用之前先导入相关的库文件:

from sklearn.ensemble import VotingClassifier

在构建集成学习的分类器之前,首先按照第一部分的方法导入处理好的数据并获取训练集和测试集:

def doML(ticker):    X, y, dataFrame = extractFeaturesets(ticker)    XTrain, XTest, yTrain, yTest = train_test_split(X, y, test_size=0.25)

然后开始构建集成学习分类器,这里我们集成使用三种分类方法:

线性支持向量机、K近邻算法和随机森林分类算法。

支持向量机是一种二类分类模型。它的基本思想是在特征空间中寻找间隔最大的分离超平面使数据得到高效的二分类。

随机森林分类算法指的是利用多个决策树对样本进行训练并预测的一种分类器。

这是三种比较常见的分类算法,在 sklearn 中都提供了可以直接调用的方法。如果使用线性支持向量机需要导入以下工具包:

from sklearn import svm

使用 K近邻算法 需要导入以下工具包:

from sklearn import neighbors

使用 随机森林算法 需要导入以下工具包:

from sklearn.ensemble import RandomForestClassifier

想要使用集成学习,只需要添加以下代码:

clf = VotingClassifier([('lsvc', svm.LinearSVC()),                            ('knn', neighbors.KNeighborsClassifier()),                            ('rfor', RandomForestClassifier())]                            )

这样就完成了集成学习分类器的构建,接下里只需要按照与上一部分相同的方法用处理好的数据训练并验证模型:

clf.fit(XTrain, yTrain)confidence = clf.score(XTest, yTest)print('Accuracy:', confidence)

最后完成模型的预测并输出结果:

predictions = clf.predict(XTest)print('Predicted Spread:', Counter(predictions))

最后我们同样用 '600036.SS' 这支股票来验证集成学习的预测结果,输出内容如下:

dataSpread: Counter({1: 1104, -1: 1082, 0: 463})Accuracy: 0.4501510574018127Predicted Spread: Counter({-1: 390, 1: 270, 0: 2})

这里预测的准确性可以达到 45%。对于这支股票,在测试集合中,集成学习方法预测的结果是有 390天 建议卖出,有 270天 建议买入,有 2 天建议继续持有。

一般来说,使用集成学习预测的结果会比使用单一模型的预测结果好一些。

同样的,如果希望预测其他时间点的交易策略,只需要更新测试数据样本就可以了。

823bb69839c5fbcfa895914b27f21612.png

参考代码

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@author:  IT信息教室(微信公众号)订阅/关注,在看、分享三连吧~"""from collections import Counterfrom sklearn import svm, neighborsfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import VotingClassifier, RandomForestClassifierdef doML(ticker):    X, y, dataFrame = extractFeaturesets(ticker)    XTrain, XTest, yTrain, yTest = train_test_split(X, y, test_size=0.25)    # print(len(XTrain[0]), len(XTest[0]))    # print(yTrain, yTest)        # 构建集成学习分类器,使用的分类算法有 线性支持向量机、K近邻算法和随机森林算法。    clf = VotingClassifier([('lsvc', svm.LinearSVC()),                            ('knn', neighbors.KNeighborsClassifier()),                            ('rfor', RandomForestClassifier())]                            )    # 构建 K近邻算法的分类器    # clf = neighbors.KNeighborsClassifier()    clf.fit(XTrain, yTrain)    confidence = clf.score(XTest, yTest)        print('Accuracy:', confidence)    predictions = clf.predict(XTest)    print('Predicted Spread:', Counter(predictions))    print()    print()    doML('600036.SS')doML('601328.SS')doML('600340.SS')

Codes: M先森看世界Edit: M先森看世界
bc432e75bfd8c16899f2c562c15d74eb.gif9b03f09b6aabf5468f8d16465384c88d.png58ab0196f5b45c9762dc491b38909632.png0f4753d552eb68ea08d2efe45f1793de.png3b91286094915829a0783b8d66938d33.pngb91b5ecf97f3fee9a1cef4c275ab8bf3.png4d814b6d450f26ae7d57c5393b670840.png
ONE MORE THING

如果您对内容有什么需求建议,或者遇到了什么软件、应用使用方面的问题,请直接在公众号主界面下发私信给我,我看都会及时回复。感谢大家的支持!


合作: classroom.it@hotmail.com

d6e6ede35b0786455782f8b6df383a5c.gif

Hi

你好呀

我是 M先森 

这是一个共同学习的平台

我会把我会的 你们想学的

做成教程或者写成文章
我们在这一起学英语 

学编程 学算法

学各种各样

好玩的好用的软件

记得要常回来看看呀

(^_^)a(^_^)a


点击 阅读原文 查看Python入门教程~

喜欢就点个 分享 点赞 在看 三连吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 存储过程插入慢_mysql存储过程太慢怎么办

mysql存储过程太慢的解决方法:首先打开my.cnf配置文件;然后添加配置【long_query_time1】;接着通过【tail -f /tmp/logs/mysqld.log】命令监控sql;最后进行针对性的优化即可。解决方法:第一步:修改/etc/my.…

导出远程mysql数据库中的表_shell脚本实现导出远程mysql数据库表数据至本地

bin/main.sh脚本内容 #!/bin/bash#作用:用于同步远程mysql数据库表数据至本地#作者:丁艺博source /etc/profilesource ~/.bash_profileexport LANGen_US.UTF-8export RUN_HOME$(cd "$(dirname "$0")"; echo "${PWD%/*}")s…

商业智能解决方案_格至智能开关:简单便捷的商业智能照明解决方案

美莱恩智能照明推出的格至智能调光开关,是一款便捷、可轻松实现扩展的智能照明系统。它能够节约能源,并在为各种空间工作或者学习的人们,营造最舒适的照明环境。借助美莱恩SLT单火线传输技术,在新建或者改造项目中,你将…

vue 安装 less_解决旧Vue项目升级less-loader 6.0.0报错

作为一个爱折腾的主,我的package随时都是ncu -u! 何为ncu,就是检查nodejs npm/yarn项目依赖最新版本package.json一个插件! 这不,前几天less-loader 升级了最新版,我也迫不及待升级。 升级最新版软件依赖有很多好处,总之作为一个开发者你发布新版本肯定是升级改造的工作…

反积分饱和 程序_用抗积分饱和PID控制传递函数为G(s)的被控对象

题目:用抗积分饱和PID控制传递函数为G(s)的被控对象G(s)523500/(s^387.35s^210470s)二、抗积分饱和原理积分饱和现象是在系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断加大而加大,从而导致执行器达到极限位置,如果控…

mysql top 1效率_TOP 1比不加TOP慢的疑惑

问题描述: 有一个查询如下,去掉 TOP 1 的时候,很快就出来结果了,但加上 TOP 1 的时候,一般要 2~3 秒才出数据,何解? SELECT TOP 1 ??? A . INVNO FROM A , B WHERE A . Item B . ItemNumber…

jieba库词频统计_用jieba库统计文本词频及云词图的生成

一、安装jieba库:\>pip install jieba #或者 pip3 install jieba二、jieba库解析jieba库主要提供提供分词功能,可以辅助自定义分词词典。jieba库中包含的主要函数如下:jieba.cut(s) …

mysql查看表描述_MySQL表记录操作介绍(重点介绍查询操作)

MySQL表记录操作指的是对数据库表中数据进行CRUD增删改查操作,一下将一一给大家介绍,重点介绍查询操作。一、插入数据(INSERT)二、删除数据(DELETE)三、修改数据(UPDATE)四、查询数据(SELECT)下面将以例子对数据查询进行详细讲解:例子&#x…

python邮件的图片放在哪里_用python保存电子邮件中的嵌入图像

我试图在一个嵌入的电子邮件中抓取图像。问题是我保存的图像不可读&#xff0c;我不知道为什么。电子邮件(保存为我在代码开头加载的文件)&#xff1a;MIME-Version: 1.0Received: by 10.100.120.7 with HTTP; Tue, 18 Oct 2011 10:36:48 -0700 (PDT)In-Reply-To: <8B4FDE07…

支付宝支付对账单java_[Java]解析支付宝对账单csv

配置相关公钥和私钥这些需要在支付宝的账户中心配置image.png这些内容在支付宝平台上都有教程,因为下载对账单这个功能比较简单,不需要入聚石塔下载对账单https://docs.open.alipay.com/20180417160701241302/fd3qt1官方文档写的很清楚,而且能直接用,将配置好的公钥私钥APPID等…

cmd编译java文件中文乱码_乱码 HelloWorld 世界你好 cmd 执行输出的中文java 显示乱码 解决 另附 win无法执行编译运行javac java编译文件的解决方案...

【博客园cnblogs笔者m-yb原创&#xff0c;转载请加本文博客链接&#xff0c;笔者公众号aandb7 爱码一生&#xff0c;QQ群927113708, github: https://github.com/mayangbo666】这是一篇java入门:java是众多编程语言之一, 就是开发的工具技术, 没什么特别, 是应用广, 严谨的语言…

自我学习--关于如何设计光耦电路

本人在项目中多次设计光耦电路&#xff0c;目前电路在项目中运行比较平稳&#xff0c;所以总结一下自己的设计经验&#xff0c;与大家交流一下&#xff0c;如有错误还希望大家指出改正&#xff0c;谢谢&#xff08;V&#xff1a;Smt15921588263&#xff1b;愿与大家多交流&…

java websocket ie8_websocket兼容IE8

最近由于项目需要做实时聊天功能&#xff0c;选择了html5的websocket方案(事实上node.jssocket.io兼容性更好&#xff0c;个人觉得这个方案更加完美)&#xff0c;websocket实现实时聊天的demo网上很多&#xff0c;但是兼容IE8的资料却很少&#xff0c;这块折腾了很久。websoket…

python父亲节祝福_父亲节祝福语精选简短 父亲节祝福语简短独特

1.您的坚忍不拔和铮铮硬骨是我的榜样&#xff0c;我从您那儿汲取到奋发的力量&#xff0c;走过挫折&#xff0c;迈向成功&#xff0c;爸爸&#xff0c;您是我永远的榜样&#xff0c;我爱您&#xff01;祝您节日快乐&#xff01;2.您的怀抱&#xff0c;是我的小天地&#xff1b;…

java安装 hello_安装JAVA步骤,并编写HELLOWORLD程序

安装Java步骤&#xff0c;并编写helloworld程序1.安装JDK(Java Development Kit)JDK是Java开发工具包(Java Development Kit)的缩写。它是一种用于构建在J Java 平台上发布的应用程序、applet和组件的开发环境。即编写Java程序必须有JDK&#xff0c;它提供了编译Java和运行Java…

java实现Fmeasure计算_聚类结果的评估指标及其JAVA实现

一. 前言又GET了一项技能。在做聚类算法的时候&#xff0c;由于要评估所提出的聚类算法的好坏&#xff0c;于是需要与一些已知的算法对比&#xff0c;或者用一些人工标注的标签来比较&#xff0c;于是用到了聚类结果的评估指标。我了解了以下几项。TP:是指被聚在一类的两个量被…

java窗体容器坐标_Java的屏幕坐标是以像素为单位的,容器的左下角被确定为坐标的起点。...

屏单位的的左定为的起点Despite ________ difficulties, they did not find the life in London unpleasant.幕坐As soon as I was ____________, I began to have second thoughts about leaving.标被确The girl was uncertain what to do, or what tone of voice to_________…

mysql 相同字段相减_mysql datetime 类型字段相减

背景&#xff1a;今天测试一个mariadb中datatime类型的字段相减问题&#xff0c;直接用2个字段相减得到的数值并不是秒&#xff0c;很坑。后面百度了一些方法&#xff0c;说是使用 DateDiff 函数&#xff0c;这个函数文档还说有3个参数&#xff0c;但是3个参数运行是报错的。要…

Java最短路径类型_JAVA 最短路径

1.从景石出发&#xff0c;步行游览以下景点:①游客服务中心&#xff0c;②阳光草坪&#xff0c;③森林小剧场&#xff0c;④儿童科普体验区&#xff0c;⑤儿童戏水场&#xff0c;⑥湿地博物馆&#xff0c;⑦湿地商业街。建立数学模型&#xff0c;找出从景石出发&#xff0c;到达…

php 开启,PHP服务的开启详细步骤

安装完php,使用chkconfig命令来查看php-fpm服务是否开启&#xff0c;如果没有开启1. 在/etc/init.d/目录下创建脚本php-fpmvim/etc/init.d/php-fpm2. 编写脚本内容(将一下复制进去相应改动安装路径)#!/bin/sh## php-fpm - this script starts and stops the php-fpm daemin## c…