请选择 进入手机版 | 继续访问电脑版
楼主: 炸酱面好吃
10690 9

[统计套利] 求问怎么用python求夏普比率和最大回撤率呢 [推广有奖]

  • 0关注
  • 0粉丝

小学生

35%

还不是VIP/贵宾

-

威望
0
论坛币
2 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
83 点
帖子
2
精华
0
在线时间
10 小时
注册时间
2018-1-19
最后登录
2019-12-1

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
现在有一年的每天的指数,谢谢啦!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 夏普比率

xugonglei 发表于 2018-1-20 13:10:47 |显示全部楼层 |坛友微信交流群
直接根据定义算就好了,其中Sharpe Ratio很简单,最大回撤的话,思路就是寻找每一个点到之后最低点的下降幅度,然后求这些幅度里最大的那个,就是最大回撤。
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
fantuanxiaot + 8 + 8 + 2 + 2 + 2 精彩帖子

总评分: 经验 + 8  论坛币 + 8  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

使用道具

weitingkoala 发表于 2018-1-22 13:13:01 |显示全部楼层 |坛友微信交流群
pip install empyrical
拿走不谢

使用道具

pandas expanding max 就可以做最大回撤,夏普简单就不说了

使用道具

sulight 学生认证  发表于 2018-2-19 14:27:23 |显示全部楼层 |坛友微信交流群
学习了,很好!

使用道具

syz604 发表于 2018-2-28 16:33:59 |显示全部楼层 |坛友微信交流群
xugonglei 发表于 2018-1-20 13:10
直接根据定义算就好了,其中Sharpe Ratio很简单,最大回撤的话,思路就是寻找每一个点到之后最低点的下降幅 ...
只有历史数据的话,最大回撤应该这样说比较恰当:寻找每一个点 相较于 之前最高点的下降幅度,然后求这些幅度里最大的那个。

使用道具

xugonglei 发表于 2018-3-2 09:01:53 |显示全部楼层 |坛友微信交流群
syz604 发表于 2018-2-28 16:33
只有历史数据的话,最大回撤应该这样说比较恰当:寻找每一个点 相较于 之前最高点的下降幅度,然后求这些 ...

使用道具

shzbzm 发表于 2018-7-4 20:14:27 |显示全部楼层 |坛友微信交流群
作者:知乎用户
链接: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值的计算方式,否则很容易产生误判。自己计算的话,并没有强行的标准,只是有两点要注意。一是要结合自己的实际,比如高频策略当然得用日收益率,每周调仓的策略可以用周收益率。二是对比策略优劣的时候,周期要一致,比如对比每日调仓的策略和每月调仓的策略,一定要换算到同一个周期上,才有可比性。

使用道具

shzbzm 发表于 2018-7-4 20:15:23 |显示全部楼层 |坛友微信交流群
夏普比率的计算还是需要好好想想得.

使用道具

shzbzm 发表于 2018-7-4 20:16:44 |显示全部楼层 |坛友微信交流群

同一个资产,不同周期频率收益率,算出来的夏普值,根本就不是一回事!比如用每日的收益率算夏普值,和用每年的收益率算夏普,就不是一回事。而且在计算的时候,收益率和波动率周期是要一致的,你不能用日线数据算收益率,然后用周线算波动率。在题主的问题里面,其实是把周期弄混了,如果你要按三天一个样本来算收益,那么必须也要按三天一个样本的频率来算波动率,然而,这里按三天周期的话,就只有一个样本,是无法计算波动率的。所以只能按每日的收益来进行计算。下面是最近写的一篇详细解释文,用了一个实际例子来说明(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值的计算方式,否则很容易产生误判。自己计算的话,并没有强行的标准,只是有两点要注意。一是要结合自己的实际,比如高频策略当然得用日收益率,每周调仓的策略可以用周收益率。二是对比策略优劣的时候,周期要一致,比如对比每日调仓的策略和每月调仓的策略,一定要换算到同一个周期上,才有可比性。
已有 1 人评分论坛币 收起 理由
admin_kefu + 30 热心帮助其他会员

总评分: 论坛币 + 30   查看全部评分

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 06:49