【答读者问46】一场由夏普率引发的乱斗(backtrader,pyfolio和聚宽都是怎么计算夏普率的?)
作者:yunjinqi   类别:    日期:2022-03-20 12:39:20    阅读:1748 次   消耗积分:0 分    

在很早之前的文章中,对绩效分析的指标夏普率做过一些简单的探索,对比了不同平台上夏普率的计算方式,这次再次深入探索一下,为啥各个平台的夏普率的结果存在很大差别。这次主要探索backtrader、pyfolio和聚宽,对于夏普率如何计算。
多变的夏普率(一)(2022-03-18更新)
使用Python计算omega指标
omega指标与sharpe_ratio之间的关系
【干货】使用backtrader计算omega指标

聚宽的夏普率计算方式

这是一个读者找到并提供给我的
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述对于上一篇文章的可转债策略,最后输出了一个每日结束的时候的账户价值,尝试用这个相对比较真实的值按照聚宽的算法计算夏普率。

data = pd.read_csv("/home/yun/backtrader专栏/77讲/可转债的测试结果.csv",index_col=0)# 计算年化收益率value_list = list(data['value'])total_return = value_list[-1]/value_list[0]-1total_annual_return = (1+total_return)**(250/len(data))-1# 计算收益率data['rets'] = data['value'].pct_change()data = data.dropna()# 计算波动avg_ret = data['rets'].mean()ret_std = (sum([(i-avg_ret)**2 for i in data['rets']])*250/len(data))**0.5jq_sharpe = (total_annual_return - 0.04)/ret_stdprint(f"计算出来的聚宽的夏普率为:{jq_sharpe}")# 计算出来的聚宽的夏普率为:3.2647287122066317

backtrader的夏普率计算方式

backtrader计算夏普率的方式 写在了文件sharpe.py中,在这篇文章【backtrader源代码解析17】sharpe.py源代码解析(backtrader计算夏普率的方式)中对backtrader夏普率计算的源代码进行了解析,感兴趣可以参考下。
本文尝试脱离backtrader的环境,直接按照backtrader的逻辑计算下夏普率:

# backtrader夏普率的计算方式# 先把年化的无风险收益率降级到每日的无风险收益率,然后计算每日的超额收益率,计算每日超额收益率的平均值和标准差,# 用平均值除以标准差就计算得到日夏普率,然后转化成年夏普率day_risk_free_rate = (1+0.04)**(1/250)-1data['day_excess_rate'] = data['rets']-day_risk_free_rate
avg_day_excess_rate = data['day_excess_rate'].mean()std_day_excess_rate = data['day_excess_rate'].std()day_sharpe = avg_day_excess_rate/std_day_excess_rate
year_sharpe = day_sharpe*250**0.5print(f"按照backtrader的方法计算出来的夏普率为:{year_sharpe}")# 按照backtrader的方法计算出来的夏普率为:2.7833366546477807

pyfolio的夏普率计算方式

pyfolio的夏普率的计算方式是直接调用的empyrical的夏普率计算函数,我们直接调用这个函数来计算夏普率,看差别会有多少

import empyrical as epfrom empyrical.periods import DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY
sharpe_ratio = ep.sharpe_ratio(data['rets'],
                 risk_free=day_risk_free_rate,
                 period=DAILY,
                 annualization=None)print(f"pyfolio计算的夏普率为:{sharpe_ratio}")  # pyfolio计算的夏普率为:2.794447823197053

总结

相对情况下,聚宽计算的夏普率比较虚高一些,backtrader和pyfolio计算的夏普率比较接近。下一篇来点好玩的,尝试用蒙特卡洛模拟的思想,看看哪种方式计算的夏普率更稳定一些。


版权所有,转载本站文章请注明出处:云子量化, http://www.woniunote.com/article/96
上一篇:【答读者问45】谈一谈扩展backtrader中用于回测数据的列的问题(入门级别难度)
下一篇:【答读者问47】一场由夏普率引发的乱斗(backtrader和joinquant计算夏普率的方式哪一种更稳定?)