历史文档

【历史文档】因子构建与标注-自定义标注

由clearyf创建,最终由small_q 被浏览 1278 用户

更新

本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明

新版量化开发IDE(AIStudio):

https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW

新版模版策略:

https://bigquant.com/wiki/doc/demos-ecdRvuM1TU

新版数据平台:

https://bigquant.com/wiki/doc/dai-PLSbc1SbZX

新版表达式算子:

https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS

新版因子平台:

https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5

\

导语

本文标题为自定义标注,其实就是想告诉大家如何灵活地对数据进行标注,从而得到预测能力更强的机器学习算法。

认识分类和回归

谈标注一词之前,我们先简单了解机器学习算法中的分类和回归。

分类问题是监督学习的一个核心问题。在监督学习中,当输出变量Y取有限个离散值时,预测问题便成为分类问题。监督学习从数据中学习一个分类模型,称为分类器(classifier)。分类器对新的输入进行输出的预测,这个过程称为分类。

当输出变量Y为有限个离散值时,成为分类问题,那如果输出变量Y是连续值时,又该怎样处理呢?可能大家马上想到这其实就是回归问题,用回归算法就可以解决。的确如此,但很多时候,回归算法预测效果不好。此时,我们可以对连续性数值进行标注,将Y标注为多个类别,这时又可以通过分类算法来解决。对数据进行标注在图像识别、文本分析、语音分析中经常遇到,标注的思想也广泛存在于机器学习领域。将数据标注为多个离散值成为分类标注,将数据标注为连续性数据称为回归标注。

对股票进行标注然后结合股票的特征是否能训练出一个有预测能力的模型呢?这正是许多机器学习算法在在量化选股领域的尝试。股票标注可以直接影响到AI策略的效果,可见其重要性,接下来我们详细介绍如何对股票进行标注。

数据标注应该注意

数据标注应注意的几点:

  • 数据标注既包括分类标注也包括回归标注。分类标注为将数据分为具有区分性的多个类别,回归标注后数据为连续性数据。分类标注比较常用。
  • 数据标注时,应尽可能结合机器学习的算法预测目的。如果目标是想预测收益率较高的股票,在标注时应结合股票收益率;如果目标是想预测波动率较低的股票,在标注时应结合股票波动率。
  • 数据标注时,应尽可能将数据区别开来,但又不可分得太细。比如,通过股票收益率将股票分为五类,分别为高收益、较高收益、一般、较低收益、低收益,因此此时就可以采取分类算法。如果分得太细,可能算法在训练集上会学到不少数据噪音,泛化能力不强。
  • 分类标注中标注后的数据不一定是具体的类别,而是具体的数值。比如,'数值>=20'为高收益股票,"15<数值<20"为较高收益股票,"10<数值<15"为一般股票,“5<数值<10”为较低收益股票,“数值<5”为低收益股票。

开发AI策略

数据标注和特征工程一样重要,共同决定了机器学习算法的预测能力。数据标注确定的标注结果和特征工程确定的因子数据合并起来就形成了训练集数据,已经可以训练出一个学习算法。当我们得到学习算法后,传入测试集的因子数据就可以得到预测结果,通过回测就可以开发AI策略。如下图所示:

 {w:100}在BigQuant上,数据标注有专门的模块接口,方便大家高效灵活地进行标注。本文简单枚举了一些标注数据的应用例子,希望大家理解以便开发出更好的AI策略。

首先我们在可视化策略中建立如下流程   {w:100}如图所示,在m1证券代码列表模块中可以指定需要标注的股票列表和起止日期,在m2模块中通过表达式引擎自定义标注。我们可以通过改变m2模块中的标注代码实现不同的自定义标注方式,下面列举几种方式的实现:

根据收益率进行分类标注

模块代码示例

# 计算收益:5日收盘价(作为卖出价格)除以明日开盘价(作为买入价格)
shift(close, -5) / shift(open, -1)

