私募基金数量化绩效评价体系(六)-Hurst指数的计算

量化小白Literacy
6292021-09-18 15:33
好投课代表敲重点啦!!!在前几期我们介绍了主要的风险类、收益类以及风险调整收益指标的基本概念以及计算公式,原定的连载本已经结束,近期不少朋友关注后询问一些“看来起比较复杂”的指标如何使用python来实现呢?接下来,我们会对大家提问比较多的几个指标的算法进行介绍,上期介绍了Stutzer index指标的算法实现,本期介绍一下Hurst指数的算法实现。

作者: 量化小白Literacy

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


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

若有疑问和需要交流,关注本公众号回复“好友”加作者微信交流。

前期连载内容如下,可查看参考:

私募基金数量化绩效评价体系(一)

私募基金数量化绩效评价体系(二)风险类指标

私募基金数量化绩效评价体系(三)风险调整收益

私募基金数量化绩效评价体系(四)选股择时及业绩持续性指标

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

Hurst指数的定义以及相应计算公式如下:

图片

图片来自:

私募基金数量化绩效评价体系(四)选股择时及业绩持续性指标

根据以上计算过程,实现代码如下:

# Hurst指数函数
# 参考https://github.com/RyanWangZf/Hurst-exponent-R-S-analysis-进行修正,
# 修正的内容包括数据修正、算法修正、根据基金的对数收益率的计算修正等
# 修正后的函数解决净值不连续以及缺失值问题,防范出现计算无法收敛的情况
import numpy as np
import pandas as pd
def Hurst(df):  #输入数据为dataframe,含日期列和净值列,其中日期列设置为时间索引
    ts = np.log(df / df.shift(1)) #计算对数收益率
        ts  = ts[1:]
        ts = ts.loc[:, ts.columns.values[0]]
        ts = ts.values
        ts = ts.tolist()
        temp=[]
        for j,p in enumerate(ts):
            if p!=0:
                    temp.append(j)
                del ts[0:temp[0]]   #解决后续可能出现的无法收敛问题,因为数据中会出现inf值 
        N = len(ts)
        if N < 20:  # 时间序列样本太少时抛出错误
            return np.nan
            else:
            max_k = int(np.floor(N / 2)) # 每个子区间内样本的最大数量,即n的最大取值,n最大时候样本分为两组
                R_S_dict = []
                for k in range(10, max_k + 1):  #n从10开始,即每组10个样本,到n取每组max_k个样本
                    R, S = 0, 0
                        R_S = 0
                        # split ts into subsets
                        subset_list = [ts[i:i + k] for i in range(0, N, k)]
                        if np.mod(N, k) > 0:
                            subset_list.pop()
                                # tail = subset_list.pop()
                                # subset_list[-1].extend(tail)
                            # calc mean of every subset
                        mean_list = [np.mean(x) for x in subset_list]
                        for i in range(len(subset_list)):
                            cumsum_list = pd.Series(subset_list[i] - mean_list[i]).cumsum()
                                R = max(cumsum_list) - min(cumsum_list)
                                S = np.std(subset_list[i])
                                R_S_temp = R/S
                                R_S = R_S+R_S_temp
                            R_S=R_S/len(subset_list)
                        R_S_dict.append({"R_S": R_S, "n": k})
                    log_R_S = []
                log_n = []
                for i in range(len(R_S_dict)):
                    log_R_S.append(np.log(R_S_dict[i]["R_S"]))
                        log_n.append(np.log(R_S_dict[i]["n"]))
                    if any(np.isnan(log_R_S)):
                    return np.nan
                    else:
                    Hurst_exponent = np.polyfit(log_n, log_R_S, 1)[0]
                        return Hurst_exponent
            

根据以上函数就可以很方便地计算Hurst指数啦。

另外,最近有一些朋友询问有没有方便的基金筛选方法,以及根据某个条件筛选后进行指定周期的业绩回测,这一点,小编在股票型量化私募基金的评价及筛选体系初探有所提到,也通过python进行了实现,感兴趣的朋友可以加作者微信交流。


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

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

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

推荐阅读

0
0

评论

你来谈谈?
发表

联系我们

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