最大回撤是指投资组合在选定的周期内,任一时间点往后推,可能出现资产净值下降的最大幅度。回撤的意思是指在某一段时期内净值从最高点开始回落到最低点的幅度。最大回撤常用百分率来表示,是一个重要的风险指标。最大回撤的计算公式为

$$

最大回撤 = \left( 波峰值 - 波谷值 \right) / 波峰值

$$

注意这里的$波峰值$与$波谷值$并不一定是最高值与最低值,这里的$波峰值$与$波谷值$要与时间范围内关联起来。

另外,值得指出的是,最大回撤只是描述投资组合资产净值下降的最大幅度,但它并没有描述投资组合需要使用多长时间恢复下降的资产净值。

本文讲述如何使用 Python 科学计算包 numpy 来计算最大回撤。

为方便描述算法,我们简化最大回撤的定义,只考虑净值下降值,不采用百分率来表示下降幅度,即对于序列 $x_1, x_2, \ldots, x_n$,定义最大回撤 $d$ 为

$$

d = \max \limits_{i\leqslant j} \left( x_i - x_j \right)

$$

如果需要改用百分率来表示最大回撤,只需要再除以$x_i$即可。

根据定义,很容易想到最大回撤的算法。遍历序列中所有元素,对于每个元素计算其下降最大值,然后再比较所有元素下降最大值,挑选出最大的元素下降最大值。这个算法的时间复杂度为$O(n^2)$。

那么,是否存在线性时间复杂度求最大回撤的算法呢?答案是肯定的。算法可以直接使用以下式子来表示:

$$

d = \max \limits_{i\leqslant j} \left( x_i - x_j \right) = \max \limits_{j} \left( \max \limits_{i \leqslant j} x_i - x_j \right)

$$

这个式子看着复杂,其实不难理解。式子左边是最大回撤的定义,上面我们介绍过了。下面介绍如何理解式子的右半部分。

我们先来看$\left( \max \limits_{i \leqslant j} x_i - x_j \right)$,假设我们指定元素$x_j$,元素$x_i$是指所有在元素$x_j$前的元素。$\max \limits_{i \leqslant j} x_i$ 表示所有在元素$x_j$前的元素中的最大元素,$\left( \max \limits_{i \leqslant j} x_i - x_j \right)$则表示这个最大元素减去元素$x_j$。说得或许还有点抽象,我们以一个具体例子来说明。

假设有一序列,[100, 200, 50, 300, 150, 100, 200],元素下标以$0$来开始,指定$j$为4,$x_j$为150,则$i$可以取值 0, 1, 2, 3, 4,故 $\max \limits_{i \leqslant j} x_i$ 为 300,$\left( \max \limits_{i \leqslant j} x_i - x_j \right)$ 为 150。

现在再来看$\max \limits_{j} \left( \max \limits_{i \leqslant j} x_i - x_j \right)$来含义。前面我们可以计算到对于每个$j$,都有一个$\left( \max \limits_{i \leqslant j} x_i - x_j \right)$值,对于所有的$j$,取一个最大的$\left( \max \limits_{i \leqslant j} x_i - x_j \right)$值,即为最大回撤值,并取出取得最大回撤时对应的$j$和$i$下标,就完成算法的求解。

采用 Python 的 numpy 来实现这个算法,源代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15import numpy as np

import matplotlib.pyplot as plt

x = [100, 200, 50, 300, 150, 100, 200]

j = np.argmax(np.maximum.accumulate(x) - x)

print('j is {j}'.format(j=j))

i = np.argmax(x[:j])

print('i is {i}'.format(i=i))

d = x[i] - x[j]

print(d)

plt.plot(x)

plt.plot([i, j], [x[i], x[j]],

'o', color='Red', markersize=10)

plt.show()

为使用图形来展示最大回撤,我们使用了 matplotlib,输出结果:

j is 5

i is 3

200

输出的图形:

参考资料

