机器学习多因子策略

前言

在二级市场的量化策略中,多因子策略称得上是最早被创造但同时也是变化最多的投资策略之一,好的因子意味着长期稳定的收入,因此能够发现一个好的因子是每位宽客的一致愿望。多因子策略理解起来并不复杂,实现起来却可以通过多种不同的渠道,从而带来不同的表现,本文基于经济学家在2005和2012发表的两篇论文,探究市值因子在我国二级市场中的表现。

与传统多元线性回归不同,本文采用了支持向量回归(Support Vector Regression)和随机森林回归(Random Forest Regression)两种机器学习算法得到因子,实证表明,SVR算法下得到的因子带来的收益率显著优于传统多元线性回归,而随机森林算法下得到的因子带来的收益率虽略低于多元线性回归,但在经历回撤时拥有更加稳定的表现。

本文由 JoinQuant 量化课堂推出 。难度标签为进阶,理解深度标签:level-1

作者: xfy
编辑: 肖睿
多因子策略简介

所谓因子,通俗来讲就是一个“标准”,这个“标准”决定我们选择哪些股票,决定我们什么时候买入卖出,决定我们交易的份额。而多因子,顾名思义就是根据多个“标准”确定我们的投资策略,最为经典的多因子模型之一当属Fama和French提出的三因子模型,而其基本思路为,我们假定股票的超额收益率可以由市场风险,市值风险,账面市值比三个因素决定,因此我们将股票一个时期内的超额收益率对这三个因素进行回归,再将回归得到的参数对本时期内的超额收益率进行预测,比较真实值和预测值。如果预测值大于真实值,也就是说理论上的超额收益率应该大于当前的超额收益率,那么根据有效市场假说,未来的超额收益率应该上升,反之亦然。

除了最简单的三因子模型外,Fama和French还在2013年提出了五因子模型,对个股的超额收益率进行了更加细致的解读。关于多因子策略,更加详细介绍可以参考聚宽量化课堂的以下几篇文章:

《多因子策略入门》
《Fama-French三因子火锅》
《Fama-French五因子模型》

市值解释因子简介

2005年,在哈佛大学Matthew Rhodes-Kropf教授以及杜克大学S. Viwanathan和David T. Robinson教授合著的论文《Valuation Waves and Merger Activity: The Empirical Evidence》中,股票市值被分解为如下的三因子模型:

m=α0IND+α1b+α2ln(NI)++α3I(<0)ln(NI)++α4LEV+ε
其中,IND
为行业虚拟变量矩阵(若该股属于某行业,则将这一行业虚拟变量的值设为1,其他行业虚拟变量的值设为0),m
为个股的对数市值,b
为个股的对数净资产,NI
为公司净利润,这里注意,为了区分净利润的正负,我们增加了一个代表正负的虚拟变量,当且仅当净利润为负时,这个虚拟变量的值为1,并且我们取净利润绝对值的对数作为自变量。LEV
为公司的财务杠杆(负债除以资产)。作者用这个模型对特定美股进行拟合,平均拟合优度超过80%,也就是说,这个三因子模型可以被认为是有效的。

2012年,马里兰大学的Charles R. Hulten教授及其博士生Janet X. Hao发表的论文《The Role Of Intangible Capital in the Transformation and Growth of the Chinese Economy》中,发现上市公司的市值与其净资产、开发支出、组织资本以及市盈率密不可分,选取开发支出力度大的公司进行下述回归,拟合优度可以达到94%。

m=α0+α1b+α2RD+α3O+α4PE+ε
其中,α0
为年度虚拟变量矩阵,m
和b
的含义与上文相同,RD
为对数开发支出,O
为对数组织资本,PE
为市盈率。
综上所述,我们可以认为,股票在某一时间点的市值可以被多个因子解释,我们把这些因子统称为市值解释因子,由于股票价格等于股票总市值除以股票数量,因此在股票数量不变的情况下,我们可以用市值解释因子对股票价格进行预测。

模型搭建与因子选择

从上文我们能够看出,某个时间点上,股票的市值可以被多个因素解释。根据多因子策略的基本思路,我们在截面上将市值对多个因子进行回归,得到的残差值越小,说明股票市值向下偏离其理论值越严重,也就意味着该股票未来上涨的可能性越大。
而在选择因子方面,我们结合两篇文献,选择了以下财务指标作为解释因子的自变量:对数净资产,对数净利润,公司财务杠杆,营业收入增长率,对数开发支出,以及行业虚拟变量。

在回归方法上,我们首先采用了最传统的多元线性回归:

m=α0IND+α1b+α2ln(NI)++α3I(<0)ln(NI)++α4LEV+α5g+α6RD+ε
其中m
为个股的对数市值,IND
为行业虚拟变量矩阵(若该股属于某行业,则将这一行业虚拟变量的值设为1,其他行业虚拟变量的值设为0),b
为个股的对数净资产,NI
为公司净利润,这里注意,为了区分净利润的正负,我们增加了一个代表正负的虚拟变量,当且仅当净利润为负时,这个虚拟变量的值为1,并且我们取净利润绝对值的对数作为自变量。LEV
为公司的财务杠杆(负债除以资产),g
为营业收入的增长率(年度同比),RD
为对数开发支出(若没有则为0)。

除了多元线性回归,我们尝试了包含随机网络、Adaboost、支持向量机回归的多种机器学习回归算法,发现随机森林回归和支持向量机回归表现较好,接下来我们对这两种机器学习算法进行简要介绍。

随机森林回归

随机森林是一种比较新的机器学习模型,它的基本思路是:多次有放回地在样本集中抽取样本,从全体特征中选择部分特征对模型进行训练,每次训练的结果对新实例进行预测时,随机森林需要整合其各个决策树的预测结果。解决回归问题时,每个树得到的预测结果为实数,最终的预测结果为各个树预测结果的平均值。

更详细地关于决策树及随机森林算法的介绍,可以参考聚宽量化课堂关于该算法的专题介绍:
《决策树入门及Python应用》
《随机森林入门》

支持向量回归

支持向量回归(SVR)是支持向量机在回归方面的应用,基本思路大致相同,关于SVM算法详细解释可以关注聚宽量化课堂的文章:
《SVM原理入门》

两个模型的数学原理都有一定难度,所幸python的sklearn库提供了两种算法的程序包,对算法本身没有兴趣进行深究的读者,可以直接应用sklearn中的函数。我们将上述用来线性回归的自变量作为特征输入模型进行回归,并对回归结果进行分析。

因子有效性验证及策略设计

我们采用上述三种方法,从聚宽数据库中调取相应数据进行回归,其中行业虚拟变量矩阵采用申万一级行业划分,股票池选择中证全指中的所有股票,回测时间为2012年1月1日至2017年12月31日。我们每十个交易日进行一次回归,并将回归得到的结果用到当日的股票上,计算预测值与真实值之间的差距(残差),按照残差从小到大的顺序对股票进行排序,依据不同分位数,分十档买入,每十个交易日进行一次调仓,将不在该档的股票卖出,得到如下分档超额收益率,最大回撤比率以及对数收益曲线。

### 聚宽平台上的机器学习多因子策略 #### 使用聚宽平台进行多因子策略开发的优势 聚宽是一个集成了多种金融工具和技术支持的量化交易平台,特别适合用于实施复杂的交易策略,如基于机器学习多因子选股模型。该平台不仅提供了丰富的历史行情数据接口,还内置了大量的技术指标计算函数和支持Python编程环境,使得开发者可以方便快捷地测试自己的想法。 #### 构建多因子模型的关键要素 为了在聚宽上成功部署一个多因子策略,有几个方面需要注意: - **特征工程**:这是指从原始市场数据中提取有用的信息作为输入给到后续训练过程的过程。通常会涉及到价格变动率、成交量变化趋势等多个维度的数据处理[^1]。 - **选择合适的算法**:根据具体的应用场景挑选最适宜解决问题类型的机器学习算法非常重要。比如,在预测股价走势时可能更适合采用时间序列分析或者深度学习的方法;而在筛选优质个股的时候,则更多依赖于分类器来进行质量评判[^3]。 - **回测机制的设计**:任何一种新的投资理念都需要经过严格的检验才能被采纳进入实盘操作阶段。因此建立一套科学合理的绩效评估体系就显得尤为必要了。这其中包括但不限于夏普比率、最大回撤幅度等风险调整收益衡量标准。 #### 示例代码片段 下面给出一段简单的示例代码,展示了如何利用`sklearn`库中的随机森林分类器配合聚宽API获取的历史数据来创建一个基本版的多因子选股程序: ```python from jqdata import * import pandas as pd from sklearn.ensemble import RandomForestClassifier def initialize(context): set_benchmark('000300.XSHG') # 设置沪深300指数为基准 context.stocks = get_index_stocks('000300.XSHG') def handle_data(context, data): df = finance.run_query(query(finance.STK_FINANCE_INDICATOR).filter( finance.STK_FINANCE_INDICATOR.code.in_(context.stocks)).limit(50)) X = df[['roe', 'eps']] # 特征向量 y = (df['pe'] < 20).astype(int) # 标签 clf = RandomForestClassifier() clf.fit(X, y) predictions = clf.predict_proba(X) top_10 = sorted(zip(predictions[:, 1], context.stocks), reverse=True)[:10] for score, stock in top_10: order_target_percent(stock, 0.1 / len(top_10)) # 平均分配资金买入前十个高分股 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值