概要

这两个概念在刚接触量化分析时,实在时折腾了许久,故在此作下总结。

    最大回撤
    最大回撤恢复时间
    最大回撤持续期
    图示
    源代码


内容

最大回撤(Max Drawdown)

简单来说最大回撤就是从一个高点到一个低点最大的下跌幅度,用来描述一个策略可能出现的最糟糕的情况,衡量了最极端可能的亏损。如果一个策略的最大回撤是 50%,那么它的意思是,运气不好的话,我们的持有价值可能要拦腰截断了。计算公式为

\begin{align} \label{e6}
MaxDrawDown_t = \max(1-\frac{P_j}{P_i} )
\end{align}

其中

  • \(MaxDrawDown_t\) 为 \(t\) 日的最大回撤
  • \(P_i\) 和 \(P_j\) 分别为 \(i\) 日和 \(j\) 日的策略总资产,且需要满足 \(t \geqslant j >i\)

有的教程给出的计算公式是刚好反过来的,即取负值,实际计算公式是一样的,了解下即可。公式可能看起来为容易理解,用语言描述就是

\begin{align} \label{e7}
MaxDrawDown_t = 1-\frac{t \text{日持有价值}}{t \text{日之前持有最高价值}}
\end{align}

这样是不是容易理解多了。

最大回撤恢复时间(Max Drawdown)

这个我的理解是:从最大回撤结束时间开始,需要多久才能达到回撤前的顶峰状态。这个可以参考图示。

最大回撤持续期(MaxDrawDownDuration)

最大回撤持续期描述的是持有价值从回撤开始到再创新高所经历的时间,如果说最大回撤是在资产空间维度上描述资产的波动风险,那么最大回撤持续期则是在资产的时间维度上给出一个风险描述。直观地说就是资产创新高的频率是怎样的。

图示

下边一张图展示了我们介绍的三个概念,直观地表示了三个概念范围。

图 1:回撤效果图!

源代码

