股票行情查询

股票入门基础知识,股票交易手续费,股票大全,股票行情查询

多因子选股策略(多因子量化选股策略)

2023-06-24 21:24分类:买入技巧 阅读:

多因子策略希望能选取在各个因子上综合得分较高的股票,通过这种方式选出来的股票通常不会在某个因子上有特别的短板。然而,在筛选有效因子的时,我们做的单因子检验认为该有效因子的极端组合会有最出色的表现,综合得分最高的股票未必在单个因子上有出色表现,更可能是在各个因子上表现都还可以的股票。本文选取历史入选率最高的5个因子,选取每个因子值最极端的那部分股票,然后对各因子选出的股票进行组合构建,取得了不错的效果,供投资者参考。

总市值。TOP100组合2008年至今相对沪深300指数的年化超额收益为46.40%,月度胜率为71.60%。行业中性组合2008年至今相对沪深300指数的年化超额收益为26.93%,月度胜率为74.07%。

日均成交额。TOP100组合2008年至今相对沪深300指数的年化超额收益为41.54%,月度胜率为71.60%。行业中性组合2008年至今相对沪深300指数的年化超额收益为28.75%,月度胜率为75.31%。

过去一个月收益率。TOP100组合2008年至今相对沪深300指数的年化超额收益为21.64%,月度胜率为64.20%。行业中性组合2008年至今相对沪深300指数的年化超额收益为17.00%,月度胜率为65.43%。

换手率。TOP100组合2008年至今相对沪深300指数的年化超额收益为14.25%,月度胜率为69.14%。行业中性组合2008年至今相对沪深300指数的年化超额收益为11.89%,月度胜率为76.54%。

估值。TOP100组合2008年至今相对沪深300指数的年化超额收益为11.85%,月度胜率为55.56%。行业中性组合2008年至今相对沪深300指数的年化超额收益为11.53%,月度胜率为76.54%。

进取组合。该组合2008年至今相对沪深300指数的年化超额收益为26.91%,月度胜率为70.37%。

稳健组合。该组合2008年至今相对沪深300指数的年化超额收益为19.16%,月度胜率为74.07%。

选股效果的微观评价。较之随机抽样生成的基准分布,策略的分位点分布呈现明显的右偏,有54.6%的股票表现好于中位数,这说明在微观层面,该方法选出的股票具有统计意义上的稳定性。

 

最近股市是不是认了熊为“干爹”了,一直在喊“爹爹爹”(跌跌跌)(⊙o⊙)…看回上证指数和创业板的K线图,都是30度斜向下的曲折的直线。这周唯独银行股表现靓丽,中证银行指数连续红了5天,国家队在大盘不行的时候,总是用拉银行股护盘的伎俩。

为什么国家队偏爱银行股?估值低!估值低!估值低!重要的事情说三遍。瞄一下银行股的估值:行业加权平均7.13倍市盈率、市净率0.92、2016年加权净资产收益率16.33%。拿着这样低估值的股票估计是可以天天睡得安心的!

候选因子

估值因子:市盈率、市净率、市销率、市现率、股息率;

资产结构因子:流动比率、资产负债率、固定资产比例;

盈利能力因子:营业利润率、销售净利率、销售毛利率、净资产收益率、资产回报率;

营运效率因子:总资产周转率、存货周转率;

成长性因子:PEG、营业收入增长率、净利润增长率、毛利润增长率、营业利润增长率。


有效因子

经检验,有效因子:市盈率、市销率、净资产收益率、市净率。


选股思路

市盈率、市销率、净资产收益率、市净率四个因子各占25%的权重,市净率、市盈率、市销率由小到大排列,净资产收益率由大到小排列。


回测方法

调仓方法: 每5个交易日调一次仓,以收盘价换仓;

持仓上限:10只股票 ,当选出股票数少于10只时,等权重买入所有股票;

回测时间:2011年1月3日 至2017年5月10日;

基准对比: 沪深300指数。


回测结果

来源:大策略app

来源:大策略app

总收益:从2011年初开始获得128%的收益,年化收益达14%,跟行业加权净资产收益率很接近。

夏普比率:0.4。说明每承受单位风险获得了0.4的超额回报;这个策略还是一个不错的。

Alpha:12.44%。相对沪深300,该策略每年多获得12.44%的投资收益。

总体来说,按照我们选出的因子来选股,虽然难有赚大钱的兴奋,但是每年平均能获得接近14%的收益率,还是比买货币基金强很多的(别跟我说存银行,这是还在存折存钱的人才干的事),关键是拿着银行股,你吃得好,睡得香!


最新持仓

来源:大策略app

各行业股票池

来源:大策略app

推荐股票:[600016 民生银行] [600015 华夏银行] [601166 兴业银行]


文章由大策略app独家原创, 转账请注明出处!

 

摘要

人工智能和机器学习能与量化多因子选股模型相结合

人工智能(Artificial Intelligence)本质是以数理模型为核心工具,结合控制论、认知心理学等其它学科的研究成果,最终由计算机系统模拟人类的感知、推理、学习、决策等功能。从模型构建的角度上来看,机器学习与多因子选股有诸多共通之处,借助机器学习模型,多因子模型可以在以下方面相比于传统方法论有所突破:1. 机器学习模型相比传统线性模型在海量数据下有更好的性能。基于机器学习的多因子选股模型能充分使用海量、高维的因子数据。2. 大多数机器学习模型都具有非线性拟合能力。基于机器学习的多因子选股模型能利用非线性因子。

两种常用的机器学习模型:XGBoost和Stacking均有优秀的选股能力

本文介绍了两种常用的机器学习模型的原理:XGBoost和Stacking。XGBoost具有非线性拟合能力强、速度快等特点。Stacking则具有集成多个强学习器来达到取长补短的能力。我们在全A股票池内,构建月频调仓的中证500增强策略,在2011年1月31日到2019年9月30日的回测区间内,XGBoost年化超额收益率为17.17%,超额收益最大回撤为3.88%,信息比率为3.57。Stacking年化超额收益率为18.36%,超额收益最大回撤为4.74%,信息比率为3.70。两个模型均有优秀的选股能力。

人工智能量化多因子基金使用了AI技术,具有量化投资的多种优点

