夏普比率和最大回撤到底怎么计算?

我知道公式是怎么回事。。。 如题,我给一个极端例子,三个交易日。 我九月一日一大早进场,带了100万,九月1号亏了99万9千9百9十9。 九月二号一大…
关注者
1,428
被浏览
728,551

34 个回答

这个问题问的非常好,这是是夏普值计算中最容易出现的误区之一。

一句话解释就是:

同一个资产,不同周期频率收益率,算出来的夏普值,根本就不是一回事!

比如用每日的收益率算夏普值,和用每年的收益率算夏普,就不是一回事。而且在计算的时候,收益率和波动率周期是要一致的,你不能用日线数据算收益率,然后用周线算波动率。

在题主的问题里面,其实是把周期弄混了,如果你要按三天一个样本来算收益,那么必须也要按三天一个样本的频率来算波动率,然而,这里按三天周期的话,就只有一个样本,是无法计算波动率的。所以只能按每日的收益来进行计算。

下面是最近写的一篇详细解释文,用了一个实际例子来说明(Python语言)。

---------------------------------------------------------我是分割线---------------------------------------------------------

衡量基金收益的一个有名的标准就是夏普比率(Sharpe ratio)。有投资常识的人都明白,投资光看收益是不够的,还要看承受的风险,也就是收益风险比。夏普比率描述的正是这个概念,即每承受一单位的总风险,会产生多少超额的报酬。用数学公式描述就是:

SharpeRatio=(E(R_p )-R_f)/\sigma _p

其中,

E(R_p ):投资组合预期收益率

R_f:无风险利率

\sigma _p:投资组合的波动率(亦即投资组合的风险)

上面三个值一般是指年化后的值,比如预期收益率是指预期年化收益率。

需要注意的是,虽然公式看起来很简单,计算起来其实并不容易。原因就是预期收益率和波动率其实是无法准确得知的。我们只能用统计方法去估计这两个值。估计的方法有很多种,最简单的方法就是计算历史年化收益率和其标准差。

然而,即使是同一种方法,针对不同周期算出来的结果也可能差别很大,从而产生误导。这里举个例子来说明一下。我们先生成一组收益率数据:

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,波动率要乘以\sqrt{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值的计算方式,否则很容易产生误判。

自己计算的话,并没有强行的标准,只是有两点要注意。

一是要结合自己的实际,比如高频策略当然得用日收益率,每周调仓的策略可以用周收益率。二是对比策略优劣的时候,周期要一致,比如对比每日调仓的策略和每月调仓的策略,一定要换算到同一个周期上,才有可比性。

— The End —

微信公众号:探长N次方

详细可见: vitu.ai/help

  • Annualized Returns: 策略年化收益率。表示投资期限为一年的预期收益率。具体计算方式为 (策略最终价值 / 策略初始价值 - 1) / 回测交易日数量 × 250
  • Benchmark Returns:参考标准年化收益率。具体计算方式为 (参考标准最终指数 / 参考标准初始指数 - 1) / 回测交易日数量 × 250 。
  • Alpha:阿尔法。具体计算方式为 (策略年化收益 - 无风险收益) - beta × (参考标准年化收益 - 无风险收益),这里的无风险收益指的是中国固定利率国债收益率曲线上10年期国债的年化到期收益率。
  • Beta:贝塔。具体计算方法为 策略每日收益与参考标准每日收益的协方差 / 参考标准每日收益的方差 。
  • Sharpe Ratio:夏普比率。表示每承受一单位总风险,会产生多少的超额报酬。具体计算方法为 (策略年化收益率 - 回测起始交易日的无风险利率) / 策略收益波动率 。
  • Volatility:策略收益波动率。用来测量资产的风险性。具体计算方法为 策略每日收益的年化标准差 。
  • Information Ratio:信息比率。衡量超额风险带来的超额收益。具体计算方法为 (策略每日收益 - 参考标准每日收益)的年化均值 / 年化标准差 。
  • Max Drawdown:最大回撤。描述策略可能出现的最糟糕的情况。具体计算方法为 max(1 - 策略当日价值 / 当日之前虚拟账户最高价值)

可以关注一下这个新崛起的品牌Vitu.AI, 专注数字资产,Vitu.ai - 数据从不说谎 - 区块链的世界也不例外专业金工团队、开源友好社区、数字资产现货期货衍生品回测一站式服务。