本篇用的代码(python)如下,该代码也包含了 python 绘折线图的大部分设置,可以作为参考。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Jun  2 15:32:13 2019@author: zk
"""
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
import matplotlib.ticker as ticker
import numpy as np
import randomDAYS = 365  def Init():timedelta = datetime.timedelta(days = 1)startdate = datetime.date.today()xdate = [startdate+i*timedelta for i in range(DAYS)]ycapital = [3000]for _ in range(DAYS-1):ycapital.append(ycapital[-1]+random.uniform(-1, 1.1))return xdate, ycapitaldef max_drawdown(xdate, ycapital):# 计算每日的回撤drawdown = []tmp_max_capital = ycapital[0]for c in ycapital:tmp_max_capital = max(c, tmp_max_capital)drawdown.append(1 - c / tmp_max_capital)# 最大回撤MaxDrawdown = max(drawdown)# 计算最大回撤日期范围endidx = np.argmax(drawdown)#enddate = xdate[endidx]startidx = np.argmax(ycapital[:endidx])#startdate = xdate[startidx]#仅仅画图的话,我们只要索引值更加方便return MaxDrawdown, startidx, endidxdef max_drawdown_duration(xdate, ycapital):duration = []tmp_max_capital = ycapital[0]for c in ycapital:if c >= tmp_max_capital:duration.append(0)else:duration.append(duration[-1]+1)tmp_max_capital = max(c, tmp_max_capital)MaxDDD = max(duration)#fig, ax = plt.subplots(figsize = (21, 9)) #plt.plot(xdate, duration)#ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))endidx = np.argmax(duration)startidx = endidx - MaxDDDreturn MaxDDD, startidx, endidxdef max_drawdown_restore_time(startidx, endidx, xdate, ycapital):"""startidx:表示最大回撤的开始时间在 xdate 中的索引,由 max_drawdown 方法返回endidx:表示最大回撤的结束时间在 xdate 中的索引,由 max_drawdown 方法返回"""maxdd_resore_time = 0restore_endidx = np.inffor t in range(endidx, len(xdate)):if ycapital[t] >= ycapital[startidx]:restore_endidx = tbreakelse:maxdd_resore_time += 1restore_endidx = min(restore_endidx, len(xdate)-1)return maxdd_resore_time, restore_endidxdef plot(xdate, ycapital):# 指定画布大小fig, ax = plt.subplots(figsize = (21, 9))  # 绘图并设置颜色,图例标签,线宽plt.plot(xdate, ycapital, 'red', label = 'My Strategy', linewidth = 2)# 绘制最大回撤日期范围标识 marker = 'v'MaxDrawdown, startidx, endidx = max_drawdown(xdate, ycapital)print("最大回撤为:", MaxDrawdown)plt.scatter([xdate[startidx], xdate[endidx]], [ycapital[startidx], ycapital[endidx]],s = 100, c = 'b', marker = 's', label = 'MaxDrawdown')# 绘制最大回撤恢复时间maxdd_resore_time, restore_endidx = max_drawdown_restore_time(startidx, endidx, xdate, ycapital)print("最大回撤恢复时间为(天):", maxdd_resore_time)plt.scatter([xdate[endidx], xdate[restore_endidx]], [ycapital[endidx], ycapital[restore_endidx]],s = 100, c = 'cyan', marker = 'D', label = 'MaxDrawdown Restore Time')# 绘制最大回撤持续期标识 marker = 'D'MaxDDD, startidx, endidx = max_drawdown_duration(xdate, ycapital)plt.scatter([xdate[startidx], xdate[endidx]], [ycapital[startidx], ycapital[endidx]],s = 80, c = 'g', marker = 'v', label = 'MaxDrawdown Duration')print("最大回撤持续期为(天):", MaxDDD)# 设置刻度值颜色plt.yticks(color = 'gray')# 设置 y 轴百分比显示,注意将 y 轴数据乘以 100#ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f%%'))# 颜色,旋转刻度plt.xticks(color = 'gray',rotation = 15)# 指定字体,大小,颜色 fontdict = {"family":"Times New Roman", 'size':12, 'color':'gray'} #Times New Roman, Arialplt.title("random account value", fontdict = fontdict)plt.xlabel("date(day)", fontdict = fontdict)plt.ylabel("account value", fontdict = fontdict)# 去掉边框 top left right bottomax.spines['top'].set_visible(False) ax.spines['left'].set_visible(False)ax.spines['right'].set_visible(False)# 设置 x 轴颜色ax.spines['bottom'].set_color('lightgray')#设置时间标签显示格式ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))#设置时间刻度间隔#timedelta = (xdate[-1] - xdate[0]) / 10  # 这种方式不能保证显示最后一个日期#plt.xticks(mdate.drange(xdate[0], xdate[-1], timedelta))# 分成 10 份delta = round(len(xdate) / 9)plt.xticks([xdate[i*delta] for i in range(9)] + [xdate[-1]])#通过修改tick_spacing的值可以修改x轴的密度#ax.xaxis.set_major_locator(ticker.MultipleLocator(10))# 去掉 y 轴刻度线,四个方向均可设置plt.tick_params(left = 'off')# 设置刻度的朝向,宽,长度plt.tick_params(which = 'major', direction = 'out', width = 0.2, length = 5) # in, out or inout# 设置刻度显示在哪个方向上#tick_params(labeltop='on',labelbottom='off',labelleft='off',labelright='off')# 设置 y 轴方向的网络线plt.grid(axis = 'y', color = 'lightgray', linestyle = '-', linewidth = 0.5)# 设置图例 列宽:columnspacing=float (upper left) plt.legend(loc = 'best', fontsize = 12, frameon=False, ncol = 1)# 设置图例字体颜色#leg = 上一行 plt.legend 的返回值#for line,text in zip(leg.legendHandles, leg.get_texts()): #    text.set_color(line.get_color())fig.show()# fig.savefig("test.png")  # dpi = 150if __name__ == '__main__':# 构造绘图数据xdate, ycapital = Init()plot(xdate, ycapital)#max_drawdown_duration(xdate, ycapital)

转载于:https://www.cnblogs.com/zhoukui/p/10166873.html

最大回撤,最大回撤恢复时间与最大回撤持续期相关推荐

  1. 最大回撤python_最大回撤,最大回撤恢复时间与最大回撤持续期

    概要 这两个概念在刚接触量化分析时,实在时折腾了许久,故在此作下总结. 内容 最大回撤(Max Drawdown) 简单来说最大回撤就是从一个高点到一个低点最大的下跌幅度,用来描述一个策略可能出现的最 ...

  2. matlab最长回撤期,最大回撤,最大回撤恢复时间与最大回撤持续期

    概要 这两个概念在刚接触量化分析时,实在时折腾了许久,故在此作下总结. 内容 最大回撤(Max Drawdown) 简单来说最大回撤就是从一个高点到一个低点最大的下跌幅度,用来描述一个策略可能出现的最 ...

  3. vnpy怎么创建策略并回测_基于vnpy、rqdata的回测打通历程

    本文用于记录本人回测填坑路上蹚过的坑. 历史数据方面,最近听说rqdata数据质量不错,而且可以通过米匡注册用户享有1个月免费使用期,于是打算用于回测的数据来源. 话不多说. 安装vnpy2.0.5, ...

  4. 美团mysql 闪回_MyFlash——美团点评的开源MySQL闪回工具

    由于运维.DBA的误操作或是业务bug,我们在操作中时不时会出现误删除数据情况.早期要想恢复数据,只能让业务人员根据线上操作日志,构造误删除的数据,或者DBA使用binlog和备份的方式恢复数据,不管 ...

  5. java 最长回文串_通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)...

    1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...

  6. 炸了!中国学者首次被Science撤稿,与之前首次被Nature撤稿的教授来自同一所大学……...

    全世界只有3.14 % 的人关注了 爆炸吧知识 两次撤稿 并非学术造假? 国庆假期结束的第一天,Science杂志将中国地质大学宋怀兵副教授两个月前发表的文章进行了撤稿处理. 这也是新中国建国以来,首 ...

  7. python 股票回测书籍推荐_python实现马丁策略回测3000只股票

    python实现马丁策略回测3000只股票 批量爬取股票数据 这里爬取数据继续使用tushare,根据股票代码来遍历,因为爬取数据需要一定时间,不妨使用多线程来爬取,这里要注意tushare规定每分钟 ...

  8. python 量化策略回测_在python中创建和回测对交易策略

    python 量化策略回测 Pairs trading is one of the many mean-reversion strategies. It is considered non-direc ...

  9. JAVA算法:回文字符串相关问题详解(回文字符串总结)

    JAVA算法:回文字符串相关问题详解(回文字符串总结) Q1. 编写一个工具方法判断给定的字符串是否为回文字符串 例如:给定一个字符串"aabbaa",判断该字符串是否为回文字符串 ...

最新文章

  1. AI初创企业“考拉悠然”获3000万融资
  2. Android入门第八篇之GridView(九宫图)
  3. mysql-python 安装错误: Cannot open include file: 'config-win.h': No such file or directory
  4. MyEclipse中安装反编译插件
  5. hdu 3966( 树链剖分+点权更新)
  6. CentOS7中yum安装mysql_CentOS7中YUM 安装mysql
  7. qrp文件如何用excel打开_问与答66: 如何不打开Excel文件删除行?
  8. shell脚本输出带颜色字体
  9. 小白的算法初识课堂(part7)--狄克斯特拉算法
  10. 图 子类 数据库_构造知识图的语义模型
  11. python如何调用阿里云接口_阿里云 API调用实践(python语言)
  12. hdu 1285 确定比赛名次
  13. 用友服务器ip地址在哪里修改密码,用友服务器ip地址在哪里修改密码
  14. 免费破解版Xshell和Xftp
  15. JAVA 使用 itextpdf 构建 PDF
  16. vue设置网页title
  17. 视频教程-Kali Linux 网络安全渗透测试-渗透测试
  18. 黄瓜西红柿为何不能同吃?(图)
  19. 初次使用虹软人脸识别SDK C++版本
  20. Qbao Network 项目进展报告(2019.2.28-2019.3.13)

热门文章

  1. 耳机的L和R是什么意思?
  2. 电脑不启动任务管理器时cpu使用率很高,短时间内不使用电脑时启动为什么能耗可下降到15%以下?
  3. 苹果平板买哪款最好?
  4. 贷款买车后,有多少人后悔了?
  5. 想赚钱?找自己的长板!
  6. 每个时代都有每个时代的风口
  7. 有的朋友问我创业没有资金怎么办?
  8. 如何割教育培训机构的韭菜?
  9. 就说现在的钱有多难挣
  10. 算法--最大连续子序列和(动态规划,分而治之)