作者: 量化小白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进行了实现,感兴趣的朋友可以加作者微信交流。
版权声明:文章版权归原作者所有,部分文章由作者授权本平台发布,若有其他不妥之处的可与小编联系。