衡量某一投资组合策略的绩效就是要考察其实际投资组合所承担的风险与所获得的收益是否匹配,主要指标有Sharpe Ratio、Treynor Ratio、Sortino Ratio、Jensen’s Alpha、Information Ratio、T2、M2等。
Sharp Ratio、M2——衡量总风险
Sharpe Ratio:SRP=(E(Rp)-Rf)/σp,E(Rp)表示投资组合的预期收益率,通常用往年收益率替代,σp表示投资组合收益的波动率。SR表示承担一单位风险带来的超额回报,即CML的斜率,越大越好。
注意SR适合衡量没有分散的总体风险,且只能评估历史表现,不反映未来;SR的大小本身没有意义,需要与其他组合比较才有价值;SR的计算结果与时间跨度、收益计算频次等有很大关系。
M2:SR更像一种单价的概念,不够直观。M2=(SRp-SRM)×σM,即该投资组合和市场组合的单价之差×市场风险转化成收益指标,表示该投资组合比投资benchmark的收益高出多少。
下面以“银华鑫盛”和“财通福瑞”两只公募基金作为评估对象,沪深300作为市场基准组合,假定一年期Rf为1.5%,用SR和M2两个指标来评估它们在的表现:
import numpy as npimport pandas as pdimport tushare as tsimport datetimefrom pylab import mplmpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['axes.unicode_minus']=Falsepro=ts.pro_api('你的token')yhxs=pro.fund_nav(ts_code='501022.SH');ctfr=pro.fund_nav(ts_code='501028.SH')#tushare中不支持选择基金时间范围,转为csv再操作#yhxs.to_csv('yhxs.csv');ctfr.to_csv('ctfr.csv')yhxs=pd.read_csv('yhxs.csv');ctfr=pd.read_csv('ctfr.csv')for f in [yhxs,ctfr]:f['end_date']=f['end_date'].astype(str)#原数据的日期是array,先转为strf['end_date']=pd.to_datetime(f.end_date)f.set_index('end_date',inplace=True)fund=pd.concat([yhxs,ctfr],axis=1)fund.columns=['银华鑫盛','财通福瑞']fund.plot()
计算这两支基金以及沪深300在的年收益率和收益率的年波动率:
rfund=np.log(fund/fund.shift(-1)).dropna()#表中日期是降序排的,所以是-1rmean=rfund.mean()*252rvol=rfund.std()*(np.sqrt(252))hs300=pro.index_daily(ts_code='000300.SH',start_date='0101',end_date='1231')['close']#注意日期可能与基金的不匹配,可通过merge来匹配rp=np.log(hs300/hs300.shift(-1)).dropna()rm=rp.mean()*252vm=rp.std()*(np.sqrt(252))def SR(rp,rf,vp):return (rp-rf)/vpdef M_2(rp,rf,vp,rm,vm):return (SR(rp,rf,vp)-SR(rm,rf,vm))*vmrf=0.015SR=SR(rmean,rf,rvol)print('的夏普比率:\n',SR)的夏普比率:银华鑫盛 2.413184财通福瑞 2.085080dtype: float64dtype: float64M_=M_2(rmean,rf,rvol,rm,vm)print('的M方:\n',M_)的M方:银华鑫盛 0.159080财通福瑞 0.094124dtype: float64
由上述结果可知从两个指标来看,银华鑫盛的表现都要好于财通福瑞。
Treynor Ratio、T2——衡量系统性风险
Treynor Ratio:TR=(E(Rp)-Rf)/βp,表示承担一单位系统性风险带来的超额回报,即SML的斜率,越大越好。适合风险被完全分散的组合,具有前瞻性。
T²=(TRp-TRb)×βb=TRp-(Rm-Rf),即该投资组合的TR减去市场风险溢价,表示在同样的系统性风险上该投资组合比市场组合高出多少收益。
还是以上述两支基金为例,先求β值,再代入公式:
import statsmodels.api as smbeta=[]for i in range(2):model=sm.OLS(rfund.iloc[:,i],sm.add_constant(rp)).fit()beta.append(model.params[1])beta[0.6778732861979183, 0.7650625383238487]def TR(rp,rf,beta):return (rp-rf)/betadef T_2(rp,rf,beta,rm):return TR(rp,rf,beta)-TR(rm,rf,1)TR=TR(rmean,rf,beta)print('的特雷诺比率:\n',TR)的特雷诺比率:银华鑫盛 0.560434财通福瑞 0.448868dtype: float64T_=T_2(rmean,rf,beta,rm)print('的T方:\n',T_)的T方:银华鑫盛 0.241770财通福瑞 0.130204dtype: float64
由此可见银华鑫盛在承担一单位系统性风险上获得的收益更多,表现更好。
Information Ratio——衡量非系统性风险
IR=α/TEV=(Rp-Rb)/σ(Rpt-Rbt),TEV也称作跟踪误差、非系统性风险,是投资组合的收益率与基准组合收益率之间差异的标准差,可以衡量该投资者主动管理的风险,α也叫作abnormal return。IR越大说明基金经理主动管理的能力越强。还是以上述两支基金为例来计算IR:
#rmix数据框合并了两支基金和沪深300的对数收益率数据rmixOut[11]: ctfryhxshs300end_date -12-31 0.005361 0.003543 0.003656-12-30 0.012689 0.010705 0.014711... ... ... ...TEV1=(rmix['yhxs']-rmix['hs300']).std()*np.sqrt(252)TEV2=(rmix['ctfr']-rmix['hs300']).std()*np.sqrt(252)def IR(rp,rb,TEV):return (rp-rb)/TEVIR(rmean,rm,[TEV1,TEV2])Out[12]: 银华鑫盛 0.577622财通福瑞 0.300495dtype: float64
可见财通福瑞的非系统性风险也没处理好,侧面反映了财通福瑞基金的基金经理能力可能不如银华鑫盛的基金经理。(狗头)
Sortino Ratio——损失评估
SORP=(E(Rp)-Rf)/σLP,Sortino Ratio与夏普比率唯一的不同就是分母不是投资组合收益率的标准差,而是下半标准差,也就是说只考虑小于MAR=Rf的收益率数据(可简化为小于0),其他收益率不计入风险调整,该比率反映了投资组合承担每一单位下行风险所带来的超额收益。当亏损的样本数量多于盈利的样本数量时SOR比SR更合适(左偏厚尾分布时)。还是以上述两支基金为例来计算SOR:
lowervol=[]for i in range(2):negr=rmix.iloc[:,i][rmix.iloc[:,i]-rf<0]lowervol.append(np.sqrt(252)*negr.std())def SOR(rp,rf,vlp):return (rp-rf)/vlpSOR(rmean,rf,[lowervol[1],lowervol[0]])#rmix中两只基金顺序是反的Out[14]: 银华鑫盛 3.442140财通福瑞 3.330884dtype: float64
从结果发现银华鑫盛承担每一单位下行风险获得的超额收益更大。综合之前所有指标来看,均能说明银华鑫盛要比财通福瑞表现更好。