python计算最大回撤_最大回撤线性算法实现相关推荐

  1. python计算平均绩点_平均绩点的算法?

    展开全部 该计算方法是将大学成绩乘以课程学分并求和再乘以4,再除以总学32313133353236313431303231363533e4b893e5b19e31333337613839分与100之积 ...

  2. 用python计算圆的面积_用Python计算大圆距

    用python计算圆的面积 The shortest distance between two locations on the surface of Earth (or any planet) is ...

  3. python计算时间差的方法_如何计算时间差,用Python算法的话

    这篇文章主要介绍了python计算时间差的方法,实例分析了Python时间操作的相关模块与技巧,需要的朋友可以参考下 本文实例讲述了python计算时间差的方法.分享给大家供大家参考.具体分析如下: ...

  4. python计算文件md5值_用python 正确计算大文件md5 值

    python 计算文件的md5值很方便,但如果只是简单的把文件都入到内存中,大文件会导致问题,一般采用切片的方式分段计算,下面的几个函数可以很好的解决这个问题. 使用 hashlib import h ...

  5. python计算文件md5值_用python计算文件的MD5值

    md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等.下面讲解在python中如何使用md5算法 ...

  6. python计算存款本息和_假如你有1000万存款!躺着够花几年,用Python分分钟告诉你!...

    今天同学聚会,轮到我做东,在学校附近找了一个馆子.哥几个好久没见了,聚餐吃牛蛙火锅,还喝了几瓶啤酒,吃完饭小编去买单一共花了386元.哎..这个月的生活费又要省点了,有的时候我在想如果你有1000万, ...

  7. python计算时间装饰器_使用python装饰器计算函数运行时间的实例

    装饰器在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率 今天就来见识一下 python 装饰器,到底是怎么工作的. 本文主要是利用python装饰器计算函数运行时间 一些需 ...

  8. mysql避免回文_谈谈回文子串

    引子 1. 先讲个歪果仁的故事,在庞贝古城的废墟中,有一座名为赫库兰尼姆的城市,在这个遗迹中人们发现一块石碑,石碑上写着一个非常有趣的拉丁串:sator arepo tenet opera rotas ...

  9. python计算颜色占比_用 Python 对图片主体轮廓进行提取、颜色标记、并计算区域面积...

    Python + Opencv2 实现轮廓提取,轮廓区域面积计算: 对图像处理时,会遇到这样一个场景:找到图像主体轮廓,这是其一,可能为了凸显轮廓,需要用指定的颜色进行标记:轮廓标记完可能任务还没有结 ...

最新文章

  1. ASP.NET 访问共享文件夹
  2. 0130互联网新闻 | 小红书完成超3亿美元D轮融资;网易游戏收购Quantic Dream工作室少数股权...
  3. python成绩转换、百分制到五分制_设计一个程序,将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出。90分以上为A,80~90分为B,...
  4. Python中文问题
  5. MDP蒙特卡罗方法(四)
  6. Python图数据库neo4j学习实践
  7. 微信小程序视频直播开发实现流程
  8. 【JS】388- 深入了解强大的 ES6 「 ... 」 运算符
  9. flac编码音频转alac编码(使用ffmpeg)
  10. 无网络环境安装docker
  11. Google Cloud + Firebase 讲解
  12. 真假马云Deciphering Jack Ma
  13. 清华大学MOOC《操作系统》第1讲:“操作系统概述”总结(转)
  14. linux下安装了lxml但依然报错rom lxml import etreeModuleNotFoundError: No module named ‘lxml‘
  15. 从hilinux.com架设谈网站或其他服务器运维
  16. 一个3D车道线检测方法PersFormer及其开源OpenLane数据集
  17. 防疫新装备友倍康血氧仪
  18. java中new一个对象时具体都发生了什么?
  19. 吐槽微软,远离微软!
  20. Python批量格式化文件名为000xxx.jpg

热门文章

  1. ansible免密登录和账号登录方式
  2. 配置syslog发送_Citrix ADC Syslog配置推荐
  3. Python--26 简单定制 计时器
  4. python---字符编码
  5. Linux cp一个文件夹时提示cp: omitting directory `test/'
  6. android中画弧函数canvas.drawArc()之理解
  7. HttpURLConnection中connection.getInputStream()报异常FileNotFoundException
  8. 中国古代杰出的科学家
  9. 笔试常见的“阶乘”编程题,你写对了么?
  10. 解决w3wp.exe内存占用问题[转载]