AI选股中回归、分类、排序算法的构建流程
由iquant创建,最终由qxiao 被浏览 530 用户
导语
【旧版模块】,该文档为旧版。新模板详见:
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 >, b, c, d)
where(a >, 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
\