本文以信达澳银量化多因子混合基金(166107.OF)为例,分析了人工智能量化多因子基金的特点。该基金通过人工智能技术来利用多种来源的因子并进行非线性拟合,在云计算平台上实现专业策略回测框架、系统策略分析工具和模拟实盘交易的快速落地。该基金还具有传统量化投资中的纪律性优势、管理方法优势、风险管理优势、投资视野优势、多层次策略组合优势等特点。

风险提示:通过人工智能模型构建选股策略是历史经验的总结,存在失效的可能。人工智能模型可解释程度较低,使用须谨慎。本报告对历史数据进行梳理总结,不构成任何投资建议

人工智能与多因子选股模型的结合

人工智能(Artificial Intelligence)本质是以数理模型为核心工具,结合控制论、认知心理学等其它学科的研究成果,最终由计算机系统模拟人类的感知、推理、学习、决策等功能。近年来,伴随着计算机算力的大幅提升和海量可用数据的积累,人工智能技术经历了突飞猛进的发展。从围棋到电子竞技再到多人德州扑克,人工智能展现了其在复杂博弈环境中的强大自我学习能力。人工智能和它借助的机器学习方法也逐渐渗透到人类生活的方方面面。从手写数字的自动识别,到电脑手机上的指纹解锁功能、语音识别系统,再到无人驾驶、智能医疗、智能投顾等热门领域,处处都有人工智能的身影。在投资领域,为了论证人工智能的有效性和可行性,自2017年6月开始华泰金工连续发布了24篇深度研究报告,并以周报跟踪的方式,向投资者展示人工智能和机器学习运用于量化投资中各个步骤的细节。

如图表1所示,从模型构建的角度上来看,机器学习与多因子选股有诸多共通之处,借助机器学习模型,多因子模型可以在以下方面相比于传统方法论有所突破:

1. 机器学习模型相比传统线性模型在海量数据下有更好的性能。基于机器学习的多因子选股模型能充分使用海量、高维的因子数据。

2. 大多数机器学习模型都具有非线性拟合能力。基于机器学习的多因子选股模型能利用非线性因子。

接下来,我们将介绍常用的机器学习模型。

常用的机器学习模型简介

XGBoost简介

XGBoost 是梯度提升算法的一种高效实现,原理类似GBDT。传统的GBDT通过串行集成多个CART决策树来形成强学习器,XGBoost则在GBDT的基础上进行了多方面优化。相比传统的线性模型,XGBoost由于使用决策树为基学习器,具有非线性拟合能力。决策树是一种非线性的分类器,如图表2的异或问题(横纵坐标X1、X2相同则分类为1,不同则分类为0),该问题在逻辑回归、线性核的支持向量机下无解,但是使用决策树可以轻松解决。

相较于传统的GBDT算法,XGBoost主要在损失函数、正则化、切分点查找和并行化设计这些方面进行了改进,使得其计算上比常见工具包快5倍以上。图表3显示了XGBoost算法的流程,它与GBDT在数学上的主要不同之处在于训练每个弱学习器时的目标函数。

由图表3可知XGBoost算法的基本步骤与GBDT类似,下面主要阐述XGBoost的独特之处。

1. 在损失函数的设计上,XGBoost加入了正则项,用以控制模型复杂度,并且对损失函数做了二阶泰勒展开来近似。而传统的GBDT模型没有正则项,并且在优化时只用到了一阶导数的信息。正则项的加入使得XGBoost模型有着较低的方差,不容易发生过拟合。

2. 在计算信息增益选取最佳切分点时,XGBoost不是使用传统的Gini增益,而是利用图表4的公式来做评价指标。值得注意的是引入分割不一定会使目标函数减小,因为目标函数中还有对引入新叶子的惩罚项,而优化这个目标对应了树的剪枝,当引入分割带来的增益小于一个阈值时,可以剪掉这个分割。

3. XGBoost另外一个独特之处在于其处理缺失值的方法。模型将缺失值当作稀疏矩阵来处理,在寻找切分点的过程中,模型只对该列特征值当中非缺失的值进行遍历,通过这个技巧来减少为稀疏特征寻找切分点的时间开销。在实现上,模型会分别处理将缺失的特征值样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂。

4. XGBoost还借鉴了随机森林的做法,支持列采样,即在选取切分点时只在部分特征中进行筛选,这样不仅能降低过拟合,还能减少计算时间。

5. XGBoost还支持并行,但是XGBoost的并行不是指能够并行地训练决策树,而是在处理特征的层面上实现并行。我们知道,训练决策树最耗时的一步就是对各个特征的值进行排序(为了确定最佳切分点)并计算信息增益,XGBoost对于各个特征的信息增益计算就可以在多线程中进行。

Stacking简介

Stacking是一种常见的集成学习框架。一般来说,Stacking将训练一个多层(一般是两层,本文中默认两层)的模型结构,第一层(也叫学习层)包含n个不同的模型,将得到的预测结果合并为新的特征集,并作为下一层模型的输入,由下一层模型再次根据对应的数据标签进行训练,得到一个完整的框架。简单的示意图如下:

通常情况下,Stacking中第一层的模型会使用拟合度高的模型,以追求对训练数据的充分学习(如XGBoost、神经网络、SVM等)。由于不同的模型在原理上和训练集上有所差别,第一层模型可以认为是从原始数据中自动提取有效特征的过程。第一层模型中,由于使用了复杂的非线性变化提取特征,更易产生过拟合的情况。为了降低过拟合的风险,第二层模型倾向于使用简单的模型,例如逻辑回归、Lasso回归等广义线性模型。从以上分析可以看出,Stacking能够成功的关键在于第一层模型能针对原始训练数据得出有差异性(相关性低)且预测能力好的输出值,这样通过第二层模型进一步学习后,能够在多个第一层模型中取长补短,提升预测的准确度和稳定性。

机器学习选股模型测试流程和测试结果

测试流程

机器学习选股模型的构建方法包含下列步骤:

1. 数据获取:

a) 股票池:全A股。剔除ST股票,剔除每个截面期下一交易日停牌的股票,剔除上市3个月内的股票,每只股票视作一个样本。

b) 回测区间:2011年1月31日至2019年9月30日,月度滚动回测。

2. 特征和标签提取:每个自然月的最后一个交易日,计算图表7中231个因子暴露度,作为样本的原始特征;计算下个自然月的个股超额收益和信息比率(以中证500指数为基准),作为样本的标签。

3. 特征预处理:

