在第一篇中,我们实现了一个简单单因子的策略模型,但是在实际中,我们是远远不会满足于一个因子甚至几个因子的。

市场上目前挖掘出来的因子成千上万个,如何有效筛选出比较好的几个因子构建一个选股模型呢?

手动从无穷多个因子中筛选出几个因子显然不太现实,现在网上的主流思想都是使用线性回归模型以及机器学习模型从众多的因子中筛选出有效因子。

一般投资者构建多因子模型的思路如下:

首先根据自己的喜好人工选择因子,或者基于统计数据选择因子,又或者直接将所有因子投喂给模型,构建自己的因子库之后合成或者预测选股择时的信号,根据投资的目标对选股以及择时信号做出反应。

而在本篇文章中,我们将采用机器学习的算法对股票进行选股买入。

目录

策略思路

构建本策略因子库

回测结果

模型评价和展望

策略源代码


策略思路

1、回测时间:2020年

2、模型训练时间:前五个月,股票池采用沪深300成分股。

3、调仓时间:每个月的第一个交易日。

4、数据获取:基于本篇中粗略手动筛选出来的几个因子,获取沪深300成分股当前的因子数据。

5、数据处理:对因子数据进行去极值和标准化处理,计算沪深300成分股当前的月收益率,这里只需要判断收益率的正负就好。

6、委托下单:基于以上五步训练出来的模型,对未来一个月的收益率进行预测,并将筛选出来的股票调仓到持仓中。最后并将数据继续喂给模型。

构建本策略因子库

为了方便以下的研究,本篇暂且选择一个大类因子,一共6个因子构建多因子模型,其中这些因子的信息如下所示:

回测结果

回测结果如下所示,其中累计收益率为23.33%,夏普比率为1.72,说明模型有待优化,可以参考上文中对模型的展望对模型进行优化改进。

(回测报告由掘金量化提供)

模型评价和展望

优点:本篇中实现了机器学习模型滚动训练,采用了掘金2020年的几个因子的数据,在2020年前半年训练出模型,在后半年在回测中将预测会涨的股票调仓进持仓中,该模型可以很好的应用于市场中。

缺点:这个模型的思想虽然有可取之处,但是调仓周期一个月还是有点长;其次,对于因子数据的平稳性以及有效性,在该策略中没有进行检验和处理;

对该模型的改进的展望:

1、可以设置多一些因子数据放进模型中。

2、可以在预测模型建立之前筛选出合适的因子或者构造新的因子。

3、对数据进行有效性检验以及处理。

4、可以加入择时因子,适时买入。

5、这个模型中筛选出股票之后是将持仓先全部平仓再买入筛选出来的股票,这里可以先去判断筛选出来的股票池中的股票是否在持仓中,不在的话再委托买入,同时卖出在持仓但不在股票池中的股票。

6、这个模型做的是二分类模型,可以考虑换成回归模型,对股票收益率进行回归和预测,买入预测收益率最大的前几支股票。

策略源代码

# coding=utf-8
from __future__ import print_function, absolute_import
from gm.api import *
import datetime
import pandas as pd
import numpy as np
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split# 中位数去极值法
def filter_MAD(df, factors, n=3):"""df: 去极值的因子数据factor: 待去极值的因子字段n: 中位数偏差值的上下界倍数return: 经过处理的因子df"""for factor in factors:median = df[factor].quantile(0.5)new_median = ((df[factor] - median).abs()).quantile(0.5)max_range = median + n * new_medianmin_range = median - n * new_medianfor i in range(df.shape[0]):if df.loc[i, factor] > max_range:df.loc[i, factor] = max_rangeelif df.loc[i, factor] < min_range:df.loc[i, factor] = min_rangereturn df# 策略中必须有init方法
def init(context):#从掘金中导入因子数据context.factor_names=['PB','PCLFY','PCTTM','PETTM','PSTTM','DY']#获取沪深300成分股股票context.hs300=get_constituents(index='SHSE.000300')#每月的第一个交易日的09:40:00执行策略algo_1schedule(schedule_func=algo_1, date_rule='1m', time_rule='9:40:00')#设置预测模型context.clf = AdaBoostClassifier(n_estimators=100, random_state=0)#回测开始后前五个月左右训练模型,之后的时间每个月执行下单委托,所以这里要加一个判断的日期#设置训练模型的时间,这里设置回测开始时间的20周context.if_date=datetime.datetime.strptime(context.backtest_start_time,'%Y-%m-%d %H:%M:%S')+datetime.timedelta(weeks=20)def algo_1(context):    #获取因子数据

以上仅展示部分代码,完整代码请点击下方地址获取。

