计算风险指标:最大回撤、计算风险收益指标:夏普比率、利用最大回撤和夏普比筛选基金、比较3只股票的夏普指数
接着上一次https://www.cnblogs.com/webor2006/p/15240950.html的量化交易往下学习。
计算风险指标:最大回撤
什么是最大回撤?
在前几天跟一朋友聊股票时,刚好就聊到了“最大回撤”这个话题:
从这字面意思就可以大概知道应该是指一段周期股票的最大跌幅是多少吧,下面看一下它专业的定义:
最大回撤是指在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值,是一个非常重要的风险指标。
如何计算最大回撤?
上面的定义是不是有点抽象?下面则来看下如何来计算最大回撤这个指标的值,这里先来看Corporate Finance Institute(反正是一家国外的专业金融机构)对于最大回撤在这篇【https://corporatefinanceinstitute.com/resources/knowledge/trading-investing/maximum-drawdown/】文章中所定义的一张图:
它可以作为一支基金、股票大盘、个股的表现,根据上面的定义,需要“选定周期”对吧:
好,这里在图中来选定一下:
指定周期之后,咱们就可以来计算在这周期内最大的回撤值了,那如何计算呢?根据这篇https://www.investopedia.com/terms/m/maximum-drawdown-mdd.asp的说明,最大回撤的公式如下:
而Trough Value是指周期内最低的值,Peak Value是指周期内最高的值,那有了这个公式之后,咱们就可以基于此图进行一下最大回撤的计算了,先来确定最高值和最低值,如下:
所以,此时这个周期的最大回撤就是:
实际计算出来应该是-50%,但是实际说到最大回撤时是不会把这个负号给说进去的,其实就像我们说股票跌了多少一样。从实际含义来看,最大回撤描述的就是你购买一款理财产品之后亏损最糟糕的一个比例情况。
最大回撤的价值?
那。。对于最大回撤这个风险指标在实际我们理财中能发挥啥价值呢?这里举个粟子:
假设这里有两款理财产品【可以想像成是基金、债券、股票等】,它们两者从收益率来看都差不多:
但是!!!它们两者在最大回撤数据上是不一样的,比如:
那很明显产品B的最大回撤比产品A的要少,那是不是说产品B最大的跌幅是要比产品A要少的,也就是它更加抗跌对吧?那当你知道最大加撤的意义之后,对于这两款理解产品你会选择哪一款呢?很明显选择产品B!!!因为大家都在跌时,产品B跌得最少,那对于我们来说是不是风险也更小一些,投资不是赌博,永远需要尽可能规避风险,所以最大回撤这个指标是一个风险指标。
实践:
接下来则回到python工程中来增加最大回撤的计算功能。
新建函数:
其计算思路这里用注释先标明一下:
选择时间周期:
也叫时间窗口,这里选择一年时间吧:
选择时间周期中的最大净值:
这里则需要使用到python的rolling函数了,关于它的介绍可以参考https://baijiahao.baidu.com/s?id=1622798772654712959&wfr=spider&for=pc,下面先来获取时间周期收盘价的最高值:
其中关于rolling函数的参数含义可以参考下图:
计算当天的回撤比:
现在已经有了峰值了,也就是:
接下来则就把时间窗口每一天的回撤比计算出来,然后最终再从这每天的回撤比中拿出最大的那个则为最终咱们要计算的最大回撤比了,所以先来计算每天的回撤比如下:
也就是我把每一天的收盘价当成是谷值,另外对于这样的公式可以简化一下:
选择时间周期内最大的回撤比,既最大回撤
这里又得要用到rolling函数了,如下:
为啥这里是用的min()呢?其实也很好理解,因为回撤比算出来是一个负数:
而负数最小,代表回撤的幅度越大对吧?比如-10%,-50%,那最大回撤比肯定是50%了,而-50肯定是小于-10的,所以这里需要明确一下。
不过,这里为了在之后的运行中看到各个计算详细,这里改一下目前的实现如下:
调用运行:
接下来则来调用运行一下,这里还是用平安银行股票为例,查看一下它指定周期的最大回撤情况:
这里为了便于观看,将字段过滤一下,都折行了:
为了来观察咱们计算的正确性,咱们将时间窗口改小一点,改为7天吧:
另外更改一下查询的起止时间:
运行,你会发现一个诡异的现象:
这是为啥呢?因为有个时间窗口,咱们现在不是定义的时间窗口是7天么?那么计算只会算7天内的最大净值,所以:
然后再来看一下最大回撤两列的数据:
貌似数据都一切正常,接下来咱们将时间窗口还是改为1年,然后使用可视化的方式展示出来,如下:
然后将统计的起始时间也加大几年:
运行如下:
所以利用这个最大回撤比数据可以让你对某一款的理财产品的风险有一个心里预期,其实像支付宝里面的每支基金都有最大回撤指标,比如:
点击进入在它的详情页面看这块:
再点进去就可以看到了:
计算风险收益指标:夏普比率
什么是夏普比率?
英文又叫Sharpe ratio,它衡量的是一项投资在对其调整风险后,相对于无风险资产的收益表现。在1996年,由威廉·F·夏普提出,美国金融经济学学者,曾在1990年获得过诺贝尔经济学奖。
如何计算夏普比率?
它的计算公式可以参考https://www.investopedia.com/terms/s/sharperatio.asp:
而各项因子的含义如下:
啥意思?这里分别来解读一下:
"return of portfolio" :投资回报率,也就是我们所期望投资回报率。
"risk-free rate": 无风险利率,它是指当你买入一个没有风险的资产所获得的回报,那啥叫“没有风险的资产”呢?最常见的就是国债,你咱们国内的它的年化回报在3%左右。
"standard deviation of the portfolio's excess return": 投资回报率标准差,它是一种离散指标,体现数据样本内部的差异性,它的计算公式如下:
比如说一支股票的收盘价,每个数据项就是指每天的收盘价, 然后用它减去所有收盘价的均值,得到每天收盘价绝对值的平方,再将所有这些值加起来,然后最后用总和除以整个数据项的个数,最后再开根号,关于标准差的数学概念这块百度百科:
其中用到了根号运算,关于这块也来复习一下:
可能对于怎么求根号有点忘了,没关系,看一下例子就明白了:
那既然这个是一个标准差,那如果一支股票或一个基金它的标准差非常大,代表啥意思呢?
标准差大,也就意味着股价的波动大,波动一大,那是不是意味着这个投资标的的风险也大,因为很不稳定。
意义:
那对于夏普比率整个式子计算出来的结果有啥含义呢?其实它代表的是“投资者额外承受的每一个单位风险所获得的额外收益”, 所以,夏普比率肯定是越大越好,因为越大越能说明该理财产品的收益是大于风险的,其实也很理解:
当夏普比率如果是大于1的情况下,是不是收益就大于风险了?
实践:
在了解了概念之后,接下来则回到python的代码中来看下如何计算一支股票的夏普值。
思路整理:
计算回报率均值:
对于标红的这两个函数比较陌生对吧,下面来理解一下,先来看第一下pct_change(),点击看它函数的定义,发现是在:
其实pct的计算咱们在之前https://www.cnblogs.com/webor2006/p/15240950.html已经自己实现过:
也就是pct_change()是pandas库为咱们封装好的计算收益的函数:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.pct_change.html
而mean()它就是求取平均值的,同样是来自于pandas:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.mean.html
这里不必过多深究,知道调用的这些函数来自于哪就成。
计算回报率的标准差:
它的实现,也是先来获取收盘价的收益率:
其中std也是pandas的函数:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.std.html
代码可以优化一下,发现这块:
可以将它提到一个变量上来:
计算夏普:
目前咱们获取的是每天收益率的夏普率,那如果想获得年化收益率的夏普率咋搞呢?那不很简单:
错!!!这里应该是它:
因为夏普率的公式是:
而回报率的标准差是开根号了:
所以,对于年化收益率的夏普率公式应该是它:
而此时分子分母可以进行消分,252/根号252不就是根号252么?所以这里就是为啥是需要乘它的原因了:
运行:
接下来调用一下:
利用最大回撤和夏普比筛选基金
现在咱们已经学习了两大风险指标:最大回撤、夏普比,那学习的目的肯定是为了咱们投资所用的,而作为小白基金是最好的投资产品,因为风险相比于股票要小一些,只要选好标的耐心持有既可,所以,接下来打算用指标来看如何用来筛选基金,当然这里只是泛泛而谈,扩展下知识,毕竟投资理财是自己的事,有用没用需要自己心中有一把称。
筛选基金标准:
筛选基金最基本的3个维度为:
1、3-5年的业绩(收益)。
2、基金经理,他手里的基金管得好不好,就能说明基金经理及他背后的团队公司的经验能力。
3、风险指标(最大回撤、夏普、波动)。
筛选并比较:
1、上天天基金网:
这里选用天天基金网来进行基金筛选:
先来了解一下它的背景:
还是非常老牌的,通常我们买基金可能就是直接上微信或支付宝【支付宝更多一点】对吧,这个网站跟它们的区别就是数据更全,而且还有很多一些对比筛选的工具可用。
2、筛选思路:
对于筛选基金每个人有每个人的思路,通常都会有一个组合的概念,毕竟吊死在一棵树上的风险还是非常高的,比如在去年我在一个技术群中看到一大佬它是这么筛选出心仪的组合的:
1、消费基金配置20%仓位;
2、医疗配置20%~25%仓位;
3、新能源配置15%仓位;
4、纳斯达克配置15%~20%仓位;
不过从今年看医疗行业不是太行的,肯定每年的组合得自己进行更改,对于这仓位可能得要资金量多一点,对于纯小白来说也不可能投太多钱,所以通常选一支花一点钱小量投一点试试错,所以这里主要是以下面的思路来进行筛选,总共先选四支,分别为:
1、热门行业选两支【你能看得懂或者比较看好的】;
2、混合基金选一支;
3、指数基金选一支【沪深300、上证50】;
把这四支选好之后呢,然后进行进一步筛选【这里就会用到咱们所学的回辙率和夏普率指标啦】,最终可以选一个你所中意的买入等待。
3、开始初步筛选:
热门行业选两支:
1、确定行业:
进入网站主页,先从热门主题中进行行业的挑选:
点击进入,就会看到目前为止哪些行业涨幅比较多,目前是2021年12月25,可以瞅见:
然后化肥行业和化工原料涨得最好,如果你感兴趣那就可以选这个行业去挑选相应的基金,不过通常选在自己认知范围的行业比较好,这里打算挑锂电池和新能源吧:
2、从行业中找出最优的一支基金:
接下来则从行业中选出最优的一支,先从锂电池来选起,点击进去,你会看到无数据。。
好吧,那还是先来看一下新能源吧,这个最近一直很火,如下:
你会看到有很多支,那怎么选呢?比较粗暴的一种方式就是按这个排序:
然后点进去简单看一下这支基金的详情,首先先确定它确实是新能源相关的基金:
嗯,差不多,接下来看一下它最近的走势:
关于这个行业的走势如不放心,可以多从这个行业中挑几个对比下,通常一个行业一年的走势都差不多吧,然后再看一下阶段涨幅表现:
最近一季度表现不佳,本身下半年股市就不是太好,也如市场行情所示,那既然同一行业的基金趋势差不多,那还看啥呢?随便买一支就不完了,当然要看,每支表现肯定有好有坏呀,要买肯定得选相对而言更加优秀的嘛,最后看一下基金经理:
通常选任执时间长一点,而且回报率又相对比较高的,这样说明该基金经理经验丰富,好,那对于新能源行业咱们就选农银研究精选混合(000336)了。
另外再选一个行业,这里打算选:
然后同样的方式排序找到第一支:
再看一下是否是这个行业的基金:
嗯,没问题,那就选它了,这里主要是学习如何进行组合选股,就不过多说明了。
混合基金选一支:
接下来再来选混合型的基金,这里可以上基金排行中进行挑选:
就选它吧:
指数基金选一支:
这里同样到基金排行中来进行挑选:
4、进行进一步比对:
方式一:通过天天基金网加对比功能:
在每一支基金详情里都可以看到有一个“加对比”的功能:
点击之后,会进入如下页面:
此时则将自己挑选的四支基金都加入到对比列表中,如下:
当然,具体你选哪支,得根据自己的一个判断,这里只是演示这个网站有这么一个加对比基金的功能。
方式二:手动通过风险收益指标来筛选:
在上面的天天基金网比较中,貌似完全木有用到咱们已经学过的最大回撤和夏普率指标呀,关于这个可以使用手机软件,这里可以使用天天基金的app端,打开基金管理页,然后输入其中的一个基金,找到它进行详情,你会看到咱们想要关注的指标了:
好,这里以表格的形式将咱们上面已经挑选的四支基金的指标数据列一下,以便进行一个对比:
很明显,夏普比率最高的是前海,也就收益最高,而在关注收益的同时还得关注风险抗跌,此时就得看波动率和最大回撤了,这两个指标当然是越小越好,从中可以发现指数基金的博道是最抗跌的,而它的夏普比率也是四支中第二高的,可以看一下这支这一年的收益情况:
其实收益也相当高了,从小白投资角度,我觉得风险反而比收益还要重要,毕竟投资不是赌博,一年能拿了30个点的收益是存银行可遇不可求的,投资中最好的心态就是“知足常乐”。
比较3只股票的夏普指数
接下来回到python代码中来对比三支股票的夏普指数。
新建文件:
此时回到example包中进行文件新建:
思路整理:
整体的实现思路也比较简单:
1、获取3只股票的数据;
2、计算每只股票的夏普比率;
3、可视化3只股票并比较:
调整工程代码:
在继续往下实现之前,这里先对咱们的工程代码进行一个小调整,就是关于这个文件:
所以,改动如下:
另外对于strategy.py需要改动一下:
获取三支股票的数据:
接下来就可以在咱们新建的文件中调用base.py中的方法来获取三支股票的数据了,如下:
计算每只股票的夏普比率:
也比较简单,有了函数封装之后:
可视化三支股票并比较:
要想可视化三支股票,很明显咱们先要把每支计算的夏普数据保存到一个容器中,所以:
但是这样存貌似就不知道哪支股票对应的夏普值了,所以需要存放与之对应的股票对应关系,如下:
好,接下来就可以将它可视化了,如下:
咱们先运行看一下数据正不正常:
接下来咱们将其可视化一下,比较简单:
你会发现报错了。。
其实原因是由于咱们的sharpe输出了两个值导致:
而可视化它就无法确定你要输出啥,所以对于咱们其实只需要年化的夏普率既可,所以将数据源更改一下:
再运行:
这个比较好解决,调整一下:
再运行:
另外咱们可以给这报表加一个标题:
另外对于宁德时代这支股由于是2018/9才上市,所以咱们需要将起始时间改一下:
可以看到,隆基这支的夏普率是最高的,当然收益也最高。
总结:
这次主要是学习了最大回撤和夏普率两个在投资标的选择时经常会用到的概念,当然这些仅仅是概念的学习,并非用它们就真正能选择好理财产品,但是要建立起一套属于自己的投资体系也是建立在这些看似不怎么起眼的概念基础之上滴,总之在没学习这篇之前我是对于这俩概念完全不了解。