因子選股策略(Python版)_第1頁
因子選股策略(Python版)_第2頁
因子選股策略(Python版)_第3頁
因子選股策略(Python版)_第4頁
因子選股策略(Python版)_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

因子選股策略(Python版)一種基于因子的選股策略,主要通過分析因子的暴露度、相關(guān)性和選股能力來選擇合適的因子組合。策略的核心在于通過歷史數(shù)據(jù)評估因子的有效性,并結(jié)合圖表展示分析結(jié)果。思路描述1.**原始數(shù)據(jù)獲取**:-使用EMC量化的SDK獲取全A股標(biāo)的的各項因子數(shù)據(jù)及交易行情相關(guān)的日頻成交量、收盤價數(shù)據(jù)。-數(shù)據(jù)處理成周頻數(shù)據(jù),形成因子分析所需的數(shù)據(jù)集。2.**因子暴露分析**:-選取財務(wù)、估值、成長、行情相關(guān)的風(fēng)格因子。-計算各因子相對于全市場的偏離程度,分析其在上證50、滬深300和中證500指數(shù)中的表現(xiàn)。-通過圖表展示各因子在各年份的平均暴露情況。3.**因子相關(guān)性分析**:-計算各因子在三大股指中的相關(guān)系數(shù),并通過熱力圖展示其平均值和標(biāo)準差。-分析因子相關(guān)性的穩(wěn)定性和強度,識別出相關(guān)性較低的組合。4.**因子InformationCoefficient(IC)分析**:-計算各因子的IC值,評估其選股能力。-分析IC值的年度均值和絕對值均值,識別出選股能力較強的因子。特點描述1.**全面的數(shù)據(jù)處理**:-策略從原始數(shù)據(jù)獲取到數(shù)據(jù)處理,再到因子分析和選股能力評估,形成了一個完整的數(shù)據(jù)分析流程。-通過標(biāo)準化處理和周頻數(shù)據(jù)的使用,確保了數(shù)據(jù)的統(tǒng)一性和可比性。2.**多維度的因子分析**:-策略不僅分析了因子的暴露度,還深入探討了因子的相關(guān)性和選股能力。-通過多個維度評估因子,能夠更全面地理解因子的有效性和穩(wěn)定性。3.**可視化的結(jié)果展示**:-策略使用大量的圖表來展示分析結(jié)果,包括柱狀圖、熱力圖等。-可視化的方式使得分析結(jié)果更加直觀,便于理解和決策。4.**綜合的因子選擇標(biāo)準**:-策略綜合考慮了因子的暴露度、相關(guān)強度和選股能力,提出了綜合選擇因子的標(biāo)準。-通過綜合評估,策略能夠選出暴露度高、相關(guān)強度低且選股能力強的因子組合。因子選股策略通過全面的數(shù)據(jù)處理、多維度的因子分析和可視化的結(jié)果展示,提出了一套綜合的因子選擇標(biāo)準。即能夠有效評估因子的有效性。策略代碼:#coding=utf-8#Author@ZinanLiu@Eastmoney.Co#2023.01.03from__future__importprint_function,absolute_importimporttimeimportmatplotlib.pyplotaspltfromgm.apiimport*importdatetimeimportnumpyasnpimportpandasaspdfromsiximportStringIOimportpickleimportstatsmodels.apiassmdefinit(context):time1=datetime.datetime.now()'''一、原始數(shù)據(jù)獲取通過EMC量化的SDK來獲取全A股標(biāo)的的各項因子數(shù)據(jù),以及交易行情相關(guān)的日頻成交量、收盤價數(shù)據(jù),再通過標(biāo)準化處理,形成因子分析所需要的數(shù)據(jù)集。目前時間階段選取為2017年至2022年,原始數(shù)據(jù)集獲取整理后形成的是周頻的數(shù)據(jù),index為時間,column為因子特征,以此為基礎(chǔ)進行因子分析。同時為了方便后續(xù)調(diào)參分析,建議獲取數(shù)據(jù)后落到本地,以后直接讀取本地文件。'''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類型的因子數(shù)據(jù),每個周頻交易日對應(yīng)一個數(shù)據(jù)表格#factorData=get_factor_data('A',context.trade_date_list)###數(shù)據(jù)處理成單個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為了加快取數(shù)時間,將數(shù)據(jù)落到本地直接讀取factorData_df=pd.read_csv('factorDataGM.csv',index_col=0)factorData={}fordateincontext.trade_date_list:factorData[date]=factorData_df[factorData_df['date']==date]'''二、因子暴露分析這次選取的風(fēng)格因子為財務(wù)、估值、成長、行情相關(guān)。不僅因為這些因子的市場關(guān)注度較高,而且它們是Barra多因子框架中幾個重要的風(fēng)險因子。為了考慮全市場的情況,我們選取了A股幾大指數(shù),分別是上證50,滬深300和中證500。同時,為了考量歷史上各因子的暴露情況,我們以周為頻率測算因子相對于全市場的偏離程度。由于需要統(tǒng)一標(biāo)準和可比性,我們使用的數(shù)據(jù)為因子當(dāng)日的排序。計算步驟如下:(1)將所有股票的每日因子按照從大到小排序。(2)從中取出屬于某一指數(shù)的成份股,計算其成分股因子的排序平均值。(3)暴露度=(指數(shù)因子排序平均值-當(dāng)日全市場排序中間值)/當(dāng)日股票總數(shù)。''''''2.1因子暴露年度均值'''context.Fields=['TOTMKTCAP','TOTAL_SHARE','volume','TURNRATE','PETTM','EPSDILUTED','ROEDILUTED','NPGRT']#獲取指數(shù)的因子排序數(shù)據(jù),index為日期,column為因子,數(shù)據(jù)為排序均值,然后根據(jù)日期做平均,獲取每個因子每年的排序均值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())#劃分年份進行暴露度統(tǒng)計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()#設(shè)置下面所有柱狀圖的柱寬bar_width=0.3#畫圖,以bar展示各因子在各時刻的平均數(shù)據(jù)#上證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')'''上圖展示的結(jié)果為年度因子暴露數(shù)據(jù),橫坐標(biāo)是年,不同的顏色bar代表當(dāng)時不同因子的暴露情況。由上圖可以看出:(1)市值和股本因子的偏離度在每一時段均是最高的。上證50市值和股本的偏離度穩(wěn)定接近50%,滬深300的穩(wěn)定在40%左右,而中證500的為20%-30%左右,且逐年遞增。(2)各項因子的偏離度絕對數(shù)值在上證50中比較高,在滬深300和中證500中整體均有所下降。(3)凈利潤增長率因子NPGRT的偏離度一直都接近0,可見其對三大股指的有效性比較低。''''''2.2指數(shù)因子暴露均值對比'''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()'''上圖分別統(tǒng)計了三大股指的各個因子在2017-2022年的平均暴露情況,從整體上來看:(1)市值和股本因子的偏離度均是最高的。上證50市值和股本的偏離度穩(wěn)定接近50%,滬深300的偏離度穩(wěn)定在40%左右,而中證500的在25%左右。(2)中等偏離度的因子包括,換手率、成交量、EPS、ROE因子。這些因子在上證50和滬深300指數(shù)的偏離度在20%-30%左右,然而中證500相對會低5%-10%。(3)偏離度較小的是PE和凈利潤增長率因子,在三大指數(shù)中,凈利潤增長率的偏離度幾乎為0。也即大市值和小市值個股在成長性方面的差異不大。三大股指在凈利潤增長率因子NPGRT上的暴露度幾乎為0,所以該因子可以被移出風(fēng)險因子庫。但除了需要考慮因子暴露度之外,我們還需要計算因子之間的相關(guān)性。將相關(guān)性較高的因子區(qū)分開來,可以降低因子共線性風(fēng)險并且減少因子個數(shù)。接下來我們對因子的相關(guān)性進行分析。''''''三、因子相關(guān)性分析3.1相關(guān)性平均值'''#獲取三大指數(shù)的8個因子每周的相關(guān)系數(shù)數(shù)據(jù)corr_SH50=getCorr(context,'SH50',factorData)corr_HS300=getCorr(context,'HS300',factorData)corr_ZZ500=getCorr(context,'ZZ500',factorData)#下方的mean是平均了所有的dates的8個字段各自對應(yīng)的相關(guān)系數(shù)值。#z軸是date,x和y是fields,X和Y對應(yīng)的值即為相關(guān)系數(shù)。importseabornassns#設(shè)置熱力圖畫板顏色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年間各因子在三大股指中的相關(guān)性。根據(jù)上表的展示結(jié)果,結(jié)論如下:(1)從上證50指數(shù)成份股的角度看,相關(guān)性最高的因子為換手率和成交量,達到了0.64,其次為凈利潤增長NPGRT和換手率,其值為0.58。(2)從滬深300成份股的角度看,和上證50相似,但凈利潤增長和換手率相關(guān)性有所下降,同時凈利潤增長率和市值因子相關(guān)性提升。(3)從中證500成份股的角度看,最高相關(guān)性的為凈利潤增長率和市值,同時eps和PE的相關(guān)性進一步提升,其他因子相關(guān)性均有所下降。以上為相關(guān)性的6年內(nèi)每周平均值,為了考慮相關(guān)性的穩(wěn)定情況,下面分別展示了各因子在三大股指中的相關(guān)性標(biāo)準差,標(biāo)準差越小,相關(guān)性越穩(wěn)定。''''''3.2相關(guān)性標(biāo)準差'''#上證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)'''上圖分別展示了各因子在三大股指中的相關(guān)性標(biāo)準差,結(jié)論如下:(1)從上證50指數(shù)成份股的角度看,波動性最高的為ROE和股本,其次是ROE和每股收益EPS。(2)從滬深300指數(shù)成份股的角度看,波動性最高的是凈利潤增長率和ROE,其次是換手率和成交量等。(3)從中證500指數(shù)成份股的角度看,和滬深300相似,只不過波動率整體略有下降。波動性是指各指標(biāo)相關(guān)性隨著時間變化發(fā)生的波動。''''''3.3相關(guān)強度上述部分展示了相關(guān)性的均值以及標(biāo)準差,通過兩者相除我們能得到判斷因子相關(guān)性強弱的指標(biāo)。其絕對值越大,說明它的相關(guān)性越強。計算公式為: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()'''通過上圖相關(guān)強度數(shù)據(jù)可以得出以下結(jié)論:(1)對于這三個指數(shù),PE和EPS因子是有明顯穩(wěn)定的相關(guān)性的,成交量和換手率、PE以及凈利潤增長率和換手率的相關(guān)性相對穩(wěn)定。(2)中證500指數(shù)中凈利潤增長率和市值穩(wěn)定性較高。(3)相關(guān)強度最低的組合為市值和成交量、換手率,股本、ROE和其他因子的相關(guān)強度都相對較低。''''''四、因子InformationCoefficient分析如果想通過因子分析來選股,我們不僅需要考慮因子的相關(guān)性,還需要判斷下因子的選股能力。通過因子的IC(InformationCoefficient)值來選擇解釋力度較高的因子,步驟如下:(1)選出股票池,比如指數(shù)的成分股。(2)特征因子按照從大到小排序。(3)股票隔日收益率按照從大到小排序。(4)計算兩個排序數(shù)值之間的相關(guān)性,即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序列的每個年度均值進行分析,根據(jù)表中結(jié)果可以得到以下結(jié)論:(1)各個因子在中證500中的波動性最大,上證50其次,緊接著是HS300與全市場。(2)股本因子在各個指數(shù)成分股中的波動性最大,凈利潤增長率因子在各個指數(shù)成分股中波動性最小。''''''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指數(shù)的因子選股能力更加明顯,但波動也較大。股本因子在大部分指數(shù)中絕對值平均值最大??梢姽杀疽蜃拥牟▌有宰畲?,其次為EPS因子,凈利潤增長率因子的絕對值平均值最小,該因子的波動性最小。由上可得到的結(jié)論與IC均值年度分析結(jié)果基本一致。接下來分年度展示了各因子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因子較強,凈利潤增長率較弱之外,其他因子的絕對的選股能力區(qū)別不大。綜上所述,我們因子組合的評判標(biāo)準分為三點:因子暴露度、因子相關(guān)強度和因子選股能力。結(jié)論如下:(1)三大股指的股本和EPS因子的偏離度均是最高的。中等偏離度的因子包括,換手率、ROE、PE、成交量因子。偏離度最小的是凈利潤增長率因子。(2)相關(guān)強度最低的組合為市值和成交量,股本和其他因子的相關(guān)強度都相對較低。(3)除了股本因子較強,凈利潤增長率較弱之外,其他因子的選股能力區(qū)別不大。綜合以上結(jié)論,可知綜合選擇暴露度高、相關(guān)強度低和選股能力強的因子,股本和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)#獲取橫截面收益率#獲取股票標(biāo)的列表所對應(yīng)的每天成交量數(shù)據(jù)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:#獲取因子數(shù)據(jù)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:#獲取該時間指數(shù)的每個交易日的股票組成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:#獲取該時間指數(shù)的每個交易日的股票組成stockList=list(get_history_constituents(index,start_date=date,end_date=date)[0]['constituents'].keys())temp=factorData[date][[i]]#每個交易日根據(jù)因子大小做排序temp=temp.sort_values(by=i,ascending=False)temp['rank']=range(len(temp)+1,1,-1)#獲取指數(shù)的排序均值,存儲到臨時的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':#獲取每天大盤指數(shù)含有的股票標(biāo)的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())))#獲取股票標(biāo)的列表所對應(yīng)的每天成交量數(shù)據(jù)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,比較能夠滿足目前數(shù)據(jù)披露更新的及時性#TURNRATE:換手率,PETTM:動態(tài)市盈率,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:攤薄每股收益_期末股數(shù),

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。