a) 中位数去极值:设第T期某因子在所有个股上的暴露度序列为D_i,D_M为该序列中位数,D_M1为序列 |D_i-D_M| 的中位数,则将序列D_i中所有大于D_M+5D_M1的数重设为D_M+5D_M1,将序列D_i中所有小于D_M-5D_M1的数重设为D_M-5D_M1;

b) 行业市值中性化:将填充缺失值后的因子暴露度对行业哑变量和取对数后的市值做线性回归,取残差作为新的因子暴露度。

c) 标准化:将中性化处理后的因子暴露度序列减去其现在的均值、除以其标准差,得到一个新的近似服从N(0,1)分布的序列。

4. 训练集和交叉验证集数据处理:直接将样本合并成为样本内数据,按90%和10%的比例划分训练集和交叉验证集。

5. 样本内训练:训练两个模型:

a) XGBoost,模型输入为231个因子,训练目标为下个自然月的个股超额收益(以中证500指数为基准)。

b) Stacking:包含两个XGBoost基模型,两个模型输入都为231个因子,训练目标分别为下个自然月的个股超额收益和信息比率(以中证500指数为基准),再将两个基模型集成。

6. 交叉验证调整参数:模型训练完成后,使用模型对交叉验证集进行预测。选取交叉验证集MSE最小的一组参数作为模型的最优参数。

7. 样本外测试,组合优化构建组合:确定最优参数后,以T月月末截面期所有样本预处理后的特征作为模型的输入,得到每个样本的预测值f(x),将预测值视作合成后的因子。然后使用组合优化模型得到T月月末截面期的股票权重。进行组合优化时,优化目标为最大化预期收益,约束条件为相对于中证500控制行业市值中性,个股主动权重偏离上限为1%。

8. 模型评价:构建选股组合评价模型。

测试结果: XGBoost和Stacking均有优秀的选股能力

图表8~图表10展示了机器学习选股模型的测试结果,回测区间为2011年1月31日至2019年9月30日,月频调仓,交易成本为双边千分之四。可以看出,机器学习构建的选股模型长期来看相对中证500具有稳定的超额收益,Stacking由于进行了模型集成,相比XGBoost表现更好。

信达澳银量化多因子混合基金的特点:AI+量化投资

基金简介

基本信息

信达澳银量化多因子混合基金(LOF)是一种上市型开放式基金,产品主要成分为股票,占基金资产的60%-95%,选股主要利用的是量化多因子模型。

图表11介绍了信达澳银量化多因子混合型证券投资基金(LOF)的产品要素:

产品费用信息

图表12介绍了信达澳银量化多因子混合型证券投资基金(LOF)的费用信息:

产品投资流程简介

信达澳银量化多因子混合型证券投资基金(LOF)是基于多因子模型的投资产品。多因子模型是通过捕捉多种驱动股票价格变化的因素(因子),对股票的预期收益率和风险进行预测,并在此基础上构建相应投资组合的主动投资管理过程。目前的多因子模型,选取因子分别包括价值、质量、技术、情绪、成长和一致预期六个大类。图表13展示了此产品的投资流程,主要步骤包括数据预处理、模型构建、组合优化、交易执行和绩效归因。首先,需要将获取的各类数据做清洗和预处理,基于处理后的数据进行有效因子的挖掘,再根据这些因子构建投资组合。之后,综合考虑各方面的约束,如:风险约束、行业约束等,对投资组合进行优化,再完成投资交易。最后,还需要做绩效归因,对投资策略盈亏的原因进行分析。

作为量化投资和LOF基金相结合的产物,信达澳银量化多因子混合型证券投资基金同时具备了这两者的优势和特点。

量化投资的优势

量化投资和传统的主动投资本质上是相通的,二者都是通过对个股基本面、量价特征等方面的分析,构建具有超额收益的投资组合。不同的是,主动投资依赖的是基金经理的主观判断,而量化投资则是通过定性思想与定量模型的结合来产生投资信号。传统意义上,投资者对于基金产品的选择较多依赖于过往业绩和基金经理的主管判断,主动管理型产品受“人”的因素和市场风格切换的影响比较大。相比传统的主动投资方法,量化投资方法有以下几大方面的优势:

技术和数据优势

量化投资相比于传统投资的一个优势在于信息的快速接收和处理。量化投资者有机会接触和处理大量不同类型的数据,如金融大数据、舆情数据以及互联网数据,他们可以充分利用这些数据探究和寻找市场规律,挖掘出更多有效、稳定的因子,从而获得超额收益。此外,随着云计算平台的搭建,量化投资者可以利用大量CPU的计算能力,实现专业策略回测框架、系统策略分析工具和模拟实盘交易的快速落地,且云计算平台与大数据的结合,还可以使交易回测结果更为准确。与此同时,人工智能相关算法和技术的发展,也为量化投资者们提供了更多的选择和可能性。各类非线性模型如决策树、随机森林、神经网络的兴起,使得量化投资者在构建多因子模型时,可不再拘泥于线性的因子,而是利用如上述非线性机器学习方法来选择非线性因子,再构建具有线性因子和非线性因子的综合量化多因子模型。

纪律性优势

传统投资的缺陷之一关乎人性的弱点,比如恐惧与贪婪。很多交易者起初的交易理念或许是正确的,但交易时由于心理因素执行了错误的决策。解决这个问题的最好方法是利用机器进行交易,因为机器比人更冷静、执行力更强,这是量化投资非常重要的优势之一。严格执行量化投资模型给出的投资建议、不随投资者的情绪变化而随意更改,这样不仅可以克服人性弱点,也可以克服行为金融学中经常谈及的认知偏差,从而以绝对理性、符合逻辑的方法进行投资。

管理方法优势

传统的主动投资者通过对公司财务、估值等方面的信息进行综合考量,产生一个主观判断结果,进而形成投资决策。而量化投资者可以通过建立模型、构建组合、回测验证等一系列流程来客观评价模型的优劣,有反馈地进行修改完善。相较于主动投资,量化投资可以更透明地展示与执行投资者的理念,在管理方法上是具有优势的。

风险管理优势

量化投资还有利于风险管理。风险控制在交易过程中具有重要地位。交易者一旦被情绪主导,所有止盈止损线可能就会失去意义。但是在量化投资中,风险控制模块可以被提前编入模型当中,这样在交易执行过程中风险就会被监控,避免了人为干扰。

