夏普比率和最大回撤公式推导及代码实现

一、夏普比率

夏普比率是衡量一个策略的关键指标,它衡量的是承担每一单位波动的风险,可以多赚取多少的超额收益。

因为要衡量波动量,因此如果只知道初期资产和末期资产,是无法计算夏普比率的,必须知道每日的收益率或者每日对应的收益额。

可以假设年化无风险利率为2%,那么按照A股来说,假设1年252个交易日,则日无风险利率为0.02/252。也有很多人为了省事直接将无风险利率设为0,这个看自身情况设定。

夏普比率一般计算年化夏普比率,也可以计算月度夏普比率等。

夏普比率sharpratio=(策略的预期收益率−无风险利率)/策略收益率的标准差 夏普比率sharp ratio=(策略的预期收益率-无风险利率)/策略收益率的标准差 夏普比率sharpratio=(策略的预期收益率−无风险利率)/策略收益率的标准差

注意:

年化夏普比率=日度夏普比率 ∗252* \sqrt{252}∗252

年化夏普比率=月度夏普比率 ∗12* \sqrt{12}∗12

解释下这是怎么来的呢?

假设说我们已经得到了日超额收益率 序列xtx_txt,注意这里是已经减去日无风险利率得到的日超额收益率序列。

通过xtx_txt计算得到的均值和标准差为μ\muμ和σ\sigmaσ。那么,
年化夏普比率=年化超额收益率平均值年化超额收益率标准差=μ∗252σ∗252=日度夏普比率∗252 年化夏普比率=\frac{年化超额收益率平均值}{年化超额收益率标准差}\\=\frac{\mu*252}{\sigma*\sqrt{252}}\\=日度夏普比率 *\sqrt{252} 年化夏普比率=年化超额收益率标准差年化超额收益率平均值=σ∗252 μ∗252=日度夏普比率∗252

总结

假设已经得到每日的收益率序列,要计算年度夏普比率,共分为三步:

1、设定好年化无风险利率,将日收益率序列-日无风险收益率序列=日超额收益率序列;

2、计算日超额收益率序列的均值和标准差;

3、年化夏普比率=日度夏普比率 ∗252* \sqrt{252}∗252

二、最大回撤

最大回撤是指从最高点跌下来时,跌的最惨有多惨。

假设已经得到每日的收益率序列,计算最大回撤的四个步骤:

1、将每日的收益率序列转换为每日的历史总收益率序列;

2、遍历求出每日的目前为止最高历史收益率;

3、计算每日相对历史最高点的回撤比例;

4、在所有回撤中找到最惨的那一天,那一天的回撤比例即为所求的最大回撤;

三、代码实现

这里使用一个最简单的策略,策略就是买入沪深300ETF,然后放着10年不动,看这个策略的年化夏普比率和最大回撤。这里使用tushare来获取行情数据。

tushare介绍

tushare是一个比较常用的开源数据平台,pro版本对于在校大学生是免费的。

注意,tushare对于个股,ETF数据,指数数据的获取方式是不一样的。分别为pro.daily(),pro.fund_daily(),pro.index_daily(),如果混用了,会返回空值。

python代码实现

python 复制代码
import tushare as ts

def sharp_ratio_test():
    pro = ts.pro_api('your token')

    hushen_df = pro.fund_daily(ts_code='510300.SH', start_date='20150101', end_date='20251001')
    hushen_df = hushen_df.sort_values(by='trade_date', ascending=True)  # 先将df中的数据进行倒序排列,使得日期从前到后
    hushen_df['daily_rate'] = 0  # 每日的收益率,从第1日买入,第2日开始有收益
    for i in range(1, hushen_df.shape[0]):
        hushen_df['daily_rate'][i] = (hushen_df['close'][i] - hushen_df['close'][i - 1]) / hushen_df['close'][i - 1]
    hushen_df['daily_hist_rate'] = 0  # 每日的历史总收益率
    for i in range(1, hushen_df.shape[0]):
        hushen_df['daily_hist_rate'][i] = (hushen_df['close'][i] - hushen_df['close'][0]) / hushen_df['close'][0]
    # 计算夏普比率
    rf_annual = 0.02  # 年化无风险利率
    rf_daily = rf_annual / 252  # 日无风险利率
    hushen_df['daily_super_rate'] = 0  # 每日的日超额总收益率
    for i in range(1, hushen_df.shape[0]):
        hushen_df['daily_super_rate'][i] = hushen_df['daily_rate'][i] - rf_daily
    mu = hushen_df['daily_super_rate'].mean() #注意,这2行代码可以再微调,从第2日开始
    sigma = hushen_df['daily_super_rate'].std() #这里有个除以n-1和除以n的区别,可以微调
    sharp_ratio = mu / sigma * (252 ** 0.5)
    print("sharp ratio:", sharp_ratio)

    # 计算最大回撤
    equity = 1 + hushen_df['daily_hist_rate']  # 每日的净资产是初始资产的多少倍
    roll_max = equity.cummax()
    draw_down = equity / roll_max - 1
    max_draw_down = draw_down.min()
    print("max draw down:", max_draw_down)


if __name__ == '__main__':
    sharp_ratio_test()

按照上述代码,可得到最后的结果

python 复制代码
sharp ratio: -0.16625517304850126
max draw down: -0.45100740485620805
相关推荐
是Yu欸6 小时前
AI跨模态鉴伪技术实测
人工智能·安全·ai作画·aigc·合合信息·ai-native·waic
声网6 小时前
Vercel 发布 AI SDK 5,引入语音 API;Ollama 新版本支持多模态交互 丨日报
人工智能
蓝速科技6 小时前
蓝速科技 AI 双屏翻译机:私模工艺与 AB 麦算法实测解析
人工智能·科技
声网6 小时前
阿里小号停止续费,10 月底下架 App;音频技术公司 Bragi 联合 OpenAI 为第三方耳机引入 GPT 语音助手丨日报
人工智能
人民新视野6 小时前
AI数字人公司厂商让数字人导览讲解对话成为智慧展厅展馆标配
人工智能
liguojun20257 小时前
智慧文体旅系统选哪家?豆米跳跳十年技术沉淀支持源码交付
java·大数据·人工智能·物联网·1024程序员节
超自然祈祷7 小时前
科技在发展,我们所做工作的范式也在变——Software1.0、2.0、3.0...
人工智能·科技
大强同学7 小时前
Kimi Code CLI
人工智能·agent·claude·skill·kimi code cli
深度研习笔记7 小时前
OpenCV工业视觉实战10|违规语音播报+弹窗告警+重复告警过滤,打造智能声光预警系统(项目加分必备)
人工智能·opencv·计算机视觉
湘美书院--湘美谈教育7 小时前
湘美书院主理人:AI世代武侠小说的基本特征与蕴意
大数据·人工智能·深度学习·机器学习·生活