这一期,我们将使用上一期处理好的数据特征和标签训练机器,然后预测交易策略。我们将分别使用 K近邻算法和集成学习两种方法分别完成模型的训练和预测。
FinTech History
Python 与金融数据|股票数据的获取与可视化
Python 与金融数据|数据的滑动平均值及多图可视化
Python 与金融数据|数据的重采样与蜡烛图(K线图)的绘制
Python 与金融数据|网页爬取上证50股票代码
Python 与金融数据|批量抓取并保存上证50的交易数据
Python 与金融数据|上证50的收盘价汇总
Python 与金融数据|绘制股票间的相关性图表
Python 与金融数据|为机器学习预处理数据
Python 与金融数据|生成机器学习的标签和特征
K近邻算法在 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 格式,以后需要使用的时候只需要直接获取这个模型即可。
集成学习
集成学习实际上就是分类器的集成,就是构建多个机器学习模型来完成学习任务。机器学习有很多种模型,对于同一个问题,每一种模型都会产生不同的预测结果。对于多种模型预测结果如何选择最合适的一个结果呢?这就是集成学习要解决的问题之一:
把多种算法集中起来,每种算法都会有一个自己的预测结果,然后对每种算法的结果进行评估投票,综合选择出最好的结果。
在 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 天建议继续持有。
一般来说,使用集成学习预测的结果会比使用单一模型的预测结果好一些。
同样的,如果希望预测其他时间点的交易策略,只需要更新测试数据样本就可以了。
参考代码
#!/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先森看世界
ONE MORE THING
如果您对内容有什么需求建议,或者遇到了什么软件、应用使用方面的问题,请直接在公众号主界面下发私信给我,我看都会及时回复。感谢大家的支持!
合作: classroom.it@hotmail.com
Hi
你好呀
我是 M先森
这是一个共同学习的平台
我会把我会的 你们想学的
做成教程或者写成文章
我们在这一起学英语
学编程 学算法
学各种各样
好玩的好用的软件
记得要常回来看看呀
(^_^)a(^_^)a
点击 阅读原文 查看Python入门教程~
喜欢就点个 分享 点赞 在看 三连吧!