当前位置:   article > 正文

【《深入浅出python量化交易交易实战》Python复现(第三章:(一)机器学习的基本概念+基本使用方法)】

深入浅出python量化交易

第三章 机器学习在交易中的简单应用

3.1 机器学习的基本概念

3.1.1 有监督学习和无监督学习

       有监督学习就是有事先标注好的数据,如果数据标注是离散的,并且是代表一个类别的标签,并且训练样本使样本获得正确的类别标签,这样就是一个分类任务。如果是一个目标值,训练模型使其可以预测出新样本对应的数值——这时模型的目标是连续的,那这就是一个回归任务
       无监督学习就是没有人工主观标注的数据,只有目标和目标的客观特征值,但是还是可以通过对特征值的相关性的计算进行一个归类,这就是无监督学习中的聚类任务

3.1.2 分类和回归

       分类是实现有标注好的分类标签,训练分类模型,然后将新的样本归于已有的分类的过程
       回归是给定样本的目标值,训练回归模型,对一个新的样本,进行目标值的预测的过程
       在交易中,如果是预测未来股票是涨或者跌,这时就是一个分类的过程,是分类任务;如果是预测股票未来的股票是涨多少,还是跌多少,这时就是一个回归的过程

3.1.3 模型性能的评估

       如果使用算法来进行交易的话,最关心的就是模型是否可以准确地预测出股票的涨跌或者涨幅。实际上,模型是不可能做到百分之百准确的,这就需要我们对模型的性能进行评估,以便找到最可用的模型。要达到这个目的,我们就需要将掌握的数据集(dataset)拆分为训练集(trainset)和验证集(testset),使用训练集训练模型,并使用验证集来评估模型是否可用
       举一个例子,假如有某只股票100天的价格数据,就可以将前80天的数据作为训练集,将后20天的数据作为验证集,同时评估模型分别在训练集与验证集中的准确率。如果模型在训练集中的得分很高,而在验证集中的得分很低,就说明模型出现了过拟合(over-fitting)的问题;而如果模型在训练集和验证集中的得分都很低,就说明模型出现了欠拟合(under-fitting)的问题
       要解决这些问题,小瓦就需要调整模型的参数、补充数据,或者进行更细致的特征工程

3.2 机器学习工具的基本使用方法

       学习使用python的sklearn库进行常见的机器学习算法的学习

3.2.1 KNN算法的基本原理

       KNN(K-Nearest Neighbor,K最近邻)是较简单且易于理解的算法之一。它既可以用于分类任务,也可以用于回归任务
       KNN算法的原理十分容易理解:它识别k个最近的数据点(基于欧几里得距离)来进行预测,它分别预测邻域中最频繁的分类或是回归情况下的平均结果。用通俗的话讲,已知大部分皮肤比较白的人是欧洲人,大部分皮肤比较黑的人是非洲人。现在给你介绍一位朋友,让你判断他来自哪个国家。通过目测,你发现这位朋友与3位非洲朋友的肤色比较接近,与1位欧洲朋友的肤色比较接近,这时,你大概率会把这位新朋友归到非洲人的分类当中
       对于回归任务来说,KNN的工作机理也是相似的。例如,你打算去买一套房子,在同一个小区当中发现有3套户型和面积都十分接近的房屋。第一套的售价是500万元,第二套的售价是520万元,而第三套的售价未知。鉴于第三套的情况与前面两套十分接近,你可以大致估算出它的售价会是510万元左右,即前两套房子售价的均值

3.2.2 KNN算法用于分类

3.2.2.1 载入数据集并查看

scikit-learn内置了一些供大家学习的玩具数据集(toy dataset),其中有些是分类任务的数据,有些是回归任务的数据。首先我们使用一个最简单的鸢尾花数据集来演示KNN算法在分类中的应用
输入代码如下:

#codeing=utf-8
import matplotlib.pyplot as plt
import seaborn as sns
#导入鸢尾花数据和KNN模型
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier

if __name__ == '__main__':
    
    iris = load_iris()
    print('keys:', iris.keys())
    print('feature_names:', iris.feature_names)
    print('target:', iris.target)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