# 极值处理:用1%和99%分位的值做clip
clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))

# 将分数映射到分类,这里使用20个分类
all_wbins(label, 20)

# 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)
where(shift(high, -1) == shift(low, -1), NaN, label)

通过运行 m2.plot_label_counts() 可以查看标注结果:  {w:100}这幅柱状图描述了整个训练集中各个label的分布情况,本例中将收益率分为0到19个档级,柱状图高度表示各个档级的样本数量。

代码解读

  • 根据未来几天的收益率进行标注可以直接修改shift(close, -5) 中的-5。
  • clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99)) ,利用分位数对极值进行处理。
  • all_wbins(label, 20)是按照收益率等间隔分为20类,每个标注类别的之间的收益率间隔大小相等, 也可以使用all_cbins(label,20)是按照收益率等频间隔分为20类,但每个标注类别中样本个数相等,但每个标注类别之间的收益率间隔大小不等。
  • 如果不涉及相对收益率可以不用传入基准指数,默认的基准指数为000300.SHA。  {w:100}默认删除无标注数据
  • 默认将标注转化为整数

根据收益率大小标注

m2模块代码示例

# 计算收益:5日收盘价(作为卖出价格)除以明日开盘价(作为买入价格)
shift(close, -5) / shift(open, -1)

# 极值处理:用1%和99%分位的值做clip
clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))

# 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)
where(shift(high, -1) == shift(low, -1), NaN, label)

同时取消将标注转化为整数选项  {w:100} 绘制标注分布图如下:  {w:100}

根据相对收益率标注

m2模块代码示例

# 计算收益:5日相对基准的收益率
shift(close, -5) / shift(open, -1)-shift(benchmark_close, -5)/shift(benchmark_open, -1)

# 极值处理:用1%和99%分位的值做clip
clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))

# 将分数映射到分类,这里使用20个分类
all_wbins(label, 20)

# 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)
where(shift(high, -1) == shift(low, -1), NaN, label)

绘制标注分布图如下:  {w:100}

根据经波动率调整后的收益率标注

标注数据为:经过波动率调整后的收益率(类似于夏普比率) m2模块代码示例

# 计算收益:5日经波动率调整后收益率
shift(close, -5) / shift(open, -1)/ std(shift(close, -2) / shift(open, -1), -5)

# 极值处理:用1%和99%分位的值做clip
clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))

# 将分数映射到分类,这里使用20个分类
all_wbins(label, 20)

# 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)
where(shift(high, -1) == shift(low, -1), NaN, label)

绘制标注分布图如下:  {w:100}

根据经平均真实波幅调整后的收益率标注

m2模块代码示例

# 计算收益:5日经平均真实波幅调整后收益率
shift(close, -5) / shift(open, -1)/ shift(ta_atr(high, low, close ,5),-5)

# 极值处理:用1%和99%分位的值做clip
clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))

# 将分数映射到分类,这里使用20个分类
all_wbins(label, 20)

# 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)
where(shift(high, -1) == shift(low, -1), NaN, label)

\

根据收益率排序计算标注

m2模块代码示例

# 计算5日收益率排名
rank(shift(close, -5) / shift(open, -1))

# 极值处理:用1%和99%分位的值做clip
clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))

# 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)
where(shift(high, -1) == shift(low, -1), NaN, label)

\

自定义计算标注

可以通过自定义模块编写代码自定义计算标注值,平台默认识别label列为标注列。

https://bigquant.com/experimentshare/fd12b97bfe3a41bcaf4bfe18ab8ba6c2

标注相对收益率未来N日最大值/最大值天数

https://bigquant.com/experimentshare/6a7076ec515b4a1b897c0a9c407dec18

小结

可以看出,对股票数据标注的方法丰富多样,因此策略研究者的开发空间非常大,好的标注结果结合好的特征选择可以直接决定AI算法预测能力。

标签

机器学习监督学习
{link}