投资视野优势

传统的价值投资讲究全面、深入分析上市公司,挖掘投资机会,但基金经理或行业研究员的精力都是有限的,很难跟踪、监控全市场。而量化投资借助于计算机强大的数据处理能力,可以做到全市场、全品种、全周期覆盖,及时捕捉投资机会,具备更广阔的投资视野。

多层次策略组合优势

量化投资在策略选择的层次与角度上也有非常大的优势。它可以自上而下地结合多层次的量化模型,例如大类资产配置模型、行业轮动模型、选股模型等等;在选股模型中,还能多角度地对各种指标进行观察,包括宏观周期、市场结构、估值、成长等等。并且,量化投资可以通过事后的归因分析,剥离出各层策略的收益与风险,逐个加以完善。这种全方位多角度的评估是主动投资研究难以做到的,而量化投资方法在这方面非常有优势。

LOF基金的优势

LOF(上市型开放式基金Listed-Open-Ended Fund),是一种可以在交易所挂牌交易的开放式基金。LOF同时存在一级市场和二级市场,可以像开放式基金一样通过基金发起人、管理人、银行及其他代销机构网点进行申购和赎回。同时,也可以像封闭式基金那样通过交易所的系统买卖。

上市型开放式基金(LOF)的优势主要有以下几点:

1. 费用相对较低:比起普通开放式基金申购、赎回双向费率,LOF基金在交易所交易的费用收取标准比照封闭式基金的有关规定办理,交易手续费率相对较低。

2. 资金到账快:采用场外交易方式,T日申购的基金份额,T+2日才可赎回,资金从赎回日起3到7个工作日才可收到。而场内交易,可以实现T+1基金交割、资金交收。

3. 存在套利机会:当市场价格>基金份额净值(申购日)+申购费用+卖出佣金时,投资者可通过选择“场内申购”基金份额后(T+2个工作日)再“场内卖出”份额实现套利。当市场价格<基金份额净值(赎回当日)-赎回费用-买入出佣金时,投资者可通过“场内买入”基金份额后(T+1个工作日)再“场内赎回”份额实现套利。

4. 交易方便:LOF基金可以让投资者像买卖股票或封闭式基金一样在二级市场进行交易,方便投资者更快的把握行业轮动与市场择时。

5. 参与科创板投资:相比较普通投资者严格的科创板股票投资准入标准,LOF基金可以方便投资者更加积极的参与到科创板投资机会。

信达澳银基金管理团队介绍

信达澳银基金于2006年6月5日成立,是国内首家由国有资产管理公司控股,也是澳洲唯一在中国合资设立的基金管理有限公司。截止2018年12月31日,公司共管理21只公募产品,产品覆盖股票、指数、量化、债券、货币。资产管理总规模274.88亿元,其中公募基金总规模142.69亿元,专户总规模132.19亿元。

信达澳银的公募投资研究团队共有34人,共拥有基金经理10人。截至2019年9月30日,信达澳银基金旗下权益类基金以今年前三季度42.23%的绝对收益率,位列同类排名6/126;以最近三年28.11%的绝对收益率,位列同类排名11/99。另外,信达澳银的智能量化团队发展迅速,团队首创了量化LOF+科创网下申购的投资策略,采用主动量化模型在沪深A股以及科创板股票中择优投资,并在不断推广量化多因子LOF、量化先锋LOF、量化科技龙头LOF和量化新经济LOF等产品。

信达澳银量化多因子混合基金(LOF)拟任基金经理为王咏辉先生。王咏辉先生是英国牛津大学工程科学本科,牛津大学计算机科学硕士,现担任信达澳银基金副总经理兼权益投资总部总监、智能量化与资产配置总部总监,21年证券基金从业经验。自1998起曾任职于伦敦摩根大通投资基金管理公司、HSBC、BarclaysGlobalInvestor、BarclaysCapital等知名公司。2008年1月回到中国担任泰达宏利基金公司国际投资部负责人、量化投资部负责人等职,2010年4月至2012年8月担任泰达宏利沪深300指数增强指数型证券投资基金基金经理,2011年7月至2012年8月担任泰达宏利全球新格局(QDII-FOF)证券投资基金基金经理。2013年12月起担任鹏华中证500量化指数增强证券投资基金(LOF)基金经理,2014年12月起担任鹏华沪深300量化指数增强证券投资基金(LOF)基金经理。同时负责管理鹏华基金的量化对冲套利专户组合和股票市场中性量化对冲专户组合,总规模500亿人民币。王咏辉先生2018年加盟信达澳银基金管理有限公司, 2018年6月起担任信达澳银新起点定期开放灵活配置混合型基金基金经理,2018年12月起担任信达澳银领先增长混合型基金基金经理, 2019年4月起担任信达澳银转型创新股票型基金基金经理,信达澳银中证沪港深高股息精选指数型证券投资基金基金经理。王咏辉先生是中国量化投资俱乐部第三任理事长,具有英国基金经理从业资格(IMC)和英国IET颁发的特许工程师(CEng)认证资格,是中国科学院大学管理学院MBA企业导师。

王咏辉先生具有丰富的量化基金管理经验,其管理的信达澳银领先增长基金(610001.OF)使用量化指数增强的方法进行投资运作,增强基准为中证500。2019年截至9月30日获得了33.65%的收益,同期中证500涨跌幅为18.54%。

风险提示

通过人工智能模型构建选股策略是历史经验的总结,若市场规律改变,存在失效的可能。人工智能模型可解释程度较低,归因较困难,使用须谨慎。本报告对历史数据进行梳理总结,不构成任何投资建议

免责申明

本报告仅供华泰证券股份有限公司(以下简称“本公司”)客户使用。本公司不因接收人收到本报告而视其为客户。

本报告基于本公司认为可靠的、已公开的信息编制,但本公司对该等信息的准确性及完整性不作任何保证。本报告所载的意见、评估及预测仅反映报告发布当日的观点和判断。在不同时期,本公司可能会发出与本报告所载意见、评估及预测不一致的研究报告。同时,本报告所指的证券或投资标的的价格、价值及投资收入可能会波动。本公司不保证本报告所含信息保持在最新状态。本公司对本报告所含信息可在不发出通知的情形下做出修改,投资者应当自行关注相应的更新或修改。