基于机器学习选股策略 - 掘金量化社区 - 量化交易者的交流社区掘金量化社区是量化投资者策略研讨、答疑解惑、资源共享的互动交流论坛。https://bbs.myquant.cn/topic/2382

声明:本内容首发至掘金量化公众号掘金量化社区,仅供学习、交流、演示之用,不构成任何投资建议!如需转载原创文章请联系掘金小Q(myquant2018)。

多因子系列(二):基于机器学习选股策略(附源码)相关推荐

  1. 智能优化算法之遗传算法(GA)的实现(基于二进制编码,Python附源码)

    文章目录 一.遗传算法的实现思路 二.基于二进制编码方式的遗传算法的实现 1.库的导入 2.目标函数 3.个体编码函数 4.个体解码函数 5.选择函数 6.交叉函数 7.变异函数 8.算法主流程 一. ...

  2. 基于halcon实现视觉定位框架(C#做主算法,C#、MFC、Qt二次开发)【附源码】

    文章目录 前言 演示视频 一.项目文件目录讲解 1.CtuVisionControlLibrary 2.CtuVisionDLLTest_CSharp 2.CtuVisionDLLTest_MFC 2 ...

  3. 人工智能离前端并不远 一步步教你开发一个机器学习APP(附源码)

    最近HBO电视网推出的美剧<硅谷Silicon Valley>席卷全球,里面有一个桥段介绍了超级有趣的iOS app- Not Hotdog.你甚至可以在APP Store上下载到它. 受 ...

  4. 量化买卖压力选股(附源码)

    股票的任何一笔交易都需要对手盘的存在,这是一个双方买卖撮合的过程.在这一过程中,股票价格的变动与买压(买入强度).卖压(卖出强度)相关. 买压越大,价格上涨的概率越大,卖压越大,价格下跌的概率越大. ...

  5. RoI Pooling 系列方法介绍(文末附源码)

    作者简介 CW,广东深圳人,毕业于中山大学(SYSU)数据科学与计算机学院,毕业后就业于腾讯计算机系统有限公司技术工程与事业群(TEG)从事Devops工作,期间在AI LAB实习过,实操过道路交通元 ...

  6. python 经验模态分解_经验模态分解下的日内趋势交易策略 附源码

    策略分析过程参考  广发证券的研究报告. 其中EMD库的安装参考 1.指标 在每天分钟数据积累mlen个bar的位置,将今日的数据通过EMD分解为噪声部分和趋势部分. 定义信噪比 SNR = std( ...

  7. leaflet-webpack 入门开发系列三地图分屏对比(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载 webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 ...

  8. cesium 入门开发系列矢量瓦片加载展示(附源码下载)

    前言 cesium 入门开发系列环境知识点了解: cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等 cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 ...

  9. jsp+ssm计算机毕业设计大学城二手书交易网站【附源码】

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

最新文章

  1. 网站出现403 Forbidden
  2. javascript 代码分离 的那些事儿
  3. Zepto自定义模块打包构建
  4. Python爬虫你需要积累这些基本知识_Python学习基础路线
  5. php object
  6. 判断浏览器版本,当浏览器版本过低时提示升级浏览器,不显示原来页面内容
  7. c语言频谱图,c-实时绘制频谱图?
  8. 台式电脑主板插线步骤图_图解电脑主机电源线接法图解
  9. 苹果开发者公司账号注册流程注册新的苹果Apple Id并双重验证步骤
  10. oracle 怎么截取中文,oracle 截取字符(substr)
  11. 黑科技新添成员, 小米mix5再次创新, 但这些真的只是黑科技的全部吗?
  12. 游戏微服务架构设计:棋牌游戏
  13. xpath爬取笔趣阁小说
  14. 百度网盘开放平台接入(Python)
  15. android 寺库trytry_人民日报与寺库trytry合作 后共享时代迎新玩法
  16. 苹果商店ASA广告投放之TTR和CR
  17. 北航微信打卡自动提醒程序
  18. 空格如何处理(全角和半角的区分)
  19. HTML创建12列小屏幕网格,Bootstrap 网格系统(Grid System)
  20. W530安装外置N显卡,实现3显卡同时使用

热门文章

  1. Linux进阶 | 万字详解Docker镜像的制作,手把手学会!
  2. Keyphrase Chunking - bert2chunk_dataloader.py分析
  3. 大数据基础之Spark——Spark pregel详细过程,一看就懂
  4. 家校在线app 页面
  5. treegrid 的使用介绍
  6. 中国象棋总体设计 中国象棋课设02
  7. 云凤蝶可视化搭建的推导与实现 - SEE Conf
  8. Python基础速成笔记(1)(适合有C/C++的基础)
  9. 几招紧急应对夏天雷雨天机房断电的方法!
  10. 移动应用的黑盒测试(1)