Python 与金融数据|生成机器学习的标签和特征
Posted IT信息教室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 表示当前函数传递的参数个数是未知的。多个参数可以通过列表传递。这样,给定一组股票的特征数据(特征数据的获取参考上一期),使用这个函数就能生成对应的标签。
提取特征、生成标签
按照惯例,我们使用一个特定的函数来实现这一功能:
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_7d
Date
2010-01-04 -0.012037 -0.009753 -0.041290 -0.039423 -0.067014 -0.050209 -0.090043
2010-01-05 0.002312 -0.029610 -0.027720 -0.055647 -0.038637 -0.078956 -0.072449
2010-01-06 -0.031848 -0.029962 -0.057825 -0.040855 -0.081081 -0.074588 -0.078360
2010-01-07 0.001948 -0.026832 -0.009303 -0.050853 -0.044146 -0.048042 -0.045659
2010-01-08 -0.028723 -0.011229 -0.052698 -0.046005 -0.049892 -0.047514 -0.011015
2010-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.values
X = dataFrame['{}_target'.format(ticker)].values
return X, y, dataFrame
X 是处理好的特征数据,y 是处理好的标签数据,两者是逐行对应的。
参考代码
#!/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
合作: classroom.it@hotmail.com
Hi
你好呀
我是 M先森
这是一个共同学习的平台
我会把我会的 你们想学的
做成教程或者写成文章
我们在这一起学英语
学编程 学算法
学各种各样
好玩的好用的软件
记得要常回来看看呀
(^_^)a(^_^)a
点击 阅读原文 查看Python入门教程~
喜欢就点个 分享 点赞 在看 三连吧!
以上是关于Python 与金融数据|生成机器学习的标签和特征的主要内容,如果未能解决你的问题,请参考以下文章
机器学习之路:python 多项式特征生成PolynomialFeatures 欠拟合与过拟合