策略分享

AI选股中回归、分类、排序算法的构建流程

由iquant创建,最终由qxiao 被浏览 538 用户

导语

【旧版模块】,该文档为旧版。新模板详见:

https://bigquant.com/wiki/doc/102-ai-hXNHGsyWzS

在阅读了学院关于可视化模板教程后,相信你已经掌握了平台上的模块使用方法。本文将以XGBoost模型为例,介绍回归、排序、分类的不同之处。在文末,你可以克隆该算法自行研究、学习

首先我们明确一下算法在机器学习中的地位。一般来说,机器学习有三个要素:数据、算法和模型

  • 数据是场景的描述,包括输入和输出。
  • 算法是得到模型的过程,狭义上说,特指机器学习算法,如传统线性回归、树和支持向量机以及深度学习;广义上说,从最初得到数据到最终确定模型中间的所有过程,即建模流程都可以看作算法,如分类、回归模型,搜索最优参数算法。
  • 模型是输入到输出的映射,即我们最后需要得到的特定法则,对场景给出相关预测。 对应这三个要素,机器学习又可以分为三个步骤:特征工程、模型训练和模型融合。

这里我们讨论的回归、排序、分类,对应的是算法——模型训练的环节。我们以XGBoost为例,分别使用三种算法。

排序算法

模板策略在本文末尾供各位克隆、研究、修改。

在运行策略后输入下列代码,可查看预测集各个股票在不同时间内的评分

m20.predictions.read_df().head(10)
prediction date instrument
550388 1.442220 2015-08-03 603023.SHA
310324 1.425380 2015-06-19 300312.SZA
245931 1.410372 2015-07-02 002759.SZA
1112466 1.400640 2016-01-28 600805.SHA
576750 1.394390 2016-01-28 000039.SZA
444539 1.384524 2015-06-18 600573.SHA
1159144 1.377003 2016-01-28 601567.SHA
1161512 1.376757 2016-01-28 601618.SHA
200413 1.373183 2015-07-28 002522.SZA
538663 1.372157 2015-08-25 601789.SHA

通过调用下列代码,可以查看各个特征、因子在选股时的表现。

m20.feature_gains()
feature gain
0 return_20 258
10 return_5 213
3 avg_amount_5/avg_amount_20 177
1 avg_amount_0/avg_amount_5 167
8 rank_avg_amount_0/rank_avg_amount_5 159
2 rank_return_5 127
7 rank_avg_amount_5/rank_avg_amount_10 121
5 rank_return_5/rank_return_10 115
6 pe_ttm_0 112
12 rank_return_10 111
11 rank_return_0 110
4 return_10 101
9 rank_return_0/rank_return_5 97

分类算法

分类

此时需要通过数据标注给股票分类(读者可以根据自己需求改变分类的方式):

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

同上,调用相同的代码,得到如下结论:

m20.feature_gains()
feature gain
3 return_5 257
10 return_10 244
11 rank_return_10 240
2 pe_ttm_0 204
12 rank_avg_amount_5/rank_avg_amount_10 181
0 return_20 179
1 avg_amount_5/avg_amount_20 147
5 rank_return_5 114
6 rank_return_5/rank_return_10 49
4 rank_avg_amount_0/rank_avg_amount_5 42
7 avg_amount_0/avg_amount_5 36
9 rank_return_0 29
8 rank_return_0/rank_return_5 27
m20.predictions.read_df().head(10)
prediction date instrument
0 0.897233 2015-01-05 000001.SZA
255422 0.992079 2015-01-05 300038.SZA
55849 0.963490 2015-01-05 000725.SZA
419995 0.996210 2015-01-05 600425.SHA
168334 0.944331 2015-01-05 002363.SZA
255586 0.993303 2015-01-05 300039.SZA
535311 0.901999 2015-01-05 601668.SHA
484856 0.978802 2015-01-05 600787.SHA
348936 0.780496 2015-01-05 600036.SHA
3107 0.960541 2015-01-05 000019.SZA

多分类

不同于二分类,此时模块m20XGBoost应选择多分类,同时数据标注处代码应将数据分为多个类别,例如:

where(cond, x, y):#如果cond为True,则为 x, 否则 y 
where(a &gt, b, c, d)
where(a &gt, b, where(a > c, c, d), e)
all_wbins(s, bins), #按等宽做离散化,映射从0开始。bins可以是正整数,表示bins的数量;list,表示splits,e.g. [-2, 0, 2],小于-2的数据将被映射为0,大于2的被映射为3,中间的分别为1和2
all_cbins(s, bins), #按等频做离散化,映射从0开始。bins可以是正整数,表示bins的数量;list,表示每个bin里的数据比例

此处我们作如下标注:

# #号开始的表示注释
# 0. 每行一个,顺序执行,从第二个开始,可以使用label字段
# 1. 可用数据字段见https://bigquant.com/wiki/doc/-tOnkTw9FhH
#   添加benchmark_前缀,可使用对应的benchmark数据
# 2. 可用操作符和函数见 `表达式引擎https://bigquant.com/wiki/doc/yinzi-biaodashi-mGzCw6L5WQ

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

同时在m20XGBoost参数字典中写入:

#写入我们分类的个数
{'num_class':3}
m20.feature_gains()
feature gain
9 return_5 841
12 return_10 701
6 return_20 583
0 rank_return_10 559
7 rank_return_5 478
1 pe_ttm_0 465
10 avg_amount_5/avg_amount_20 462
4 rank_avg_amount_5/rank_avg_amount_10 424
3 avg_amount_0/avg_amount_5 305
11 rank_return_5/rank_return_10 215
2 rank_avg_amount_0/rank_avg_amount_5 207
5 rank_return_0 158
8 rank_return_0/rank_return_5 129
m20.predictions.read_df().head(10)
prediction date instrument
0 1.0 2015-01-05 000001.SZA
255422 2.0 2015-01-05 300038.SZA
55849 1.0 2015-01-05 000725.SZA
419995 1.0 2015-01-05 600425.SHA
168334 2.0 2015-01-05 002363.SZA
255586 1.0 2015-01-05 300039.SZA
535311 1.0 2015-01-05 601668.SHA
484856 1.0 2015-01-05 600787.SHA
348936 1.0 2015-01-05 600036.SHA
3107 2.0 2015-01-05 000019.SZA

回归算法

同上,调用相同的代码,得到如下结论:

m20.feature_gains()

[details="运行结果"]

feature gain
0 return_20 261
10 return_5 254
1 return_10 220
2 rank_return_5 180
5 rank_return_10 156
3 avg_amount_5/avg_amount_20 128
4 avg_amount_0/avg_amount_5 127
6 pe_ttm_0 124
8 rank_avg_amount_0/rank_avg_amount_5 96
7 rank_avg_amount_5/rank_avg_amount_10 92
12 rank_return_5/rank_return_10 87
11 rank_return_0 61
9 rank_return_0/rank_return_5 59
m20.predictions.read_df().head(10)
prediction date instrument
0 7.877901 2015-01-05 000001.SZA
255422 10.281054 2015-01-05 300038.SZA
55849 7.953732 2015-01-05 000725.SZA
419995 8.362499 2015-01-05 600425.SHA
168334 9.308661 2015-01-05 002363.SZA
255586 7.749955 2015-01-05 300039.SZA
535311 8.530932 2015-01-05 601668.SHA
484856 7.365503 2015-01-05 600787.SHA
348936 8.462595 2015-01-05 600036.SHA
3107 7.805900 2015-01-05 000019.SZA

种算法的比较

通过使用不同的算法,平台可以实现不同的策略

  • 排序可以将股票按照某个特征排序,进而达到筛选股票的目的
  • 回归可以预测出股票收盘价等数据的走向,帮助选股
  • 分类可以筛选出某个特征达到一定值的股票,过滤掉表现不好的股票

\

策略案例

https://bigquant.com/experimentshare/b564260a701d408f8d48ed503a212f43

https://bigquant.com/experimentshare/c6f6814d0efb4134b39f21800fc32ca4

\

标签

AI选股排序算法XGBoost模型机器学习算法
评论
  • 楼主,没有策略代码
{link}