Py学习  »  Python

如何通过3行Python代码计算最大回撤

经管之家 • 1 年前 • 236 次点击  

作者:陈可桐  修改:邢不行


如何评价一个量化策略的好坏?


简单的来讲,我首先是看年化收益。收益太差,基本就不用看了。


在收益不错的情况下,其次我就看最大回撤


最大回撤属于风险指标,判断一个策略风险的高低。很多人评价风险,会用一些比较学术的指标,例如方差、波动率等。但我觉着这些都太不直观,比如算出来一个方差,0.035,根本就不能直观的知道是啥意思。


本文通过逐行讲解python代码的方式,详细解释什么是最大回撤,以及具体计算方法,完整的源代码见文末。大家可以看到计算的过程其实非常简单,主要部分也就三行代码。


对这个代码感兴趣或者有疑问的朋友,也可以扫描下方二维码或加我微信xbx783,获取代码。



另外,除了年化收益,最大回撤之外,我第三看中的指标是什么呢?感兴趣的朋友也可以来和我一起交流探讨。



01

最大回撤介绍


最大回撤是评价策略风险的指标,它的含义是:在某一个高点之后,资金曲线下挫最大的幅度。也就是这个策略在最坏的情况下,会亏掉多少钱。



例如,在①的位置开多头仓位,一直没有平仓。那么在持仓期间,就发生了两次比较大的回撤(图中的黄色箭头),以及若干次小的回撤(图中的红色箭头)。


而最大回撤,就是要找到这些回撤中使资金损失最大的一次。并且用百分比的方式量化地表示出来


最大回撤的概念虽然直观,但到底应该怎么计算呢?比如下面这根资金曲线:



在这根资金曲线上,从 ① 到 ②,从 ③ 到 ④,都发生了比较大的回撤。从百分比上来讲,究竟哪次最大?我们用代码和数据说话。



02

最大回撤详细计算

首先,我们读取策略的已经计算完成的资金曲线,也就是回测之后得到的结果。原始数据是这样的:



实际上,要计算最大回撤,我们需要的只有 candle_begin_time(k线开始时间)和 equity_curve(资金曲线的值)这两列。选出数据中我们需要的部分,保存在 equity 这个 dataframe里。



然后,我们用 expanding() 计算资金曲线的滚动最高值(max to here)



什么叫滚动最高值呢:



图中的红线就是滚动最高值。表示截至某个时间点,资金曲线的最大值


接下来,我们计算回撤,也就是资金曲线在滚动最高点之后,下挫的百分比:



这里计算的 dd2here 是:回撤完之后,资金剩余的百分比。在图中直观地看:



浅色的线就是我们计算得到的 dd2here 。比较明显的是,在图中的※位置,回撤结束后只剩下约 20%的资金,几乎可以说是整根资金曲线中发生的最大的回撤。


下一步,我们只要找出 dd2here 这列数据中的最小值,就可以知道最大回撤了。



根据 dd2here 对 equity 进行从小到大的排序,那么第一行就包含了 dd2here 的最小值。


取第一行的candle_begin_time 和 dd2here,它们就是最大回撤结束的时间,以及回撤结束时资金剩余的百分比。我们把这两个值分别赋给 end_date 和 remains,那么很明显,最大回撤就是 1 - remains


最后,我们需要找到最大回撤开始的时间,也就是在最大回撤结束之前,最后一次滚动最高值出现的点,也就是资金曲线的最高点。在图中表示为这个点:



找到这个点的代码如下:



首先选出资金曲线在最大回撤结束之前的部分。


然后,将这部分资金曲线的 dataframe 根据资金的值 (equity_curve) 进行从大到小排序,那么第一行就包含了资金曲线的最大值,它的时间也就是我们想要找的最大回撤开始时间。


最后,我们将最大回撤和这两个时间点打印出来:



确实是产生了高达79.34%的回撤。



最大回撤的计算就完成了。


如果你对计算最大回撤还有任何疑问,都可以扫描下方二维码或加我微信xbx783,和我交流。




03

完整代码


下面是完整的最大回撤计算代码:



如果有疑问,或者想要了解其他内容,可以扫描下方二维码加我微信xbx783和我交流。




04

后记


文章的最后,和大家分享一点量化投资的心得


很多人问我小白如何开始学习量化投资,有什么可以书单推荐


我的建议是千万不要直接找本书来看。


你找本编程书看,那跟着敲完“Hello World”就结束了;你找本数学书看,那看到第七页的公式就睡着了。



更好的学习方式是做实际的项目,在实践中学习量化策略。


研报就是很好的量化实践项目。


一篇研报就是一个策略,作者都是年薪百万的高学历券商分析师,你要做的就是读懂策略研报,并用代码实现。


在此期间什么不会学什么,哪里不会点哪里,抱着解决问题的心态去学习,事半功倍。


熟读唐诗三百首,不会作诗也会吟。


那么哪里可以获取研报呢?


你可以扫描下方二维码或加我的微信xbx783,我这里有分门别类几万份研报,还会实时更新



我会区分难度,精选之后发给你。



加我微信xbx783后,也可以交流量化投资相关问题,我比较忙,回复的比较慢,但是看到的都会回复。


聊的开心,聊得有缘,很多量化的数据、资料都是可以送给你的。


也可以翻翻我朋友圈的内容,很多量化干货。一些不会公开发的内容,都会在朋友圈说。




联系作者


往期文章推荐


用Python验证A股名言:跳空必回补...吗?

收藏 | 最最最最简单、最最最最详细的Python和Pandas安装教程

常见量化投资误区合集,量化交易新手脱坑指南 | 邢不行

基金反买,别墅靠海?每年买倒数前十的基金能赚这么多?Python量化分析告诉你答案 附代码【邢不行】

A股永远3000点?量化指数增强策略,轻松多涨10倍!附代码【邢不行】

用Python量化定义MACD,找出A股全部12万次顶底背离,胜率究竟有多少?附代码【邢不行】

邢不行 | 妙用北向资金找出大盘买点、卖点,跟着操作6年4倍【附代码】

邢不行 | Python量化 + 数字货币 + 轮动 = 4年1000倍【附代码】

BTC涨这么多,还能买吗?要卖吗?| 量化定投策略告诉你答案【附代码】

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/137586
 
236 次点击