私募基金数量化绩效评价体系(七)-如何动态回测图?

量化小白Literacy
6062021-09-29 15:38
好投课代表敲重点啦!!!上期我们介绍了Hurst指数的算法实现,本期我们聊聊动态回撤图。动态回撤图的作用不容小视,一般而言看基金的净值走势我们可以得出绝对收益以及超额收益等数据,但对基金净值走势的过程分析很难有直观的感觉,这一点需要借助动态回撤图的分析。

作者: 量化小白Literacy

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


今天又要开始连载啦!上期我们介绍了Hurst指数的算法实现,本期我们聊聊动态回撤图。

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

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

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

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

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

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

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

首先普及一下动态回撤的基本概念和如何应用动态回撤来分析基金的特征。

我们经常在各类基金评价网站上或者在Choice以及Wind等金融终端查看某只产品的业绩表现时,会看到产品净值走势图(其中部分会叠加了基准策略的走势以及市场基准的走势),如下图为某个私募基金产品从2017年6月23日到2021年8月6日的净值走势,叠加绘制了中证500指数的走势以及策略基准(此处示例基金为FOF基金,因此策略基准我们使用了朝阳永续组合基金典型指数作为策略基准),方便进行多个维度的比较。

下图中下半部分为动态回测图,何为动态回测?通俗地讲就是在任何一点买入基金后,随着时间的推移可能会面临的本金损失率即亏损比例,具体的计算范式可以参考本公众号在《私募基金数量化绩效评价体系(二)风险类指标》中所做的介绍。

动态回撤图的作用不容小视,一般而言看基金的净值走势我们可以得出绝对收益以及超额收益等数据,但对基金净值走势的过程分析很难有直观的感觉,这一点需要借助动态回撤图的分析。

通过动态回测图我们可以直观地发现以下几个问题:

1、当基金的动态回撤回归零轴上时,说明基金净值此时达到前期的高点,在0轴上保持水平时,说明基金净值正在不断创新高。

2、我们可以动态的回顾在任何时点买入该基金后,随着时间的推移面临的亏损幅度。

3、产品的最大回撤发生在什么时候,最大回撤值是多少?对应着产品净值此时会有一个大幅的回调,此时结合策略、市场基准走势进行更深入的原因分析。

4、产品净值的恢复期有多久,即发生了比较大的回撤后,基金需要多久才能创新高,此时的动态回撤值为0,也就是投资发生亏损后需要多久才能收复失地?

5、管理人策略的稳健性,如果净值恢复期是比较有规律稳定的,说明管理人的策略比较稳定,或者对市场的适应性比较好。

6、动态回撤值的大小,如果基金保持着比较好的回撤规律,但回撤值比较大,这样的基金持有感觉是比较差的,但如果基金回撤值比较小,规律稳定,说明基金的净值波动较小,且经过不断的上涨及小幅回调,净值一直创新高。

图片

一个现实问题。如果我们研究是的公募基金那么获取以上净值走势图和动态回撤图很简单,如果我们研究的是私募基金且这只基金的净值并没有在私募排排网或者朝阳永续之类的网站上发布,那么如何绘制动态回测图呢,这样的现象非常常见。

下面给大家送福利,小编已经使用python完成了代码的编写,需要的朋友可以直接修改使用,轻轻松松搞定动态回撤图,且标记最大回撤(这个稍微复杂一点)。

代码如下:

def max_drawdown(df):  # 定义最大回撤函数,减少重复工作
    md = ((df.cummax() - df) / df.cummax()).max()
        return round(md, 3)
    draw = max_drawdown(df)    #最大回撤的绝对值,为正数
draw=-draw     #负数表示的最大回撤
draw2=draw     #负数表示的最大回撤
draw=draw.map(lambda x:format(x,'.2%')) #最大回撤值,百分比负数显示
md_date = ((df.cummax() - df) / df.cummax()).idxmax()  #出现最大回撤的日期
#计算动态回撤
md_float= ((df.cummax() - df) / df.cummax()) #df为包括日期索引和净值数据的dataframe
md_float=-md_float    #用负数表示最大回撤
txt=['最大回撤',md_date[0].strftime("%Y/%m/%d"),draw[0]]  #动态回撤中的图例显示
#--------图片绘制部分--------------#
ax2 = plt.subplot(212)
plt.plot(md_float,linewidth=3)
plt.annotate(txt, xy=(md_date,draw2), xytext=(md_date,draw2),arrowprops=dict(facecolor='black', shrink=0.05))
plt.xticks(color='gray', rotation=45)
def to_percent(temp, position):
  return '%4.2f'%(100*temp) + '%'
  plt.gca().yaxis.set_major_formatter(FuncFormatter(to_percent))
ax2.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))
timedelta = (md_float.index[-1]-md_float.index[0])/60
plt.xticks(mdate.drange(md_float.index[0], md_float.index[-1], timedelta))
plt.grid(axis = 'y', color = 'lightgray', linestyle = '-', linewidth = 0.5)
plt.title("动态回撤曲线",fontsize=35)
plt.xlabel("日期",fontsize=25)
plt.ylabel("动态回撤",fontsize=25)
plt.show()

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

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

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

推荐阅读

0
0

评论

你来谈谈?
发表

联系我们

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