输出数据如下:
在这里插入图片描述
我们看到,该数据集存储了若干个键(key),这里我们重点关注一下其中的target和feature_names,因为这两个键对应的分别是样本的分类标签和特征名称
数据集中的样本共有4个特征,分别是

  • sepal length(萼片长度)
  • sepal width(萼片宽度)
  • petal length(花瓣长度)
  • petal width(花瓣宽度)

数据集中的样本分为3类,分别用0、1、2这3个数字来表示

这个数据集的目的是:根据样本鸢尾花萼片和花瓣的长度及宽度,结合分类标签来训练模型,以便让模型可以预测出某一种鸢尾花属于哪个分类

3.2.2.2 拆分数据集

将数据拆分为训练集和测试集
输入代码如下:

#codeing=utf-8
import matplotlib.pyplot as plt
import seaborn as sns
#导入鸢尾花数据和KNN模型
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
#导入数据集拆分工具
from sklearn.model_selection import train_test_split

if __name__ == '__main__':
    
    iris = load_iris()
    #print('keys:', iris.keys())
    #print('feature_names:', iris.feature_names)
    #print('target:', iris.target)

    X, y = iris.data, iris.target
    print('X shape:', X.shape)
    print(X[:1])
    #将X和y拆分为训练集和验证集
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    #查看拆分情况
    print('X train:', X_train.shape)
    print('X test:', X_test.shape)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

输出数据如下:
在这里插入图片描述
可以看出,我们将数据集的特征赋值给了X,而将分类标签赋值给了y。通过查看X的形态和第一条数据,可知样本数量共有150个,每个样本有4个特征
通过拆分,训练集中的样本数量为112个,其余的38个样本则进入了验证集

3.2.2.3 训练模型并评估准确率

输入代码如下:

	#创建KNN分类器,参数保持默认设置
    knn_clf = KNeighborsClassifier()
    #使用训练集拟合模型
    knn_clf.fit(X_train, y_train)
    #查看模型在训练集和验证集中的准确率
    print('训练集准确率:%.2f' % knn_clf.score(X_train, y_train))
    print('验证集准确率:%.2f' % knn_clf.score(X_test, y_test))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出数据如下:
在这里插入图片描述
注意这个数据并不是一个稳定值,因为每次切分的训练集和测试集都不一样,所以准确率也不一样,但是基本都是90%以上

需要说明的是,在scikit-learn中,KNN可以通过调节n_neighbors参数来改进模型的性能。在不手动指定的情况下,KNN默认的近邻参数n_neighbors为5。那么这个参数是最优的吗?我们可以使用网格搜索法来寻找到模型的最优参数

输入代码如下:

#codeing=utf-8
import matplotlib.pyplot as plt
import seaborn as sns
#导入鸢尾花数据和KNN模型
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
#导入数据集拆分工具
from sklearn.model_selection import train_test_split
# 导入网络搜索
from sklearn.model_selection import GridSearchCV

if __name__ == '__main__':
    
    iris = load_iris()
    #print('keys:', iris.keys())
    #print('feature_names:', iris.feature_names)
    #print('target:', iris.target)

    X, y = iris.data, iris.target
    #print('X shape:', X.shape)
    #print(X[:1])
    #将X和y拆分为训练集和验证集
    #X_train, X_test, y_train, y_test = train_test_split(X, y)
    #查看拆分情况
    #print('X train:', X_train.shape)
    #print('X test:', X_test.shape)

    #创建KNN分类器,参数保持默认设置
    #knn_clf = KNeighborsClassifier()
    #使用训练集拟合模型
    #knn_clf.fit(X_train, y_train)
    #查看模型在训练集和验证集中的准确率
    #print('训练集准确率:%.2f' % knn_clf.score(X_train, y_train))
    #print('验证集准确率:%.2f' % knn_clf.score(X_test, y_test))

    # 定义一个从1-10的n_neighbors
    n_neighbors = tuple(range(1, 11))  # [1-11)每个一个数取值,存储元祖,(1,2,3,...10)
    # 创建网络搜索实例,estimator用KNN分类器
    # 把刚刚定义的n_neighbors传入给param_grid参数
    # cv参数指交叉验证次数为5
    cv = GridSearchCV(estimator=KNeighborsClassifier(),
        param_grid={'n_neighbors': n_neighbors}, cv=5)
    # 使用网络搜索拟合数据集
    cv.fit(X, y)
    # 查看最优参数
    print('最优参数:', cv.best_params_)  # {'n_neighbors': 6}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