本公司力求报告内容客观、公正,但本报告所载的观点、结论和建议仅供参考,不构成所述证券的买卖出价或征价。该等观点、建议并未考虑到个别投资者的具体投资目的、财务状况以及特定需求,在任何时候均不构成对客户私人投资建议。投资者应当充分考虑自身特定状况,并完整理解和使用本报告内容,不应视本报告为做出投资决策的唯一因素。对依据或者使用本报告所造成的一切后果,本公司及作者均不承担任何法律责任。任何形式的分享证券投资收益或者分担证券投资损失的书面或口头承诺均为无效。

本公司及作者在自身所知情的范围内,与本报告所指的证券或投资标的不存在法律禁止的利害关系。在法律许可的情况下,本公司及其所属关联机构可能会持有报告中提到的公司所发行的证券头寸并进行交易,也可能为之提供或者争取提供投资银行、财务顾问或者金融产品等相关服务。本公司的资产管理部门、自营部门以及其他投资业务部门可能独立做出与本报告中的意见或建议不一致的投资决策。

本报告版权仅为本公司所有。未经本公司书面许可,任何机构或个人不得以翻版、复制、发表、引用或再次分发他人等任何形式侵犯本公司版权。如征得本公司同意进行引用、刊发的,需在允许的范围内使用,并注明出处为“华泰证券研究所”,且不得对本报告进行任何有悖原意的引用、删节和修改。本公司保留追究相关责任的权力。所有本报告中使用的商标、服务标记及标记均为本公司的商标、服务标记及标记。

本公司具有中国证监会核准的“证券投资咨询”业务资格,经营许可证编号为:941011J。

全资子公司华泰金融控股(香港)有限公司具有香港证监会核准的“就证券提供意见”业务资格,经营许可证编号为:AOK809

©版权所有2019年华泰证券股份有限公司

林晓明

执业证书编号:S0570516010001

华泰金工深度报告一览

金融周期系列研究(资产配置)

【华泰金工林晓明团队】二十载昔日重现,三四年周期轮回——2019年中国与全球市场量化资产配置年度观点(下)

【华泰金工林晓明团队】二十载昔日重现,三四年周期轮回——2019年中国与全球市场量化资产配置年度观点(上)

【华泰金工林晓明团队】周期轮动下的BL资产配置策略

【华泰金工林晓明团队】周期理论与机器学习资产收益预测——华泰金工市场周期与资产配置研究

【华泰金工林晓明团队】市场拐点的判断方法

【华泰金工林晓明团队】2018中国与全球市场的机会、风险 · 年度策略报告(上)

【华泰金工林晓明团队】基钦周期的量化测度与历史规律 · 华泰金工周期系列研究

【华泰金工林晓明团队】周期三因子定价与资产配置模型(四)——华泰金工周期系列研究

【华泰金工林晓明团队】周期三因子定价与资产配置模型(三)——华泰金工周期系列研究

【华泰金工林晓明团队】周期三因子定价与资产配置模型(二)——华泰金工周期系列研究

【华泰金工林晓明团队】周期三因子定价与资产配置模型(一)——华泰金工周期系列研究

【华泰金工林晓明团队】华泰金工周期研究系列 · 基于DDM模型的板块轮动探索

【华泰金工林晓明团队】市场周期的量化分解

【华泰金工林晓明团队】周期研究对大类资产的预测观点

【华泰金工林晓明团队】金融经济系统周期的确定(下)——华泰金工周期系列研究

【华泰金工林晓明团队】金融经济系统周期的确定(上)——华泰金工周期系列研究

【华泰金工林晓明团队】全球多市场择时配置初探——华泰周期择时研究系列

行业指数频谱分析及配置模型:市场的周期分析系列之三

【华泰金工林晓明团队】市场的频率——市场轮回,周期重生

【华泰金工林晓明团队】市场的轮回——金融市场周期与经济周期关系初探

FOF与金融创新产品

【华泰金工】生命周期基金Glide Path开发实例——华泰FOF与金融创新产品系列研究报告之一

因子周期(因子择时)

【华泰金工林晓明团队】市值因子收益与经济结构的关系——华泰因子周期研究系列之三

【华泰金工林晓明团队】周期视角下的因子投资时钟--华泰因子周期研究系列之二

【华泰金工林晓明团队】因子收益率的周期性研究初探

择时

【华泰金工林晓明团队】A股市场低开现象研究

【华泰金工林晓明团队】华泰风险收益一致性择时模型

【华泰金工林晓明团队】技术指标与周期量价择时模型的结合

【华泰金工林晓明团队】华泰价量择时模型——市场周期在择时领域的应用

【华泰金工林晓明团队】波动率与换手率构造牛熊指标——华泰金工量化择时系列

行业轮动

【华泰金工林晓明团队】景气度指标在行业配置中的应用——华泰行业轮动系列报告之九

【华泰金工林晓明团队】再探周期视角下的资产轮动——华泰行业轮动系列报告之八

【华泰金工林晓明团队】“华泰周期轮动”基金组合改进版——华泰行业轮动系列报告之七

【华泰金工林晓明团队】“华泰周期轮动”基金组合构建——华泰行业轮动系列之六

【华泰金工林晓明团队】估值因子在行业配置中的应用——华泰行业轮动系列报告之五

【华泰金工林晓明团队】动量增强因子在行业配置中的应用——华泰行业轮动系列报告之四

【华泰金工林晓明团队】财务质量因子在行业配置中的应用——华泰行业轮动系列报告之三

【华泰金工林晓明团队】周期视角下的行业轮动实证分析——华泰行业轮动系列之二

【华泰金工林晓明团队】基于通用回归模型的行业轮动策略——华泰行业轮动系列之一

Smartbeta

【华泰金工林晓明团队】Smart Beta:乘风破浪趁此时——华泰Smart Beta系列之一

【华泰金工林晓明团队】Smartbeta在资产配置中的优势——华泰金工Smartbeta专题研究之一

多因子选股

【华泰金工林晓明团队】桑土之防:结构化多因子风险模型——华泰多因子系列之十二

【华泰金工林晓明团队】华泰单因子测试之海量技术因子——华泰多因子系列之十一

【华泰金工林晓明团队】因子合成方法实证分析 ——华泰多因子系列之十

【华泰金工林晓明团队】华泰单因子测试之一致预期因子 ——华泰多因子系列之九

