作者:知乎用户
链接:https://www.zhihu.com/question/27264526/answer/147672695
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
同一个资产,不同周期频率收益率,算出来的夏普值,根本就不是一回事!比如用每日的收益率算夏普值,和用每年的收益率算夏普,就不是一回事。而且在计算的时候,收益率和波动率周期是要一致的,你不能用日线数据算收益率,然后用周线算波动率。在题主的问题里面,其实是把周期弄混了,如果你要按三天一个样本来算收益,那么必须也要按三天一个样本的频率来算波动率,然而,这里按三天周期的话,就只有一个样本,是无法计算波动率的。所以只能按每日的收益来进行计算。下面是最近写的一篇详细解释文,用了一个实际例子来说明(Python语言)。---------------------------------------------------------我是分割线---------------------------------------------------------衡量基金收益的一个有名的标准就是夏普比率(Sharpe ratio)。有投资常识的人都明白,投资光看收益是不够的,还要看承受的风险,也就是收益风险比。夏普比率描述的正是这个概念,即每承受一单位的总风险,会产生多少超额的报酬。用数学公式描述就是:其中,:投资组合预期收益率:无风险利率:投资组合的波动率(亦即投资组合的风险)上面三个值一般是指年化后的值,比如预期收益率是指预期年化收益率。需要注意的是,虽然公式看起来很简单,计算起来其实并不容易。原因就是预期收益率和波动率其实是无法准确得知的。我们只能用统计方法去估计这两个值。估计的方法有很多种,最简单的方法就是计算历史年化收益率和其标准差。然而,即使是同一种方法,针对不同周期算出来的结果也可能差别很大,从而产生误导。这里举个例子来说明一下。我们先生成一组收益率数据:import pandas as pd
import numpy as np
year_list=[]
month_list=[]
rtn_list=[]
# 生成对数收益率,以半年为周期
for year in range(2006,2017):
for month in [6,12]:
year_list.append(year)
month_list.append(month)
rtn=round((-1)**(month/6)*(month/6/10),3)+(np.random.random()-0.5)*0.1
rtn_list.append(rtn)
# 生成半年为周期的收益率df
df=pd.DataFrame()
df['year']=year_list
df['month']=month_list
df['rtn']=rtn_list
这组收益率是对数收益率,。从2006年到2016年,以半年为频率,总共22个数据点。计算其夏普比率:round(df['rtn'].mean()/df['rtn'].std()*np.sqrt(2),3)
结果是:0.495由于我们要计算的是年化的值,所以收益率要乘以2,波动率要乘以(一年是半年的2倍)。现在我们把数据变换成以年为频率的收益率。使用groupby方法:# 生成每年的收益数据df_year(对数收益率可以直接相加)
df_year=df.groupby(['year']).sum()
del df_year['month']
计算其夏普比率:round(df_year['rtn'].mean()/df_year['rtn'].std(),3)
得到的结果是:2.205可以看到,同样的收益率数据,使用不同周期,计算出来的结果差距非常大。一般来说,周期频率越小,越难以保持收益稳定,每天都盈利比每年都盈利困难太多了。我们可以想象一个极端情况,10年中,每年的收益都是10%,夏普值就是无穷大,因为收益完全稳定,没有任何波动,然而每月的收益又不完全相同,所以从每月的收益率来看,夏普值并不是无穷大。所以在看Sharpe值的时候,一定要留意这个Sharpe值的计算方式,否则很容易产生误判。自己计算的话,并没有强行的标准,只是有两点要注意。一是要结合自己的实际,比如高频策略当然得用日收益率,每周调仓的策略可以用周收益率。二是对比策略优劣的时候,周期要一致,比如对比每日调仓的策略和每月调仓的策略,一定要换算到同一个周期上,才有可比性。