因子选股策略(Python版)_第1页
因子选股策略(Python版)_第2页
因子选股策略(Python版)_第3页
因子选股策略(Python版)_第4页
因子选股策略(Python版)_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

因子选股策略(Python版)一种基于因子的选股策略,主要通过分析因子的暴露度、相关性和选股能力来选择合适的因子组合。策略的核心在于通过历史数据评估因子的有效性,并结合图表展示分析结果。思路描述1.**原始数据获取**:-使用EMC量化的SDK获取全A股标的的各项因子数据及交易行情相关的日频成交量、收盘价数据。-数据处理成周频数据,形成因子分析所需的数据集。2.**因子暴露分析**:-选取财务、估值、成长、行情相关的风格因子。-计算各因子相对于全市场的偏离程度,分析其在上证50、沪深300和中证500指数中的表现。-通过图表展示各因子在各年份的平均暴露情况。3.**因子相关性分析**:-计算各因子在三大股指中的相关系数,并通过热力图展示其平均值和标准差。-分析因子相关性的稳定性和强度,识别出相关性较低的组合。4.**因子InformationCoefficient(IC)分析**:-计算各因子的IC值,评估其选股能力。-分析IC值的年度均值和绝对值均值,识别出选股能力较强的因子。特点描述1.**全面的数据处理**:-策略从原始数据获取到数据处理,再到因子分析和选股能力评估,形成了一个完整的数据分析流程。-通过标准化处理和周频数据的使用,确保了数据的统一性和可比性。2.**多维度的因子分析**:-策略不仅分析了因子的暴露度,还深入探讨了因子的相关性和选股能力。-通过多个维度评估因子,能够更全面地理解因子的有效性和稳定性。3.**可视化的结果展示**:-策略使用大量的图表来展示分析结果,包括柱状图、热力图等。-可视化的方式使得分析结果更加直观,便于理解和决策。4.**综合的因子选择标准**:-策略综合考虑了因子的暴露度、相关强度和选股能力,提出了综合选择因子的标准。-通过综合评估,策略能够选出暴露度高、相关强度低且选股能力强的因子组合。因子选股策略通过全面的数据处理、多维度的因子分析和可视化的结果展示,提出了一套综合的因子选择标准。即能够有效评估因子的有效性。策略代码:#coding=utf-8#Author@ZinanLiu@Eastmoney.Co#2023.01.03from__future__importprint_function,absolute_importimporttimeimportmatplotlib.pyplotaspltfromgm.apiimport*importdatetimeimportnumpyasnpimportpandasaspdfromsiximportStringIOimportpickleimportstatsmodels.apiassmdefinit(context):time1=datetime.datetime.now()'''一、原始数据获取通过EMC量化的SDK来获取全A股标的的各项因子数据,以及交易行情相关的日频成交量、收盘价数据,再通过标准化处理,形成因子分析所需要的数据集。目前时间阶段选取为2017年至2022年,原始数据集获取整理后形成的是周频的数据,index为时间,column为因子特征,以此为基础进行因子分析。同时为了方便后续调参分析,建议获取数据后落到本地,以后直接读取本地文件。'''begin_date='2017-01-10'end_date='2022-12-30'#begin_date='2022-01-10'#end_date='2022-12-30'context.trade_date_list=get_period_date('W',begin_date,end_date)##获取dictionary类型的因子数据,每个周频交易日对应一个数据表格#factorData=get_factor_data('A',context.trade_date_list)###数据处理成单个dataframe格式#factorData_df=pd.DataFrame()#foriinfactorData:#factorData[i]['date']=i#factorData_df=pd.concat([factorData_df,factorData[i]])#factorData_df.to_csv('factorDataGM.csv')#temp为了加快取数时间,将数据落到本地直接读取factorData_df=pd.read_csv('factorDataGM.csv',index_col=0)factorData={}fordateincontext.trade_date_list:factorData[date]=factorData_df[factorData_df['date']==date]'''二、因子暴露分析这次选取的风格因子为财务、估值、成长、行情相关。不仅因为这些因子的市场关注度较高,而且它们是Barra多因子框架中几个重要的风险因子。为了考虑全市场的情况,我们选取了A股几大指数,分别是上证50,沪深300和中证500。同时,为了考量历史上各因子的暴露情况,我们以周为频率测算因子相对于全市场的偏离程度。由于需要统一标准和可比性,我们使用的数据为因子当日的排序。计算步骤如下:(1)将所有股票的每日因子按照从大到小排序。(2)从中取出属于某一指数的成份股,计算其成分股因子的排序平均值。(3)暴露度=(指数因子排序平均值-当日全市场排序中间值)/当日股票总数。''''''2.1因子暴露年度均值'''context.Fields=['TOTMKTCAP','TOTAL_SHARE','volume','TURNRATE','PETTM','EPSDILUTED','ROEDILUTED','NPGRT']#获取指数的因子排序数据,index为日期,column为因子,数据为排序均值,然后根据日期做平均,获取每个因子每年的排序均值result_SH50=[]result_HS300=[]result_ZZ500=[]indexRank1=getIndexRank(context,'SH50',factorData)indexRank2=getIndexRank(context,'HS300',factorData)indexRank3=getIndexRank(context,'ZZ500',factorData)foriincontext.Fields:result_SH50.append(indexRank1[i].mean())result_HS300.append(indexRank2[i].mean())result_ZZ500.append(indexRank3[i].mean())#划分年份进行暴露度统计Year=['2017','2018','2019','2020','2021','2022']total1=pd.DataFrame()total2=pd.DataFrame()total3=pd.DataFrame()foriinrange(len(Year)):total1[Year[i]]=indexRank1.iloc[round(i*len(indexRank1)/len(Year)):round((i+1)*len(indexRank1)/len(Year)),:].mean()total2[Year[i]]=indexRank2.iloc[round(i*len(indexRank1)/len(Year)):round((i+1)*len(indexRank1)/len(Year)),:].mean()total3[Year[i]]=indexRank3.iloc[round(i*len(indexRank1)/len(Year)):round((i+1)*len(indexRank1)/len(Year)),:].mean()#设置下面所有柱状图的柱宽bar_width=0.3#画图,以bar展示各因子在各时刻的平均数据#上证50x=np.array(range(len(Year)))fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)foriincontext.Fields:plt.bar(x,total1.loc[i],bar_width,label=i)plt.xticks(range(len(Year)),Year)ax.set_title("expo_mean_SH50",fontsize=21)plt.legend()plt.savefig('fig/2.1.1.png')#沪深300x=np.array(range(len(Year)))fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)foriincontext.Fields:plt.bar(x,total2.loc[i],bar_width,label=i)plt.xticks(range(len(Year)),Year)ax.set_title("expo_mean_HS300",fontsize=21)plt.legend()plt.savefig('fig/2.1.2.png')#中证500x=np.array(range(len(Year)))fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)foriincontext.Fields:plt.bar(x,total3.loc[i],bar_width,label=i)plt.xticks(range(len(Year)),Year)ax.set_title("expo_mean_ZZ500",fontsize=21)plt.legend()plt.savefig('fig/2.1.3.png')'''上图展示的结果为年度因子暴露数据,横坐标是年,不同的颜色bar代表当时不同因子的暴露情况。由上图可以看出:(1)市值和股本因子的偏离度在每一时段均是最高的。上证50市值和股本的偏离度稳定接近50%,沪深300的稳定在40%左右,而中证500的为20%-30%左右,且逐年递增。(2)各项因子的偏离度绝对数值在上证50中比较高,在沪深300和中证500中整体均有所下降。(3)净利润增长率因子NPGRT的偏离度一直都接近0,可见其对三大股指的有效性比较低。''''''2.2指数因子暴露均值对比'''fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)x=np.array(range(len(result_SH50)))plt.bar(x,result_SH50,bar_width,label='SH50')plt.bar(x+bar_width,result_HS300,bar_width,label='HS300')plt.bar(x+bar_width+bar_width,result_ZZ500,bar_width,label='ZZ500')plt.xticks(range(len(result_SH50)),context.Fields)ax.set_title("IndexComparsion",fontsize=21)plt.legend()plt.savefig('fig/2.2.png')plt.close()'''上图分别统计了三大股指的各个因子在2017-2022年的平均暴露情况,从整体上来看:(1)市值和股本因子的偏离度均是最高的。上证50市值和股本的偏离度稳定接近50%,沪深300的偏离度稳定在40%左右,而中证500的在25%左右。(2)中等偏离度的因子包括,换手率、成交量、EPS、ROE因子。这些因子在上证50和沪深300指数的偏离度在20%-30%左右,然而中证500相对会低5%-10%。(3)偏离度较小的是PE和净利润增长率因子,在三大指数中,净利润增长率的偏离度几乎为0。也即大市值和小市值个股在成长性方面的差异不大。三大股指在净利润增长率因子NPGRT上的暴露度几乎为0,所以该因子可以被移出风险因子库。但除了需要考虑因子暴露度之外,我们还需要计算因子之间的相关性。将相关性较高的因子区分开来,可以降低因子共线性风险并且减少因子个数。接下来我们对因子的相关性进行分析。''''''三、因子相关性分析3.1相关性平均值'''#获取三大指数的8个因子每周的相关系数数据corr_SH50=getCorr(context,'SH50',factorData)corr_HS300=getCorr(context,'HS300',factorData)corr_ZZ500=getCorr(context,'ZZ500',factorData)#下方的mean是平均了所有的dates的8个字段各自对应的相关系数值。#z轴是date,x和y是fields,X和Y对应的值即为相关系数。importseabornassns#设置热力图画板颜色cmap=sns.diverging_palette(240,10,sep=10,as_cmap=True)#上证50fig=plt.figure(figsize=(15,6))ax=fig.add_subplot(111)sns.heatmap(corr_SH50.mean(axis=0),annot=True,vmax=1,vmin=0,xticklabels=context.Fields,yticklabels=context.Fields,cmap=cmap)ax.set_title("corr_mean_SH50",fontsize=21)heat_fig=fig.get_figure()heat_fig.savefig('fig/3.1.1.png',dpi=400)#沪深300fig=plt.figure(figsize=(15,6))ax=fig.add_subplot(111)sns.heatmap(corr_HS300.mean(axis=0),annot=True,vmax=1,vmin=0,xticklabels=context.Fields,yticklabels=context.Fields,cmap=cmap)ax.set_title("corr_mean_HS300",fontsize=21)heat_fig=fig.get_figure()heat_fig.savefig('fig/3.1.2.png',dpi=400)#中证500fig=plt.figure(figsize=(15,6))ax=fig.add_subplot(111)sns.heatmap(corr_ZZ500.mean(axis=0),annot=True,vmax=1,vmin=0,xticklabels=context.Fields,yticklabels=context.Fields,cmap=cmap)ax.set_title("corr_mean_ZZ500",fontsize=21)heat_fig=fig.get_figure()heat_fig.savefig('fig/3.1.3.png',dpi=400)'''图中分别展示了2017-2022年间各因子在三大股指中的相关性。根据上表的展示结果,结论如下:(1)从上证50指数成份股的角度看,相关性最高的因子为换手率和成交量,达到了0.64,其次为净利润增长NPGRT和换手率,其值为0.58。(2)从沪深300成份股的角度看,和上证50相似,但净利润增长和换手率相关性有所下降,同时净利润增长率和市值因子相关性提升。(3)从中证500成份股的角度看,最高相关性的为净利润增长率和市值,同时eps和PE的相关性进一步提升,其他因子相关性均有所下降。以上为相关性的6年内每周平均值,为了考虑相关性的稳定情况,下面分别展示了各因子在三大股指中的相关性标准差,标准差越小,相关性越稳定。''''''3.2相关性标准差'''#上证50fig=plt.figure(figsize=(15,6))ax=fig.add_subplot(111)sns.heatmap(corr_SH50.std(axis=0),annot=True,vmax=1,vmin=0,xticklabels=context.Fields,yticklabels=context.Fields,cmap=cmap)ax.set_title("corr_std_SH50",fontsize=21)heat_fig=fig.get_figure()heat_fig.savefig('fig/3.2.1.png',dpi=400)#沪深300fig=plt.figure(figsize=(15,6))ax=fig.add_subplot(111)sns.heatmap(corr_HS300.std(axis=0),annot=True,vmax=1,vmin=0,xticklabels=context.Fields,yticklabels=context.Fields,cmap=cmap)ax.set_title("corr_std_HS300",fontsize=21)heat_fig=fig.get_figure()heat_fig.savefig('fig/3.2.2.png',dpi=400)#中证500fig=plt.figure(figsize=(15,6))ax=fig.add_subplot(111)sns.heatmap(corr_ZZ500.std(axis=0),annot=True,vmax=1,vmin=0,xticklabels=context.Fields,yticklabels=context.Fields,cmap=cmap)ax.set_title("corr_std_ZZ500",fontsize=21)heat_fig=fig.get_figure()heat_fig.savefig('fig/3.2.3.png',dpi=400)'''上图分别展示了各因子在三大股指中的相关性标准差,结论如下:(1)从上证50指数成份股的角度看,波动性最高的为ROE和股本,其次是ROE和每股收益EPS。(2)从沪深300指数成份股的角度看,波动性最高的是净利润增长率和ROE,其次是换手率和成交量等。(3)从中证500指数成份股的角度看,和沪深300相似,只不过波动率整体略有下降。波动性是指各指标相关性随着时间变化发生的波动。''''''3.3相关强度上述部分展示了相关性的均值以及标准差,通过两者相除我们能得到判断因子相关性强弱的指标。其绝对值越大,说明它的相关性越强。计算公式为:x=mean(Corr)/std(corr)'''cmap=sns.diverging_palette(240,10,sep=10,as_cmap=True)#上证50fig=plt.figure(figsize=(15,6))ax=fig.add_subplot(111)sns.heatmap((corr_SH50.mean(axis=0)/corr_SH50.std(axis=0)).astype(int),annot=True,vmax=1,vmin=0,xticklabels=context.Fields,yticklabels=context.Fields,cmap=cmap)ax.set_title("corr_pow_SH50",fontsize=21)heat_fig=fig.get_figure()heat_fig.savefig('fig/3.3.1.png',dpi=400)#沪深300fig=plt.figure(figsize=(15,6))ax=fig.add_subplot(111)sns.heatmap((corr_HS300.mean(axis=0)/corr_HS300.std(axis=0)).astype(int),annot=True,vmax=1,vmin=0,xticklabels=context.Fields,yticklabels=context.Fields,cmap=cmap)ax.set_title("corr_pow_HS300",fontsize=21)heat_fig=fig.get_figure()heat_fig.savefig('fig/3.3.2.png',dpi=400)#中证500fig=plt.figure(figsize=(15,6))ax=fig.add_subplot(111)sns.heatmap((corr_ZZ500.mean(axis=0)/corr_ZZ500.std(axis=0)).astype(int),annot=True,vmax=1,vmin=0,xticklabels=context.Fields,yticklabels=context.Fields,cmap=cmap)ax.set_title("corr_pow_ZZ500",fontsize=21)heat_fig=fig.get_figure()heat_fig.savefig('fig/3.3.3.png',dpi=400)plt.close()'''通过上图相关强度数据可以得出以下结论:(1)对于这三个指数,PE和EPS因子是有明显稳定的相关性的,成交量和换手率、PE以及净利润增长率和换手率的相关性相对稳定。(2)中证500指数中净利润增长率和市值稳定性较高。(3)相关强度最低的组合为市值和成交量、换手率,股本、ROE和其他因子的相关强度都相对较低。''''''四、因子InformationCoefficient分析如果想通过因子分析来选股,我们不仅需要考虑因子的相关性,还需要判断下因子的选股能力。通过因子的IC(InformationCoefficient)值来选择解释力度较高的因子,步骤如下:(1)选出股票池,比如指数的成分股。(2)特征因子按照从大到小排序。(3)股票隔日收益率按照从大到小排序。(4)计算两个排序数值之间的相关性,即RankIC。''''''4.1IC平均值'''IC_SH50=factor_IC_analysis(context,'SH50',factorData)IC_HS300=factor_IC_analysis(context,'HS300',factorData)IC_ZZ500=factor_IC_analysis(context,'ZZ500',factorData)IC_A=factor_IC_analysis(context,'A',factorData)temp=pd.DataFrame()temp['A']=IC_A.mean()temp['SH50']=IC_SH50.mean()temp['HS300']=IC_HS300.mean()temp['ZZ500']=IC_ZZ500.mean()fig=plt.figure(figsize=(15,6))ax=fig.add_subplot(111)cmap=sns.diverging_palette(240,10,sep=10,as_cmap=True)sns.heatmap(temp,annot=True,vmax=1,vmin=0,cmap=cmap)ax.set_title("IC_ttl_Mean",fontsize=21)heat_fig=fig.get_figure()heat_fig.savefig('fig/4.1.0.png',dpi=400)'''首先我们展示了全市场和三大股指中各因子IC的平均值,周平均IC值均在±0.2以上,说明因子的解释力度都不错。其中,股本的选股能力最强,其次为成交量因子,而净利润增长率因子效果在所有因子中最差。为了进一步分析因子的选股能力,下面对IC的波动性进行分析,下面我们展示了每个年度的IC均值。'''total1=pd.DataFrame()total2=pd.DataFrame()total3=pd.DataFrame()total4=pd.DataFrame()foriinrange(len(Year)):total1[Year[i]]=IC_A.iloc[i*int(len(IC_A)/10):(i+1)*int(len(IC_A)/10),:].mean()total2[Year[i]]=IC_SH50.iloc[i*int(len(IC_SH50)/10):(i+1)*int(len(IC_SH50)/10),:].mean()total3[Year[i]]=IC_HS300.iloc[i*int(len(IC_HS300)/10):(i+1)*int(len(IC_HS300)/10),:].mean()total4[Year[i]]=IC_ZZ500.iloc[i*int(len(IC_ZZ500)/10):(i+1)*int(len(IC_ZZ500)/10),:].mean()x=np.array(range(len(Year)))#全A股fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)Fields=['TOTAL_SHARE','volume','EPSDILUTED','ROEDILUTED','PETTM','TURNRATE','TOTMKTCAP','NPGRT']foriinFields:plt.bar(x,total1.loc[i],bar_width,label=i)plt.xticks(range(len(Year)),Year)ax.set_title("IC_annual_mean_A",fontsize=21)plt.legend()plt.savefig('fig/4.1.1.png')#上证50fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)Fields=['TOTAL_SHARE','volume','EPSDILUTED','PETTM','ROEDILUTED','TURNRATE','NPGRT','TOTMKTCAP']foriinFields:plt.bar(x,total2.loc[i],bar_width,label=i)plt.xticks(range(len(Year)),Year)ax.set_title("IC_annual_mean_SH50",fontsize=21)plt.legend()plt.savefig('fig/4.1.2.png')#沪深300fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)Fields=['TOTAL_SHARE','volume','EPSDILUTED','PETTM','ROEDILUTED','TOTMKTCAP','TURNRATE','NPGRT']foriinFields:plt.bar(x,total3.loc[i],bar_width,label=i)plt.xticks(range(len(Year)),Year)ax.set_title("IC_annual_mean_HS300",fontsize=21)plt.legend()plt.savefig('fig/4.1.3.png')#中证500fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)Fields=['TOTAL_SHARE','volume','EPSDILUTED','TOTMKTCAP','ROEDILUTED','PETTM','TURNRATE','NPGRT']foriinFields:plt.bar(x,total4.loc[i],bar_width,label=i)plt.xticks(range(len(Year)),Year)ax.set_title("IC_annual_mean_ZZ500",fontsize=21)plt.legend()plt.savefig('fig/4.1.4.png')'''上面我们对历史IC序列的每个年度均值进行分析,根据表中结果可以得到以下结论:(1)各个因子在中证500中的波动性最大,上证50其次,紧接着是HS300与全市场。(2)股本因子在各个指数成分股中的波动性最大,净利润增长率因子在各个指数成分股中波动性最小。''''''4.2IC绝对值均值分析为了考察绝对选股能力,我们在下表中展示了各因子IC的绝对值的平均值。'''IC_A=abs(IC_A)IC_SH50=abs(IC_SH50)IC_HS300=abs(IC_HS300)IC_ZZ500=abs(IC_ZZ500)temp=pd.DataFrame()temp['A']=IC_A.mean()temp['SH50']=IC_SH50.mean()temp['HS300']=IC_HS300.mean()temp['ZZ500']=IC_ZZ500.mean()fig=plt.figure(figsize=(15,6))ax=fig.add_subplot(111)sns.heatmap(temp,annot=True,vmax=1,vmin=0,cmap=cmap)ax.set_title("IC_ABS_Mean_ttl",fontsize=21)heat_fig=fig.get_figure()heat_fig.savefig('fig/4.2.0.png',dpi=400)'''由上表可知,整体上可见IC的绝对值的平均值最高的是中证500,其次是上证50,再次是沪深300。也就是说中证500指数的因子选股能力更加明显,但波动也较大。股本因子在大部分指数中绝对值平均值最大。可见股本因子的波动性最大,其次为EPS因子,净利润增长率因子的绝对值平均值最小,该因子的波动性最小。由上可得到的结论与IC均值年度分析结果基本一致。接下来分年度展示了各因子IC的绝对值平均值。'''total1=pd.DataFrame()total2=pd.DataFrame()total3=pd.DataFrame()total4=pd.DataFrame()foriinrange(len(Year)):total1[Year[i]]=IC_A.iloc[i*int(len(IC_A)/10):(i+1)*int(len(IC_A)/10),:].mean()total2[Year[i]]=IC_SH50.iloc[i*int(len(IC_SH50)/10):(i+1)*int(len(IC_SH50)/10),:].mean()total3[Year[i]]=IC_HS300.iloc[i*int(len(IC_HS300)/10):(i+1)*int(len(IC_HS300)/10),:].mean()total4[Year[i]]=IC_ZZ500.iloc[i*int(len(IC_ZZ500)/10):(i+1)*int(len(IC_ZZ500)/10),:].mean()x=np.array(range(len(Year)))#全A股fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)Fields=['EPSDILUTED','TOTAL_SHARE','ROEDILUTED','volume','TOTMKTCAP','PETTM','TURNRATE','NPGRT']foriinFields:plt.bar(x,total1.loc[i],bar_width,label=i)plt.xticks(range(len(Year)),Year)ax.set_title("IC_annual_ABS_Mean_A",fontsize=21)plt.legend()plt.savefig('fig/4.2.1.png')#上证50fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)Fields=['TOTAL_SHARE','EPSDILUTED','volume','ROEDILUTED','TOTMKTCAP','PETTM','TURNRATE','NPGRT']foriinFields:plt.bar(x,total2.loc[i],bar_width,label=i)plt.xticks(range(len(Year)),Year)ax.set_title("IC_annual_ABS_Mean_SH50",fontsize=21)plt.legend()plt.savefig('fig/4.2.2.png')#沪深300fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)Fields=['TOTAL_SHARE','EPSDILUTED','ROEDILUTED','volume','TOTMKTCAP','PETTM','TURNRATE','NPGRT']foriinFields:plt.bar(x,total3.loc[i],bar_width,label=i)plt.xticks(range(len(Year)),Year)ax.set_title("IC_annual_ABS_Mean_HS300",fontsize=21)plt.legend()plt.savefig('fig/4.2.3.png')#中证500fig=plt.figure(figsize=(21,9))ax=fig.add_subplot(111)Fields=['TOTAL_SHARE','EPSDILUTED','volume','TOTMKTCAP','ROEDILUTED','PETTM','TURNRATE','NPGRT']foriinFields:plt.bar(x,total4.loc[i],bar_width,label=i)plt.xticks(range(len(Year)),Year)ax.set_title("IC_annual_ABS_Mean_ZZ500",fontsize=21)plt.legend()plt.savefig('fig/4.2.4.png')plt.close()'''由上表可知,除了股本因子和EPS因子较强,净利润增长率较弱之外,其他因子的绝对的选股能力区别不大。综上所述,我们因子组合的评判标准分为三点:因子暴露度、因子相关强度和因子选股能力。结论如下:(1)三大股指的股本和EPS因子的偏离度均是最高的。中等偏离度的因子包括,换手率、ROE、PE、成交量因子。偏离度最小的是净利润增长率因子。(2)相关强度最低的组合为市值和成交量,股本和其他因子的相关强度都相对较低。(3)除了股本因子较强,净利润增长率较弱之外,其他因子的选股能力区别不大。综合以上结论,可知综合选择暴露度高、相关强度低和选股能力强的因子,股本和EPS作为因子组合较为合适。'''print(datetime.datetime.now()-time1)#################################################################################################importscipy.statsasstdeffactor_IC_analysis(context,index,factorData):ifindex=='SH50':index='SHSE.000016'ifindex=='HS300':index='SHSE.000300'ifindex=='ZZ500':index='SHSE.000905'ifindex=='A':index=NoneIC=[]fordateincontext.trade_date_list[:-1]:ifindex:#取股票池stockList=list(get_history_constituents(index,start_date=date,end_date=date)[0]['constituents'].keys())else:stockList=list(factorData[date].index)#获取横截面收益率#获取股票标的列表所对应的每天成交量数据df_close=history(symbol=stockList,frequency='1d',start_time=date,end_time=date,fields='symbol,close',skip_suspended=False,fill_missing='NaN',df=True)df_close_new=history(symbol=stockList,frequency='1d',start_time=context.trade_date_list[context.trade_date_list.index(date)+1],end_time=context.trade_date_list[context.trade_date_list.index(date)+1],fields='symbol,close',skip_suspended=False,fill_missing='NaN',df=True)df_close['close_new']=df_close_new['close']ifdf_close.emptyordf_close_new.empty:continuedf_pchg=df_close['close_new']/df_close['close']-1R_T=pd.DataFrame()R_T['symbol']=df_close['symbol']R_T['pchg']=df_pchgR_T.index=R_T['symbol']IC_Field=[]foriincontext.Fields:#获取因子数据factor_data=factorData[date].loc[factorData[date].ersection(stockList),i]R_T['factor']=factor_data#ifi=='volume':R_T['factor']=len(R_T)*[0]R_T=R_T.dropna()IC_Field.append(st.pearsonr(R_T.pchg.rank(),R_T['factor'].rank())[0])IC.append(IC_Field)result=pd.DataFrame(index=context.trade_date_list[:-1],columns=context.Fields,data=IC)result=result.dropna(how='all')returnresultdefgetCorr(context,index,factorData):ifindex=='SH50':index='SHSE.000016'ifindex=='HS300':index='SHSE.000300'ifindex=='ZZ500':index='SHSE.000905'corr=[]fordateincontext.trade_date_list:#获取该时间指数的每个交易日的股票组成stockList=list(get_history_constituents(index,start_date=date,end_date=date)[0]['constituents'].keys())temp=factorData[date].loc[factorData[date].ersection(stockList),:]corr.append(np.array(temp.corr()))returnnp.array(corr)defgetIndexRank(context,index,factorData):ifindex=='SH50':index='SHSE.000016'ifindex=='HS300':index='SHSE.000300'ifindex=='ZZ500':index='SHSE.000905'indexRank=pd.DataFrame(index=context.trade_date_list)foriincontext.Fields:tempindexRank=[]fordateincontext.trade_date_list:#获取该时间指数的每个交易日的股票组成stockList=list(get_history_constituents(index,start_date=date,end_date=date)[0]['constituents'].keys())temp=factorData[date][[i]]#每个交易日根据因子大小做排序temp=temp.sort_values(by=i,ascending=False)temp['rank']=range(len(temp)+1,1,-1)#获取指数的排序均值,存储到临时的list中tempindexRank.append((temp.loc[ersection(stockList),'rank'].mean()-len(temp)/2)/len(temp))indexRank[i]=tempindexRankreturnindexRankdefget_factor_data(index:str,date_list:list):factorData={}fordateindate_list:ifindex=='A':#获取每天大盘指数含有的股票标的stockList=list(set(list(get_history_constituents('SHSE.000002',date,date)[0]['constituents'].keys())+list(get_history_constituents('SZSE.399107',date,date)[0]['constituents'].keys())+list(get_history_constituents('SHSE.000300',date,date)[0]['constituents'].keys())+list(get_history_constituents('SHSE.000905',date,date)[0]['constituents'].keys())))#获取股票标的列表所对应的每天成交量数据hist_volume=history(symbol=stockList,frequency='1d',start_time=date,end_time=date,fields='symbol,volume',skip_suspended=False,fill_missing='NaN',df=True)#其中PE使用了PETTM,比较能够满足目前数据披露更新的及时性#TURNRATE:换手率,PETTM:动态市盈率,TOTMKTCAP:总市值,TOTAL_SHARE:总股本fund1=get_fundamentals_n(table='trading_derivative_indicator',symbols=stockList,end_date=date,count=1,fields='TURNRATE,PETTM,TOTMKTCAP,TOTAL_SHARE',df=True)#EPSDILUTED:摊薄每股收益_期末股数,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论