龙空技术网

python - 用机器学习预测股票的价格 2 - 特征工程(续)

程序化交易A2Z 179

前言:

此刻姐妹们对“二进制树型搜索算法”大致比较重视,兄弟们都想要了解一些“二进制树型搜索算法”的相关资讯。那么小编在网络上汇集了一些关于“二进制树型搜索算法””的相关知识,希望咱们能喜欢,你们快快来学习一下吧!

本文继续 python - 用机器学习预测股票的价格 2 - 特征工程 的内容,有关 数据准备的内容可阅读《 python - 用机器学习预测股票的价格 1 - 数据准备》。

以下文,特征工程一文继续....

表示方法 - 与变换方法的作用相同

尽管用表示方法可以像前文介绍过的变换方法那样达到同样的目的,但是表示方法还是有所不同的,这类方法不是用来表示连续值的。前面讲述的变换都是返回连续值,而不是一种标签;正是因为这一点,由此开始进行特征工程是很好的选择,尤其是在构建工程原型的早期阶段。但是可以用不同的方法表示数据,尤其是使用一些基于分类的表示方法,或者适合处理特征非常多而可能导致维度过大的表示方法。

(1)变量分箱 (Binning)

可以把连续的变量转换为离散的数字标识(如1到10),即变量分箱。这样做肯定会丢失一些信息,但是如果为了删除更多的噪声而得到信号,某些信息的损失也是好事。下面的实例代码中,把成交量变换为长度相等的10个箱体,就把连续变量转换成了离散变量。注意:这个实例不能以时间窗口移动的方法来使用,其必然面临出现窥探未来数据的情况,这也是这种方法内在的缺陷。如果出现涉及窥探未来数据的情况,就不要用时间窗口滚动的方法实施变量分箱。

下面代码中,对8只股票的成交量用变量分箱的方法进行特征表示,

n_bins = 10bin_fxn = lambda y: pd.qcut(y,q=n_bins,labels = range(1,n_bins+1))features['f14'] = prices.volume.groupby(level='symbol').apply(bin_fxn)features['f14']

运行结果如下图所示:

(2)符号表示 (signing)

这种方法比较简单,就是把连续变量转换为+1或-1,取决于输入数值,表示当天的成交量是增加还是减少。代码实例如下:

features['f15'] = features['f05'].apply(np.sign)features['f15']

运行结果如下图所示:

(3)+/-,加号/减号

用“+/-”表示数值有多少天是增加的,有多少天是减少的。下面的代码就可简单地实现这种方法,计算出该数值增加的天数减去减少的天数。

plus_minus_fxn = lambda x: x.rolling(20).sum()features['f16'] = features['f15'].groupby(level='symbol').apply(plus_minus_fxn)features['f16']

运行结果如下图所示:

(4)独热编码 one-hot encoding

独热编码方法可能是使用最常见的表示方法。把分类变量表示为二进制码。例如, month_of_year 可以表示为不同的12列,其中的每一列用1或0表示,1月表示为 [1,0,0,0,....0],2月表示为[0,1,0,0,....,0],诸如此类。

在极个别特定环境下,使用这种表示方法要特别注意。

序数的数值含义有错误,例如对年底效应做假设检验,那么使用month_of_year特征,春节所在的1月就是最小的,春节所在月前面的12月就是最大的;需要表示事件或状态的情况。例如,"诉讼"这个词是否出现在上市公司的公告中,上市公司发布年报或半年报的时间;使用哪一种具体的机器学习算法(基于树形的算法,神经网络),使用二进制表示更容易,而使用连续数值或离散数值则很不方便。

以下代码实例创建了12个独热编码特征,每个月份有对应的特征,自动按照月份对应。

month_of_year = prices.index.get_level_values(level='date').monthone_hot_frame = pd.DataFrame(pd.get_dummies(month_of_year))one_hot_frame.index = prices.index # Careful!  This is forcing index values without usual pandas alignments!# create column names begin_num = int(features.columns[-1][-2:]) + 1 #first available featurefeat_names = ['f'+str(num) for num in list(range(begin_num,begin_num+12,1))]# rename columns and mergeone_hot_frame.columns = feat_namesfeatures = features.join(one_hot_frame)print(features.iloc[:,-12:].tail())

运行结果如下图所示:

原始数据序列month 转换为12个独热编码的列,用来训练模型,该模型的学习目标是:从历史形态看,7月份是不是对模型的预测结果有实实在在的影响。

《用机器学习预测股票的价格 2 - 特征工程》这篇文章,给出了一些简单的实施特征的代码。从原始输入数据到创建多个特征,另外介绍了对时间序列常用的变换方法和一些表示方法,也都是对股票行情这类时间序列进行特征工程经常用的方法。

本系列的下一篇文章为《python - 用机器学习预测股票的价格 - 特征选择》,敬请关注。

标签: #二进制树型搜索算法