社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

经管之家 • 3 年前 • 608 次点击  

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


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


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


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


最大回撤属于风险指标,判断一个策略风险的高低。很多人评价风险,会用一些比较学术的指标,例如方差、波动率等。但我觉着这些都太不直观,比如算出来一个方差,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/148642