【华泰金工林晓明团队】华泰单因子测试之财务质量因子——华泰多因子系列之八

【华泰金工林晓明团队】华泰单因子测试之资金流向因子——华泰多因子系列之七

【华泰金工林晓明团队】华泰单因子测试之波动率类因子——华泰多因子系列之六

【华泰金工林晓明团队】华泰单因子测试之换手率类因子——华泰多因子系列之五

【华泰金工林晓明团队】华泰单因子测试之动量类因子——华泰多因子系列之四

【华泰金工林晓明团队】华泰单因子测试之成长类因子——华泰多因子系列之三

【华泰金工林晓明团队】华泰单因子测试之估值类因子——华泰多因子系列之二

【华泰金工林晓明团队】华泰多因子模型体系初探——华泰多因子系列之一

【华泰金工林晓明团队】五因子模型A股实证研究

【华泰金工林晓明团队】红利因子的有效性研究——华泰红利指数与红利因子系列研究报告之二

人工智能

【华泰金工林晓明团队】投石问路:技术分析可靠否?——华泰人工智能系列之二十四

【华泰金工林晓明团队】再探基于遗传规划的选股因子挖掘——华泰人工智能系列之二十三

【华泰金工林晓明团队】基于CSCV框架的回测过拟合概率——华泰人工智能系列之二十二

【华泰金工林晓明团队】基于遗传规划的选股因子挖掘——华泰人工智能系列之二十一

【华泰金工林晓明团队】必然中的偶然:机器学习中的随机数——华泰人工智能系列之二十

【华泰金工林晓明团队】偶然中的必然:重采样技术检验过拟合——华泰人工智能系列之十九

【华泰金工林晓明团队】机器学习选股模型的调仓频率实证——华泰人工智能系列之十八

【华泰金工林晓明团队】人工智能选股之数据标注方法实证——华泰人工智能系列之十七

【华泰金工林晓明团队】再论时序交叉验证对抗过拟合——华泰人工智能系列之十六

【华泰金工林晓明团队】人工智能选股之卷积神经网络——华泰人工智能系列之十五

【华泰金工林晓明团队】对抗过拟合:从时序交叉验证谈起

【华泰金工林晓明团队】人工智能选股之损失函数的改进——华泰人工智能系列之十三

【华泰金工林晓明团队】人工智能选股之特征选择——华泰人工智能系列之十二

【华泰金工林晓明团队】人工智能选股之Stacking集成学习——华泰人工智能系列之十一

【华泰金工林晓明团队】宏观周期指标应用于随机森林选股——华泰人工智能系列之十

【华泰金工林晓明团队】人工智能选股之循环神经网络——华泰人工智能系列之九

【华泰金工林晓明团队】人工智能选股之全连接神经网络——华泰人工智能系列之八

【华泰金工林晓明团队】人工智能选股之Python实战——华泰人工智能系列之七

【华泰金工林晓明团队】人工智能选股之Boosting模型——华泰人工智能系列之六

【华泰金工林晓明团队】人工智能选股之随机森林模型——华泰人工智能系列之五

【华泰金工林晓明团队】人工智能选股之朴素贝叶斯模型——华泰人工智能系列之四

【华泰金工林晓明团队】人工智能选股之支持向量机模型— —华泰人工智能系列之三

【华泰金工林晓明团队】人工智能选股之广义线性模型——华泰人工智能系列之二

指数增强基金分析

【华泰金工林晓明团队】再探回归法测算基金持股仓位——华泰基金仓位分析专题报告

【华泰金工林晓明团队】酌古御今:指数增强基金收益分析

【华泰金工林晓明团队】基于回归法的基金持股仓位测算

【华泰金工林晓明团队】指数增强方法汇总及实例——量化多因子指数增强策略实证

基本面选股

【华泰金工林晓明团队】华泰价值选股之相对市盈率港股模型——相对市盈率港股通模型实证研究

【华泰金工林晓明团队】华泰价值选股之FFScore模型

【华泰金工林晓明团队】相对市盈率选股模型A股市场实证研究

【华泰金工林晓明团队】华泰价值选股之现金流因子研究——现金流因子选股策略实证研究

【华泰金工林晓明团队】华泰基本面选股之低市收率模型——小费雪选股法 A 股实证研究

【华泰金工林晓明团队】华泰基本面选股之高股息率模型之奥轩尼斯选股法A股实证研究

基金定投

【华泰金工林晓明团队】大成旗下基金2018定投策略研究

【华泰金工林晓明团队】布林带与股息率择时定投模型——基金定投系列专题研究报告之四

【华泰金工林晓明团队】基金定投3—马科维茨有效性检验

【华泰金工林晓明团队】基金定投2—投资标的与时机的选择方法

【华泰金工林晓明团队】基金定投1—分析方法与理论基础

其它

【华泰金工林晓明团队】A股市场及行业的农历月份效应——月份效应之二

A股市场及行业的月份效应——详解历史数据中的隐藏法则

本系列文章将会介绍如何使用DolphinDB优雅而高效地实现量化交易策略回测

本文将介绍在华尔街广泛应用的多因子Alpha策略的回测。多因子模型是量化交易选股中最重要的一类模型,基本思路是找到某些和回报率最相关的指标,并根据这些指标,构建股票投资组合(做多正相关的股票,做空负相关的股票)。多因子模型中,单独一个因子的个股权重一般实现多空均衡(市场中性),没有暴露市场风险的头寸(beta为0,所以称之为alpha策略),能实现绝对收益。多个因子之间相互正交,方便策略配置,实现回报和风险的最优控制。另外,相比于套利策略(通常可以实现更高的sharpe ratio,但是scale不好),多因子alpha策略有很好的scale,可以配置大量的资金。多因子Alpha策略在对冲基金中的使用非常普遍。

1. 生成因子

本文的重点是实现多因子Alpha策略的回测框架。因子不是重点,这部分通常由金融工程师或策略分析师来完成。为了方便大家理解,文章以动量因子、beta因子、规模因子和波动率因子4个常用的风险因子为例,介绍如何在 DolphinDB database 中实现多因子回测。

输入数据表inData包含6个字段:sym (股票代码), date(日期), close (收盘价), RET(日回报), MV(市值), VOL(交易量)

