作者: 量化小白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能否对于基金的筛选有一定的判断能力呢?是否可以通过对历史数据的研究筛选出在未来表现相对较好的基金呢?这个问题留待后续给大家解答。
版权声明:文章版权归原作者所有,部分文章由作者授权本平台发布,若有其他不妥之处的可与小编联系。