输出数据如下:
在这里插入图片描述
从上面的代码运行结果可以看到,程序将网格搜索找到的最优参数进行了返回——KNN分类器的最优n_neighbors参数是6。也就是说,当n_neighbors参数为6时,模型的准确率是最高的
下面我们就来看一下当把n_neighbors设置为6时,模型的准确率
输入代码如下:

	#创建KNN分类器,参数保持默认设置
    #knn_clf = KNeighborsClassifier()
    knn_clf = KNeighborsClassifier(n_neighbors=6)
    #使用训练集拟合模型
    knn_clf.fit(X_train, y_train)
    #查看模型在训练集和验证集中的准确率
    print('训练集准确率:%.2f' % knn_clf.score(X_train, y_train))
    print('验证集准确率:%.2f' % knn_clf.score(X_test, y_test))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出数据如下:
在这里插入图片描述
可以看到,当把n_neighbors参数设置为6时,在训练集和验证集都有一定的准确率提升

3.2.3 KNN算法用于回归

下面展示KNN算法在回归任务中的应用

3.2.3.1 载入数据集并查看

使用Boston房价数据集,该数据集中有506个样本,每个样本有13个特征,以及对应的价格(target)
输入代码如下:

def boston_sample(): 
    #将数据导入
    boston = load_boston()

    #查看数据集的键名,特征名,房屋售价
    print('keys:', boston.keys())
    print('feature_names:', boston.feature_names)
    print('target:', boston.target[:10])
boston_sample()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出数据如下:
在这里插入图片描述
可以看出,数据集中存储了5个键,这里我们重点关注target(房屋的售价)及feature_names(房屋的特征)
其中样本全部的特征名称,包括房间数量RM、房龄AGE等共计13个
最后是返回的前10套房屋售价

3.2.3.2 拆分数据集并训练模型

与分类任务一样,在回归任务中,我们也要使用训练集来训练模型,并使用验证集来验证模型的性能
输入代码如下:

def boston_sample():
    #将数据导入
    boston = load_boston()

    #查看数据集的键名,特征名,房屋售价
    #print('keys:', boston.keys())
    #print('feature_names:', boston.feature_names)
    #print('target:', boston.target[:10])

    #将样本特征和售价赋值给X,y
    X, y = boston.data, boston.target
    #使用train_test_split拆分为训练集和验证集
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    #查看拆分的结果
    print('X train:', X_train.shape)
    print('X test:', X_test.shape)
boston_sample()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

输出数据如下:
,
可以看到,训练集中有379个样本,其余127个样本进入了验证集
下面开始训练模型,输入代码如下:

def boston_sample():
    #将数据导入
    boston = load_boston()

    #查看数据集的键名,特征名,房屋售价
    #print('keys:', boston.keys())
    #print('feature_names:', boston.feature_names)
    #print('target:', boston.target[:10])

    #将样本特征和售价赋值给X,y
    X, y = boston.data, boston.target
    #使用train_test_split拆分为训练集和验证集
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    #查看拆分的结果
    #print('X train:', X_train.shape)
    #print('X test:', X_test.shape)

    #创建一个实例,参数保持默认设置
    knn_reg = KNeighborsRegressor()
    #拟合训练集数据
    knn_reg.fit(X_train, y_train)
    #查看模型在训练集和验证集的性能表现
    print('训练集准确率:%.2f' % knn_reg.score(X_train, y_train))
    print('验证集准确率:%.2f' % knn_reg.score(X_test, y_test))
boston_sample()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

输出数据如下:
在这里插入图片描述
从上面的代码运行结果可以看到,缺省参数的KNN回归模型在该数据集中的性能表现差强人意,在训练集中的准确率只有67%,而在验证集中则更加糟糕,只有46%。这说明模型出现了欠拟合的问题,我们需要对数据集进行处理,或者对模型进行调优

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/129651?site
推荐阅读
相关标签
  

闽ICP备14008679号