def genSignals(inData){ USstocks = select sym, date, close, RET, MV from inData where weekday(date) between 1:5, close>5, VOL>0, MV>100000 order by sym, date update USstocks set prevMV=prev(MV), cumretIndex=cumprod(1+RET), signal_size=-sqrt(MV), signal_vol=-mstd(RET, 21)*sqrt(252) context by sym update USstocks set mRet = wavg(RET, prevMV) context by date update USstocks set signal_mom = move(cumretIndex,21)/move(cumretIndex,252)-1, signal_beta=mbeta(RET, mRet, 63) from USstocks context by sym return select sym, date, close, RET as ret, signal_size, signal_beta, signal_vol, signal_mom from USstocks where date>=1991.01.01 }

DolphinDB函数说明:

  • abs:取绝对值。
  • prev:把向量中的所有元素向右移动一个位置。
  • cumprod:计算累计乘积。
  • sqrt:计算平方根。
  • mstd(X, k):计算移动标准差。
  • wavg(X, k):计算加权平均数。
  • move(X, k):如果k为正数,则把向量的所有元素向右移动k个位置,如果k为负数,则把向量的所有元素向左移动k个位置。
  • mbeta(X, Y, k):计算普通最小二乘回归的系数估计。

genSignals 函数说明:

首先数据过滤,选择市值较高的股票在交易日中的数据。接着使用过滤后的数据计算4个风险因子:

  • 规模因子(signal_size):MV的平方根的相反数
  • 波动率因子(signal_vol):过去一个月的股价波动率的相反数
  • 动量因子(signal_mom):过去12个月(去除最近一个月)的动量因子
  • beta因子(signal_beta):利用过去三个月的数据计算个股跟市场的beta

2. 回测框架

多因子Alpha策略的回测框架包含3个部分。首先是在每个历史周期上,生成每个股票在每个策略上的权重。一个历史周期上的所有仓位可以成为一个tranche。然后根据tranche的持有时间,生成每一个股票在每一个tranche的每一个策略上每一天的仓位和盈亏。最后统计分析每个策略和所有策略的业绩。

2.1 计算历史周期的投资仓位

首先定义一个函数formPeriodPort计算一个周期(一天)的股票仓位。然后使用并行计算获得历史上每一个周期的投资仓位。

2.1.1 计算一天的股票投资组合

这一步的输入是每一个股票在不同因子上的值,输出是每一个股票在每一个因子上的投资权重。股票权重要满足两个条件:(1)一个因子中所有股票的权重和为零,也就是说多空均衡。(2)不同因子之间相互正交,也就是说第i个因子的权重wi和第j个因子的值sj的内积为0(i<>j)。为了实现上述目标,我们引入了因子矩阵(矩阵的每一列表示一个因子,每一行表示一个股票),并且将单位因子(所有元素均为1)添加到因子矩阵中。

实践中,还需要考虑的一个问题是,去除权重较小的股票。一个股票池有几千个股票,大部分的股票获得的权重很小,几乎可以忽略。我们定义了一个嵌套函数f来调整单个因子中股票的权重。

函数formPeriodPort的输入参数有3个:

  • signals 是由genSignals函数生成的数据表,包含8个字段:股票代码、日期、收盘价格、回报率和4个因子。
  • signalNames 是所有因子的名称,用向量表示。
  • stockPercentile 用于控制股票的数量。

函数的输出是一个数据表,存储一天的股票投资组合,包括4个字段:tranche, sym, signalIdx, exposure。

