私募基金数量化绩效评价体系(五)-Stutzer index的计算

量化小白Literacy
7122021-09-15 15:25
好投课代表敲重点啦!!!本期首先介绍一下Stutzer index的算法实现。

作者: 量化小白Literacy

题图: 量化小白Literacy微信公众号


在前几期我们介绍了主要的风险类、收益类以及风险调整收益指标的基本概念以及计算公式,原定的连载本已经结束,近期不少朋友关注后询问一些“看来起比较复杂”的指标如何使用python来实现呢?接下来,我们会对大家提问比较多的几个指标的算法进行介绍,本期首先介绍一下Stutzer index的算法实现。若有疑问和需要交流,关注本公众号回复“好友”加作者微信交流。

Stutzer index的算法目前找遍全网也没有使用python实现其算法的公开资料,如果需要转载请说明一下来源哦,关于该指标的概念及计算公式的介绍我们在私募基金数量化绩效评价体系(三)风险调整收益中已经进行了重点介绍,感兴趣的可前去阅读,此处就此省略,直接看算法代码。

#计算Stutzer Index,考虑到基金收益分布的非正态属性对shapre ratio进行的调整
#by 量化小白Literacy
#首先通过tushare获取指数的周度收益率
import pandas as pd
import numpy as np
import tushare as ts
pro = ts.pro_api('') #填充为个人的TOKEN
#获取指数的周度收益率,设置sleep避免频繁调取报错
#定义指数行情获取函数,ts_code为指数代码,比如中证500'000905.SH'
def get_index_300(ts_code='', fields='', start_date='', end_date='' , retry_count=3, pause=2):
    for _ in range(retry_count):
            try:
                    df=pro.index_weekly(ts_code=ts_code,fields=fields,start_date=start_date,end_date=end_date)
                    except:
                    time.sleep(pause)
                    else:
                    return df
            #获取指数周度涨跌幅,将起始日设定为2015年1月开始,最大程度的获取与所有产品能够匹配的数据
index_300=get_index_300(ts_code=index_code, fields='ts_code,trade_date,pct_chg',
                            start_date='20150101',
                                                        end_date='20210915',retry_count=3, pause=2)
                            index_300['trade_date'] = pd.to_datetime(index_300['trade_date'])
index_300.set_index('trade_date', inplace=True)
index_300.sort_index(inplace=True)
index_week_pct=index_300['pct_chg'] 
index_week_pct = index_week_pct.resample('W').last()  #resample为每周末
index_week_pct=index_week_pct.to_frame()            # 指数周收益率数据
#df为包含日期和周净值两列的数据的DataFrame,inter为迭代次数,shcm_start_all,shcm_end_all为时间区间的首尾
def Stutzer(df,inter,shcm_start_all,shcm_end_all):
    df_fund=df.pct_change() #产品的周度收益率
        df_stutzer=pd.merge(df_fund,index_week_pct,left_index=True,right_index=True,how='inner')#合并数据
        df_stutzer.dropna(inplace=True)
        df_stutzer=df_stutzer.loc[shcm_start_all:shcm_end_all]
        Largest=0
        df_stutzer['pn']=(1+df_stutzer[df_stutzer.columns.values[0]]).cumprod()
        df_stutzer['bn']=(1+df_stutzer['pct_chg']).cumprod()
        df_stutzer['R'] = np.nan
        df_stutzer['S'] = np.nan
        N=len(df_stutzer)
        for n in range(0,inter+1,5):
            df_stutzer['Q']=-1*(df_stutzer['pn']/df_stutzer['bn'])**(-n)
                for i in range(N):
                    df_stutzer['R'].iloc[i]=df_stutzer['Q'].iloc[0:i+1].mean()
                    for i in range(N):
                    df_stutzer['S'].iloc[i] = -np.log(-1 * df_stutzer['R'].iloc[i]) /(i+1)
                    d=df_stutzer['S'][-1]
                if d>Largest:
                    Largest=d
                Stutzer = 100 * Largest
        return Stutzer
    

通过以上代码大家既可以实现该指数的计算了。接下来一个问题Stutzer index能否对于基金的筛选有一定的判断能力呢?是否可以通过对历史数据的研究筛选出在未来表现相对较好的基金呢?这个问题留待后续给大家解答。


版权声明:文章版权归原作者所有,部分文章由作者授权本平台发布,若有其他不妥之处的可与小编联系。

免责声明:
您在阅读本内容或附件时,即表明您已事先接受以下“免责声明”之所载条款:
1、本文内容源于作者对于所获取数据的研究分析,本网站对这些信息的准确性和完整性不作任何保证,对由于该等问题产生的一切责任,本网站概不承担;阅读与私募基金相关内容前,请确认您符合私募基金合格投资者条件。
2、文件中所提供的信息尽可能保证可靠、准确和完整,但并不保证报告所述信息的准确性和完整性;亦不能作为投资决策的依据,不能作为道义的、责任的和法律的依据或者凭证。
3、对于本文以及文件中所提供信息所导致的任何直接的或者间接的投资盈亏后果不承担任何责任;本文以及文件发送对象仅限持有相关产品的客户使用,未经授权,请勿对该材料复制或传播。侵删!
4、所有阅读并从本文相关链接中下载文件的行为,均视为当事人无异议接受上述免责条款,并主动放弃所有与本文和文件中所有相关人员的一切追诉权。

0
好投汇
第一时间获取行业新鲜资讯和深度商业分析,请在微信公众账号中搜索「好投汇」,或用手机扫描左方二维码,即可获得好投汇每日精华内容推送和最优搜索体验,并参与编辑活动。

推荐阅读

0
0

评论

你来谈谈?
发表

联系我们

邮箱 :help@haotouxt.com
电话 :0592-5588692
地址 :福建省厦门市湖里区航空商务广场7号楼10F
好投汇微信订阅号
扫一扫
关注好投汇微信订阅号
Copyright © 2017-2025, All Rights Reserved 闽ICP备19018471号-6