夏普比率是指在某一时间段内,投资组合每承担一单位风险所带来的的超额收益,值越大表示收益越好,其表达式如下:
其中,是无风险收益率,是投资组合的期望收益率,是投资组合收益的波动率。
本文以国内公募基金为例来说明如何计算基金产品的夏普比率,该数据集共有 4 个基金产品构成,案例中完整的数据可以通过百度网盘(https://pan.baidu.com/share/init?surl=odRuQy4dewPbsU_MsCfaNQ,提取码:jayy)获取。
案例中的日收益率使用对数收益率进行计算,无风险收益率选择银行一年存款基准利率1.5%,Python程序如下:
import pandas as pd
import numpy as np
fund = pd.read_excel(r'C:UsersAdministratorDesktop四只开放式股票型基金的净值.xlsx',header = 0,index_col = 0)
# 夏普比率
def SR(Rp,Rf,Vp):
return (Rp - Rf)/Vp
R_fund = np.log(fund/fund.shift(1)) #基金的日对数收益率
R_fund = R_fund.dropna()
R_mean = R_fund.mean()*252 #计算全部3年的平均年化收益率
sigma = R_fund.std()*np.sqrt(252) #计算全部3年的平均年化收益波动率
R_f = 0.015 #无风险利率
SR_3years = SR(R_mean,R_f,sigma)
print('2016-2018平均3年的夏普比率:n',SR_3years)
所提诺比率是指投资组合每承担一单位下行风险所带来的的超额收益,值越大表示收益越好,其表达式如下:
其中,是无风险收益率,是投资组合的期望收益率,是发生亏损的样本量,是投资组合收益的下偏标准差,所谓下偏标准差是只考虑亏损而不考虑盈利的标准差,隐含条件就是投资组合的上涨是符合投资者的需求而不应计入风险调整。
本文仍然使用上述案例进行说明,其Python的程序如下:
#索提诺比率
def SOR(Rp,Rf,Vp):
return (Rp - Rf)/Vp
Vp_lower = np.zeros_like(R_mean)
for i in range(len(Vp_lower)):
#生产收益率为负的时间序列
R_neg = R_fund.iloc[:,i][R_fund.iloc[:,i] < 0]
#年化下行收益标准差
Vp_lower[i] = np.sqrt(252)*np.sqrt(np.sum(R_neg**2)/len(R_neg))
print(R_fund.columns[i]+'收益下行标准差:',Vp_lower[i])
SOR_3years = SOR(R_mean,R_f,Vp_lower)
print('2016-2018平均3年的索提诺比率:n',SOR_3years)
特雷诺比率是指投资组合每承担一单位系统风险所带来的的风险溢价,值越大表示收益越好,其表达式如下:
其中,是无风险收益率,是投资组合的期望收益率,是投资组合的系统性风险,当投资组合的非系统性风险已被分散,只需考虑系统性风险时,特雷诺比率相对比较合适。
本文以沪深300指数3016-2018年的数据及上述4只基金的数据为例来说明如何计算特雷诺比率,案例中沪深300指数完整的数据可以通过百度网盘(https://pan.baidu.com/share/init?surl=QXBlomvS4Y2bVN7epKKQpg,提取码:763e)获取。
本文仍然使用上述案例中的无风险收益率进行计算,其中市场投资组合使用沪深300指数进行代替,通过线性回归计算4只基金产品的值,其Python的程序如下:
import statsmodels.api as sm
HS300 = pd.read_excel(r'C:UsersAdministratorDesktop沪深300指数.xlsx',header = 0,index_col = 0)
#计算日收益率
R_HS300 = np.log(HS300/HS300.shift(1))
R_HS300 = R_HS300.dropna()
# 特雷诺比率
def TR(Rp,Rf,beta):
return (Rp - Rf)/beta
betas = np.zeros_like(R_mean)
cons = np.zeros_like(R_mean)
X = R_HS300
X_addcons = sm.add_constant(X)
for i in range(len(R_mean)):
#获取基金产品时间序列
Y = R_fund.iloc[:,i]
#使用线性回归计算beta值
model = sm.OLS(endog=Y,exog=X_addcons)
result = model.fit()
cons[i] = result.params[0]
betas[i] = result.params[1]
print(R_fund.columns[i] + 'beta = ',betas[i])
TR_3years = TR(R_mean,R_f,betas)
print('2016-2018平均3年的特雷诺比率:n',TR_3years)
跟踪误差是指投资组合的收益率与基准组合收益率之间差异的标准差,反映投资组合的主动管理风险。要计算跟踪误差,首先需要计算跟踪偏离度,跟踪偏离度是指投资组合收益率与基准组合收益率之间的差异,其计算公式如下:
其中,是投资组合的期望收益率,是基准组合的期望收益率,
是投资组合的跟踪偏离度,是投资组合的跟踪误差。
信息比率是指投资组合每承担一单位主动管理风险所带来的的超额收益,值越大表示收益越好,其表达式如下:
本文仍然使用上述案例中的无风险收益率进行计算,其中基准组合使用沪深300指数进行代替,其Python的程序如下:
# 信息比率
def IR(Rp,Rb,te):
return (Rp - Rb)/te
TE_fund = np.zeros_like(R_mean)
for i in range(len(R_mean)):
TD = np.array(R_fund.iloc[:,i]) - np.array(R_HS300.iloc[:,0])
TE_fund[i] = TD.std()*np.sqrt(252)
print(R_fund.columns[i] + '跟踪误差',TE_fund[i])
R_mean_HS300 = np.array(R_HS300.mean()*252)
IR_3years = IR(R_mean,R_mean_HS300,TE_fund)
print('2016-2018平均3年的信息比率:n',IR_3years)