def formPeriodPort(signals, signalNames, stockPercentile){ stockCount = signals.size() signalCount = signalNames.size() tranche = signals.date.first() //demean all signals and add a unit column to the signal matrix sigMat = matrix(take(1, stockCount), each(x->x - avg(x), signals[signalNames])) //form weight matrix. transSigMat = sigMat.transpose() weightMat = transSigMat.dot(sigMat).inv().dot(transSigMat).transpose()[1:] /* form exposures. allocate two dollars on each signal, one for long and one for short trim small weights. In practice, we don't want to trade too many stocks */ f = def(sym, tranche, stockPercentile, signalVec, signalIdx){ t = table(sym, signalVec as exposure, iif(signalVec > 0, 1, -1) as sign) update t set exposure = exposure * (abs(exposure) < percentile(abs(exposure), stockPercentile)) context by sign update t set exposure = exposure / sum(exposure).abs() context by sign return select tranche as tranche, sym, signalIdx as signalIdx, exposure from t where exposure != 0 } return loop(f{signals.sym, tranche, stockPercentile}, weightMat, 1..signalCount - 1).unionAll(false) }

DolphinDB函数说明:

  • size:返回向量中元素的个数
  • first:返回第一个元素
  • matrix:构建矩阵
  • transpose:矩阵转置
  • dot:矩阵或向量内积
  • inv:矩阵求逆
  • iif(condition, trueResult, falseResult):如果满足条件condition,则返回trueResult,否则返回falseResult。它相当于对每个元素分别运行if...else语句。
  • loop(func,args):高价模板函数,把函数func应用到参数args的每一个元素上,并将结果汇总到一个元组中。如果args包含三个k个参数,每个参数的长度是n,那么loop将运行n次。
  • unionAll:合并多个表

2.1.2 计算过去每天的股票投资组合

回测时使用 的数据量非常庞大,因此我们把数据放到内存的分区数据库中,然后使用并行计算。如果想要了解更多关于分区数据库的内容,可以参考DolphinDB分区数据库教程,详见:
https://zhuanlan.zhihu.com/p/46299595。我们把genSignals函数生成的数据保存到分区表partSignals中,一个分区表示一天。接着,创建一个分区表ports,用于保存计算出来的股票投资组合,一个分区表示一年。然后,使用 map-reduce函数,把formPeriodPort函数应用到每一天,把每个结果合并到分区表ports中。

def formPortfolio(signals, signalNames, stockPercentile){ dates = (select count(*) from signals group by date having count(*)>1000).date.sort() db = database("", VALUE, dates) partSignals = db.createPartitionedTable(signals, "signals", `date).append!(signals) db = database("", RANGE, datetimeParse(string(year(dates.first()) .. (year(dates.last()) + 1)) + ".01.01", "yyyy.MM.dd")) symType = (select top 10 sym from signals).sym.type() ports = db.createPartitionedTable(table(1:0, `tranche`sym`signalIdx`exposure, [DATE,symType,INT,DOUBLE]), "", `tranche) return mr(sqlDS(<select * from partSignals>), formPeriodPort{,signalNames,stockPercentile},,unionAll{,ports}) }

DolphinDB函数说明:

  • sort:把向量中的元素排序
  • database(directory, [partitionType], [partitionScheme], [locations]):创建数据库。如果directory为空,则创建内存数据库。
  • createPartitionedTable(dbHandle, table, [tableName], partitionColumns):在数据库中创建分区表。
  • datatimeParse(X, format):把字符串转换成DolphinDB中时间类型数据。
  • unionAll:合并表
  • type:返回数据类型的ID。
  • mr(ds, mapFunc, [reduceFunc], [finalFunc], [parallel=true]):map-reduce函数。

2.2 计算仓位和盈亏

这一步的任务是根据持有的仓位以及持有时间,生成每一个股票在每一个tranche的每一个因子上每一天的仓位和盈亏。首先定义一个嵌套函数来f来计算部分股票投资仓位的盈亏,接着把嵌套函数应用到所有股票投资组合(使用mr函数),计算所有股票投资组合的盈亏,并把结果保存到分区表pnls中。

函数caclStockPnL的输入参数包括:

  • ports: 每一天的投资组合表,包括4个字段 tranche, sym, signalIdx, exposure
  • dailyRtn:股票每天的回报表,包括3个字段 date, sym, ret
  • holdingDays: 股票持有的天数

函数的输出是股票的盈亏明细表,包括字段8个字段 date, sym, signalIdx, tranche, age, ret, exposure, pnl

def calcStockPnL(ports, dailyRtn, holdingDays){ ages = table(1..holdingDays as age) dates = sort exec distinct(tranche) from ports dictDateIndex = dict(dates, 1..dates.size()) dictIndexDate = dict(1..dates.size(), dates) lastDaysTable = select max(date) as date from dailyRtn group by sym lastDays = dict(lastDaysTable.sym, lastDaysTable.date) // define a anonymous function to calculate the pnl for a part of the porfolios. f = def(ports, dailyRtn, holdingDays, ages, dictDateIndex, dictIndexDate,lastDays){ pos = select dictIndexDate[dictDateIndex[tranche]+age] as date, sym, signalIdx, tranche, age, take(0.0,size age) as ret, exposure, take(0.0,size age) as pnl from cj(ports,ages) where isValid(dictIndexDate[dictDateIndex[tranche]+age]), dictIndexDate[dictDateIndex[tranche]+age]<=lastDays[sym] update pos set ret = dailyRtn.ret from ej(pos, dailyRtn,`date`sym) update pos set exposure = exposure*cumprod(1+ret) from pos context by tranche, signalIdx, sym update pos set pnl = exposure*ret/(1+ret) return pos } // calculate pnls for all portfolios and save the result to a partitioned in-memory table pnls db = database("", RANGE, datetimeParse(string(year(dates.first()) .. (year(dates.last()) + 1)) + ".01.01", "yyyy.MM.dd")) symType = (select top 10 sym from ports).sym.type() modelPnls = table(1:0, `date`sym`signalIdx`tranche`age`ret`exposure`pnl, [DATE,symType,INT,DATE,INT,DOUBLE,DOUBLE,DOUBLE]) pnls = db.createPartitionedTable(modelPnls, "", `tranche) return mr(sqlDS(<select * from ports>), f{,dailyRtn,holdingDays,ages,dictDateIndex, dictIndexDate,lastDays},,unionAll{,pnls}) }

DolphinDB函数说明:

  • dict(key, value):创建字典。
  • cj(leftTable, rightTable) :交叉连接两个表。
  • isValid:检查元素是否为NULL。如果不是NULL,则返回1,如果是NULL,则返回0。
  • ej(leftTable, rightTable, matchingCols, [rightMatchingCols]) :等值连接两个表。

3. 运行实例

我们以美国股市为例,运行多因子Alpha策略回测。输入的股票日数据表USPrices包含6个字段:sym (股票代码), date(日期), close (收盘价), RET(日回报), MV(市值)和VOL(交易量)。

//加载数据 USPrices = ... holdingDays = 5 stockPercentile = 20 signalNames = `signal_mom`signal_vol`signal_beta`signal_size //生成因子 signals=genSignals(USPrices) //计算每天的股票投资组合 ports = formPortfolio(signals, signalNames, stockPercentile) //计算盈亏 dailyRtn = select sym,date,ret from signals pos = calcStockPnL(ports, dailyRtn, holdingDays) //绘制四个因子的累计盈亏走势图 pnls = select sum(pnl) as pnl from pos group by date, signalIdx factorPnl = select pnl from pnls pivot by date, signalIdx plot(each(cumsum,factorPnl[`C0`C1`C2`C3]).rename!(signalNames), factorPnl.date, "The Cumulative Pnl of All Four Signals") //绘制动量因子不同持仓日的累计盈亏走势图 pnls = select sum(pnl) as pnl from pos where signalIdx=0 group by date, age momAgePnl = select pnl from pnls pivot by date, age plot(each(cumsum,momAgePnl[`C1`C2`C3`C4`C5]).rename!(`C1`C2`C3`C4`C5), momAgePnl.date)

 

4个因子的累计盈亏走势图

 

 

动量因子的累计盈亏走势图

 

DolphinDB虽然是一个通用的分布式时序数据库,但因为内置极其高效的多范式编程语言,用于量化交易,开发效率非常高。上面的多因子回测框架,仅用了3个自定义函数,50余行代码。DolphinDB的运行效率更是惊人,对美国股市25年中市值较高的股票按日进行回测,最后产生的盈亏明细表包含1亿余条记录。如此复杂的计算量,在单机(4核)上执行耗时仅50秒。

4. 讨论

前面的回测框架,仅仅解决了多因子策略的一部分问题,也就是说单个因子中股票的配置。我们还有两个重要的问题需要解决:(1)多个因子之间,如何配置权重,平衡投资的回报和风险。(2)一个新的因子有没有带来额外的Alpha,换句话说,一个新的因子是不是可以有已经存在的多个因子来表示,如果可以,那么这个新因子可能没有存在的必要。在之后的文章中,我们会介绍如何使用DolphinDB来回答上面两个问题。

https://www.xusbuy.net

上一篇:养老金到账查询(养老金每月几号到账)

下一篇:参股券商概念股票(参股券商概念股龙头)

相关推荐

返回顶部