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

Posted IT信息教室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 与金融数据|生成机器学习的标签和特征相关的知识,希望对你有一定的参考价值。

记得  关注、分享点在看  呀~ 这样您就能持续收到优质的推送啦

这一期,我们将共同学习如何生成机器学习所需要的特征和标签。有了特征和标签,我们才能使用机器学习方法对数据进行分类。然后根据建立好的分类模型完成预测。


FinTech History









机器学习概述

说到机器学习,就不得不提到其中的一些基本概念:

标签,特征,模型,样本

首先来看标签。机器学习一般就是去训练机器,让机器有‘思维’,然后能够用训练好的‘思维’帮助我们去预测一些事情。因此机器学习的目的之一是去预测信息。而这里预测的信息就叫做 标签。这个标签都是人为去设定的,由于自然界的信息是多种多样的,因此标签也是多种多样的。标签可以是一类物体,比如'水果','蔬菜' 等。也可以是一种变化趋势,例如 '未来股票走势'等。

标签的选择对我们的预测结果很重要,最好不要选的太泛,也不要选的特别具体。

另一个概念是特征。标签表示的是信息,而具体一个标签表示什么样的信息就是由特征决定的。例如 '毛绒绒的','白色的','长长的耳朵',‘喜欢吃胡萝卜和青菜’,这些信息可以作为特征,而 '兔子' 就可以作为这些特征对应的标签。当然,也可以定义为其他标签,例如‘动物’。

特征就是一系列的信息,用来表征事物,映射出标签。特征应该是具体可量化的信息,不包括主观感受。

模型,就是能训练与预测的程序。模型的训练过程就是找到特征与标签之间固定化的映射关系。训练好的模型会用来预测标签。预测的过程就是根据给定的特征,按照固定化的关系,判断出标签是什么。

从模型预测的信息可以将其分为回归模型和分类模型。 回归模型用于预测“未来”会发生的事情。而分类模型,用于预测事物是哪一类。 

样本一般就是指的数据,是特征的封装。 样本可以带标签,也可以不带标签。

带标签的样本,可以用于模型的训练。 不带标签的样本,可用于模型的预测。  

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

生成标签

我们定义的标签有买入,卖出和继续持有。分别用数字 1,-1 和 0 表示。标签的定义方法是由未来 7 天内收盘价的变化趋势决定的。如果 7天 内会最先出现收盘价涨幅超过 x% 的情况,那么就定义当前的标签为买入,如果 7天 内会最先出现收盘价跌幅超过 x% 的情况,那么就定义当前的标签为卖出。其余情况定义为继续持有。

以 x=2 为例,使用函数 buySellHold 实现上述功能,代码实现如下:

def buySellHold(*args): cols = [col for col in args] requirement = 0.02 for col in cols: if col > requirement: return 1 if col < -requirement: return -1 return 0

 *args 表示当前函数传递的参数个数是未知的。多个参数可以通过列表传递。这样,给定一组股票的特征数据(特征数据的获取参考上一期),使用这个函数就能生成对应的标签。

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

提取特征、生成标签

按照惯例,我们使用一个特定的函数来实现这一功能:

def extractFeaturesets(ticker):

首先根据上一期的内容生成交易信息的特征数据:

tickers, dataFrame = processDataForLables(ticker)

生成的新的 dataFrame 中 'ticker_1d', 'ticker_2d', ..., 'ticker_7d' 对应列的内容将作为我们每一支股票生成标签的数据。

 600585.SS_1d 600585.SS_2d 600585.SS_3d 600585.SS_4d 600585.SS_5d 600585.SS_6d 600585.SS_7dDate 2010-01-04 -0.012037 -0.009753 -0.041290 -0.039423 -0.067014 -0.050209 -0.0900432010-01-05 0.002312 -0.029610 -0.027720 -0.055647 -0.038637 -0.078956 -0.0724492010-01-06 -0.031848 -0.029962 -0.057825 -0.040855 -0.081081 -0.074588 -0.0783602010-01-07 0.001948 -0.026832 -0.009303 -0.050853 -0.044146 -0.048042 -0.0456592010-01-08 -0.028723 -0.011229 -0.052698 -0.046005 -0.049892 -0.047514 -0.0110152010-01-11 0.018012 -0.024683 -0.017792 -0.021795 -0.019346 0.018232 -0.035357

例如以上数据,对于第一行数据,首先出现了跌幅大于 2% 的情况(三天后),因此确定当前日期的操作为卖出,那么标签就设为 -1。同理根据每一天的数据确定对应的标签,实现方法如下:

def extractFeaturesets(ticker): tickers, dataFrame = processDataForLables(ticker)  dataFrame['{}_target'.format(ticker)] = list(map(buySellHold, dataFrame['{}_1d'.format(ticker)], dataFrame['{}_2d'.format(ticker)], dataFrame['{}_3d'.format(ticker)], dataFrame['{}_4d'.format(ticker)], dataFrame['{}_5d'.format(ticker)], dataFrame['{}_6d'.format(ticker)], dataFrame['{}_7d'.format(ticker)] )                                                 )

针对特定股票 ticker,其每一天的标签信息存放在 ticker_target 这一列中。按照我们的定义,ticker_target 一列中的数据值为 -1,1 或 0。

接下来我对特定股票,统计在已有的数据范围内,有多少天是买入,多少天卖出以及多少天是继续持有的。

为了实现这一功能,可以先把数据格式转为列表,然后使用 Counter 这个方法来统计,并将结果输出:

values = dataFrame['{}_target'.format(ticker)].values.tolist()print('dataSpread:', Counter(values))

因为 Counter 这个方法来自于一个独立的工具包,使用之前需要先导入:

from collections import Counter

这时如果先调用并运行这个函数,将任意一个股票代码作为函数的参数:

extractFeaturesets('600585.SS')

就能看到与以下类似的输出:

dataSpread: Counter({1: 1318, -1: 1199, 0: 132})

这个行输出表示,按照我们制定的交易规则,对于 '600585.SS' 这支股票,有 1318天 适合继续买入,有 1199天 适合卖出,另外有 132天 适合继续持有。

接下来为了方便后续的操作,我们先对数据做一些简单的清洗。把空数据使用 0 填充,另外把无穷大或者无穷小的数据舍弃掉:

dataFrame.fillna(0, inplace=True)dataFrame = dataFrame.replace([np.inf, -np.inf], np.nan)dataFrame.dropna(inplace=True)

然后生成特征,我们选取当日价格相比前一日价格的变化率作为机器学习的特征,获取这个变化率可以使用 pct_change 这个方法:

dataFrameValues = dataFrame[ [ticker for ticker in tickers] ].pct_change()

同样的,对生成的数据做简单的清洗:

dataFrameValues.replace([np.inf, -np.inf], 0, inplace = True)dataFrameValues.fillna(0, inplace=True)

这里将无穷大或者无穷小的数据都用 0 代替。对空白数据也是用 0 填充。

最后我们将生成好的特征和标签以列表的格式返回,为了方便后续的调用,同时返回处理完成后的完整数据:

X = dataFrameValues.valuesX = dataFrame['{}_target'.format(ticker)].valuesreturn X, y, dataFrame

X 是处理好的特征数据,y 是处理好的标签数据,两者是逐行对应的。

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

参考代码

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@author: IT信息教室(微信公众号)订阅/关注,在看、分享三连吧~"""def buySellHold(*args): cols = [col for col in args] requirement = 0.02 for col in cols: if col > requirement: return 1 if col < -requirement: return -1 return 0
def extractFeaturesets(ticker): tickers, dataFrame = processDataForLables(ticker) dataFrame['{}_target'.format(ticker)] = list(map(buySellHold, dataFrame['{}_1d'.format(ticker)], dataFrame['{}_2d'.format(ticker)], dataFrame['{}_3d'.format(ticker)], dataFrame['{}_4d'.format(ticker)], dataFrame['{}_5d'.format(ticker)], dataFrame['{}_6d'.format(ticker)], dataFrame['{}_7d'.format(ticker)] ) ) values = dataFrame['{}_target'.format(ticker)].values.tolist() print('dataSpread:', Counter(values)) dataFrame.fillna(0, inplace=True) dataFrame = dataFrame.replace([np.inf, -np.inf], np.nan) dataFrame.dropna(inplace=True) dataFrameValues = dataFrame[ [ticker for ticker in tickers] ].pct_change() dataFrameValues.replace([np.inf, -np.inf], 0, inplace = True) dataFrameValues.fillna(0, inplace=True) X = dataFrameValues.values y = dataFrame['{}_target'.format(ticker)].values return X, y, dataFrame

Codes: M先森看世界
Edit: M先森看世界











ONE MORE THING


合作: classroom.it@hotmail.com

Hi

你好呀

我是 M先森 

这是一个共同学习的平台

我会把我会的 你们想学的

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

学编程 学算法

学各种各样

好玩的好用的软件

记得要常回来看看呀

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


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

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

以上是关于Python 与金融数据|生成机器学习的标签和特征的主要内容,如果未能解决你的问题,请参考以下文章

基于机器学习与深度学习的金融风控贷款违约预测

机器学习之路:python 多项式特征生成PolynomialFeatures 欠拟合与过拟合

Python机器学习数据可视化讲解及性别周末与购物间可视化实战(超详细 附源码)

机器学习与量化交易项目班 [从零搭建自动交易系统]

AI金融知识自学偏量化方向-目录0

监督学习与非监督学习