《量化投资方法报告完.docx》由会员分享,可在线阅读,更多相关《量化投资方法报告完.docx(11页珍藏版)》请在第一文库网上搜索。
1、量化投资方法期末作业策略思路1 .回测策略多因子选股策略2 .回测时段2018年12月31日2023年12月31日3 .回测初始资金100000000元4 .策略构建原理多因子选股策略包括三因子和五因子模型。在三因子模型中,一般认为股票的超额收益可以由市场因子以及市值因子和账面价值比三个因子共同决定。随着市场的快速发展,三因子模型的使用性在不断的下降,出现了许多三因子模型难以解释的现象。因此,Fama提出了五因子模型,在三因子模型的基础加入了盈利水平、投资水平因子,随着市场影响因素的增加,陆续出现了六因子模型、八因子模型等,目前多少个因子是合适的尚无定论。现阶段的因子选股策略的种类丰富,不同的
2、因子策略选取的指标不同,使用情况也有所差别,市场上常用的多因子策略共有6种,具体情况如表1所不。表1因子策略种类Fama-FrenCh三因子市场、规模、价值Carhart四因子市场、规模、价值、动量Fama-FrenCh五因子市场、规模、价值、盈利、投资HOU-XUe-Zhang四因子市场、规模、盈利、投资StambaUgh-YUan四因子市场、规模、管理、表现DanieI-HirShIeifer-SUn三因子市场、长周期行为、短周期行为在本次策略中主要考率市场、规模、价值这三个市场因素即三因子选股模型。在多因子策略提出之前市场上通常是悬着CAPM模型来定价,多因子策略是在CAPM模型的基础上
3、引入了HM1和SMB两个因子,三因子策略模型(1)式所示。ER(Rf=S1mKt(ERm-Rf)+i,HM1HM1在式中用因代表投资股票的预期收益率,%表示无风险收益率,员即表示市场组合预期收益率,采用ER(sm8)和ERhmJ分别表示规模因子收益率和价值因子预期收益率。在三个因子中,价值因子和规模因子通常采用BM和市值两个指标,按照Fama对市场因子和规模因子的排序原则,可以对BM和市值两个指标进行双重排序,首先将股票分为大市值组合和小市值组合分别采用B和S来表式。根据账面市值比将股票分为三个不同等级的组别即为BM高于70%分位数的H组,BM低于30%分位数的1组,BM处于70%分位数和30
4、%分位数之间的数据记为M组。表2市场因子和规模因子的分组原则BM分组HM1市值分组SSSSHM1BBBBHM1通过对市值以及BM两个指标按照70%以及30%的分配比例展开分配后,将使得市值指标被分为两组从表2中可以看到市值被分为了小市值S和大市值B两组,在这基础上利用小市值组合的加权平均数与大市值组合的加权平均数的差额来计量规模因子。基于同样的原理,BM因子共分成的H,M,1三个组别,但是在衡量价值因子时通常通过两个高BM组合的加权平均数与两个低BM组合的加权平均数的差值来衡量。基于上述原理可以建立规模因子和价值因子的计量模型。SMF=g+-g+J+3(HM1=ig+5)-g+(2)4.构建思
5、路(1)假设条件:三因子模型对市场具有完全有效性(2)在构建三因子策略先通过模型对股票的预期收益率进行拟合估计,通过估计结果可以看到绝大都数的股票满足三因子策略模型,但是存在部分股票的预期收益率满足三因子模型,大部分股票都会存在一个a1pha截距项,因此建立策略时将a1pha截距项作为衡量标准来判断股价与均衡价格的关系。(3)当存在a1pha截距项时,说明股票当前价格偏离均衡价格,根据这一问题设计套利策略,在策略中a1pha值得运用原理如下:a1phaO时,说明股票收益率高于均衡水平,股票价格被高估,应该卖出。所以通过判断a1pha的大小来判断买入开仓的股票具体实施方案为获取a1pha最小并且
6、小于O的10只的股票买入开仓。构建策略规则1 .策略步骤第一步:获取股票市值以及账面市值比等分析数据。第二步:将股票按照各个因子进行排序分组为后续计算规模因子、价值因子做准备,分组原理采用Fama的分组方法即表2所示。第三步:依据规模因子和价值因子的计量模型(公式2)计算SMB、HM1因子。第四步:进行因子回归,计算a1pha值,获取a1pha最小并且小于0的10只的股票买入开仓。2 .程序编写思路(1)假设每月第一个交易日的09:40定时执行a1go任务;股票基准为沪深300指数,设置最大开仓量为20。(2)账面市值分组标准为:大账面市值为3.0,中账面市值为2.0;小账面市值为1.0;市值
7、分组大市值为2.0,小市值为1.0。(3)根据理Fa1na的分组原理(表2)计算规模因子和价值因子,然后根据因子结果分别计算股票的预期收益率。(4)在计算的预期收益率的基础上计算有效股票的a1pha值,然后通过最小二乘O1S估计收益模型系数,更具结果获取a1pha最小并且小于0的10只的股票进行操作买入和卖出的操作。(5)然后通过程序语言获取股票的权重,通过权重比例建立目标仓位,在本策略中买卖方向为1代表买入,2代表卖出;开平仓类型中1为开仓,2为平仓,在委托类型中1代表限价委托,2代表市价委托。(6)通过判断平仓和开仓来确定买入和卖出操作,结合仓位、收益率等因素的限制可以得到买入与选股的策略
8、。策略代码#coding=utf-8from_future_importprint_function,absoIute_import,unicode_1iteraIsimportnumpyasnpimportpandasaspdfromgm.apiimport*III本策略基于Fama-French三因子模型。假设三因子模型可以完全解释市场,以三因子模型对每股股票进行回归计算其A1Pha值,当a1pha为负表明市场低估该股,因此应该买入。策略思路:计算市场收益率、个股的账面市值比和市值,并对后两个进行了分类,根据分类得到的组合分别计算其市值加权收益率、SMB和HM1.对各个股票进行回归(假设无
9、风险收益率等于0)得到AIPha值.选取A1pha值小于0并为最小的10只股票进入标的池,每月初移仓换股I1Vdefinit(context):# 成分股指数context.index_symbo1=,SHSE.000300,# 每月第一个交易日的09:40定时执行a1g。任务(仿真和实盘时不支持该频率)scheduIe(scheduIe_func=aIgo,date_ru1e=1m,time_ruIe=09:40:00,)# 数据滑窗context.date=20# 设置开仓的最大资金量context,ratio=0.8# 账面市值比的大/中/小分类context.BM_HIGH=3.0co
10、ntext.BMMIDD1E=2.0context.BM1OW=1.0# 市值大/小分类context.MV_BIG=2.0context.MV_SMA11=1.0defmarket_va1ue_weighted(df,MV,BM):ItI1IV计算市值加权下的收益率:paramMV:MV为市值的分类对应的组别:paramBM:BM账目市值比的分类对应的组别ItI1IVse1ect=df(df,TOTMKTCAP,=MV)&(dfBM=BM)#选出市值为MV,账目市值比为BM的所有股票数据mv_weighted=seIect,mv,np.sum(seIect,mv,)#市值加权的权重retur
11、n_weighted=seIect,return,*mv_weighted#市值加权下的收益率returnnp.sum(return_weighted)defaIgo(context):# 当前时间now=context.now# 获取上一个交易日的日期1ast_day=get_previous_trading_date(exchange=SHSE,date=context.now)# 获取沪深300成份股stock300=get_history_constituents(index=context.index_symboI,start_date=1ast_day,end_date=Iast_
12、day)0,constituents,.keys()#过滤停牌的股票history_instruments=get_history_instruments(symbo1s=stock300,start_date=now,end_date=now)stock300=item,symbo1,foriteminhistory_instrumentsifnotitemis_suspendedanditem,symbo1!=SHSE.601313#601313为退市股票# 过滤退市及未上市的股票instrumentinfos=get_instrumentinfos(symboIs=stock300,df
13、=True)stock300=Iist(instrumentinfos(instrumentinfos,Iisted_datenow),symboI,)# 获取P/B和市值数据fin=get_fundamentaIs(tabIe=,trading_derivative_indicator,symboIs=stock300,start-date=Iast_day,end_date=Iast_day,fieIds=PB,TOTMKTCAP,df=True)# 计算账面市值比为P/B的倒数fin.Ioc:,PB=(fin,PB,*-1)# 计算市值的30%和70%的分位点,用于后面的分类size_g
14、ate=finTOTMKTCAP.quanti1e(0.30),finTOTMKTCAP.quanti1e(0.70)# 计算账面市值比的50%分位点,用于后面的分类bm_gate=finPB.quantiIe(0.50)fin.index=fin.symboI# 设置存放股票收益率的变量data_df=pd.DataFrame()# 对未停牌的股票进行处理forsymbo1instock300:#计算收益率c1ose=history_n(symboI=symboI,frequency=1d,count=context.date+1,end_time=Iast_day1fie1ds=c1ose
15、,skip_suspended=True,fiI1_missing=1ast,adjust=ADJUST_PREV,df=True)c1ose,.vaIuesstock_return=c1ose-1/c1ose0-1pb=fin,PB,symbo1market,va1ue=fin,TOTMKTCAPsymbo1# 获取股票代码,股票收益率,账面市值比的分类,市值的分类,市值# 其中账面市值比的分类为:高(3)、中(2)、低(1)# 市值的分类:大(2)、小(1)ifpbbm_gate0:ifmarket_vaIuesize_gate:1abe1=symbo1,stock_return,context.BM1OW,context