使用python计算最大回撤

1. 单期简单收益率

R t = P t − P t − 1 P t − 1 R_{t}=\dfrac {P _{t}-P_{t-1}}{P_{t-1}} Rt​=Pt−1​Pt​−Pt−1​​
说明:

  1. R t R_t Rt​ 为单期简单收益率
  2. P t P_t Pt​ 为t期的价格
  3. P t − 1 P_{t-1} Pt−1​ 为t-1期的价格
import datetime
import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
price = pd.Series([3.42,3.51,3.68,3.43,3.56,3.67], index=[datetime.date(2015,7,x) for x in range(3,9)])
price
2015-07-03    3.42
2015-07-04    3.51
2015-07-05    3.68
2015-07-06    3.43
2015-07-07    3.56
2015-07-08    3.67
dtype: float64

利用ffn库计算单期简单收益

import ffn
r = ffn.to_returns(price)
r
2015-07-03         NaN
2015-07-04    0.026316
2015-07-05    0.048433
2015-07-06   -0.067935
2015-07-07    0.037901
2015-07-08    0.030899
dtype: float64

2. 最大回撤

最大回撤(Maximum Drawdown, MDD) 用来衡量投资(特别是基金)的表现,

2.1 回撤:某资产在时刻T的回撤是指资产在(0,T)的最高峰值与现在价值 P T P_T PT​之间的回落值,用数学公式表达为:

D ( T ) = max ⁡ { 0 , max ⁡ t ∈ ( 0 , T ) P t − P T } D\left( T\right) =\max \left\{ 0,\max _{t\in (0,T)}P_t-P_{T}\right\} D(T)=max{0,maxt∈(0,T)​Pt​−PT​}

2.2 对应的回撤率为:

d ( T ) = D ( T ) max ⁡ t ∈ ( 0 , T ) p t d\left(T\right) = \dfrac {D\left( T\right) }{\max _{t\in \left( 0,T\right) }p_{t}} d(T)=maxt∈(0,T)​pt​D(T)​

知道回撤的含义之后,最大回撤就比较容易理解了,资产在T时刻的最大回撤MDD(T),就是资产在时段(0,T)内回撤的最大值,对应的数学公式为:

M D D ( T ) = max ⁡ τ ∈ ( 0 , T ) D ( τ ) = max ⁡ τ ∈ ( 0 , T ) [ max ⁡ t ∈ ( 0 , τ ) P t − P τ ] MDD\left(T\right) = {\max _{\tau \in \left(0,T\right)}} D\left(\tau\right) = {\max _{\tau \in \left(0,T\right)}} \begin{aligned} \left[ \max _{t\in \left( 0,\tau \right) }P_{t}-P_{\tau}\right] \end{aligned} MDD(T)=maxτ∈(0,T)​D(τ)=maxτ∈(0,T)​[t∈(0,τ)max​Pt​−Pτ​]​

相应的最大回撤率为:
m d d ( T ) = max ⁡ τ ∈ ( 0 , T ) d ( τ ) M D D ( T ) max ⁡ t ∈ ( 0 , T ) P t mdd\left(T\right) = {\max _{\tau \in \left(0,T\right)}} d\left(\tau \right) \dfrac {MDD\left(T\right)}{\max _{t \in \left(0,T\right)}P_t} mdd(T)=maxτ∈(0,T)​d(τ)maxt∈(0,T)​Pt​MDD(T)​

直观的讲,MDD(T)对应的是在(0,T)时段内资产价值从最高峰回落到最低谷的幅度。最大回撤常用来描述投资者在持有资产是可能面临的最大亏损。

2.3 利用收益率计算最大回撤

如果某资产的收益率序列为R1,R2,…,RT,在初始时刻0时,我们投资1元在该资产上并一直持有到T时刻,则初始值为1元的资产价值就会随时间变化为:(1+R1),(1+R1)(1+R2),(1+R1)(1+R2)(1+R3),…, ∏ k = 1 T ( 1 + R k ) \prod _{k=1}^{T}\left( 1+R_{k}\right) ∏k=1T​(1+Rk​)

时刻T对应的回撤值为:
D ( T ) = max ⁡ { 0 , max ⁡ t ∈ ( 0 , T ) ∏ k = 1 t ( 1 + R k ) − ∏ k = 1 T ( 1 + R k ) } D(T) = \max \left\{ 0, \max _{t \in (0,T)} \prod _{k=1}^{t}\left( 1+R_{k}\right) - \prod _{k=1}^{T}\left( 1+R_{k}\right) \right\} D(T)=max{0,maxt∈(0,T)​∏k=1t​(1+Rk​)−∏k=1T​(1+Rk​)}

相应的回撤率为:
d ( T ) = D ( T ) max ⁡ t ∈ ( 0 , T ) ∏ k = 1 t ( 1 + R k ) d(T) = \dfrac {D\left( T\right) }{\max _{t\in \left( 0,T\right) }\prod _{k=1}^{t}\left( 1+R_{k}\right) } d(T)=maxt∈(0,T)​∏k=1t​(1+Rk​)D(T)​

最大回撤为:
M D D ( T ) = max ⁡ τ ∈ ( 0 , T ) D ( τ ) = max ⁡ τ ∈ ( 0 , T ) [ max ⁡ t ∈ ( 0 , τ ) ∏ k = 1 t ( 1 + R k ) − ∏ k = 1 τ ( 1 + R k ) ] MDD(T) = \max _{\tau \in \left( 0,T\right) }D\left( \tau \right) = \max _{\tau \in \left( 0,T\right) } \begin{aligned} \left[\max _{t\in \left( 0,\tau \right) }\prod _{k=1}^{t}\left( 1+R_{k}\right) - \prod _{k=1}^{\tau}\left( 1+R_{k}\right) \right]\end{aligned} MDD(T)=maxτ∈(0,T)​D(τ)=maxτ∈(0,T)​[t∈(0,τ)max​k=1∏t​(1+Rk​)−k=1∏τ​(1+Rk​)]​

相应的最大回撤率为:
m d d ( T ) = max ⁡ τ ∈ ( 0 , T ) d ( τ ) = M D D ( T ) max ⁡ t ∈ ( 0 , T ) ∏ k = 1 t ( 1 + R k ) mdd(T) = \max _{\tau \in \left( 0,T\right) }d(\tau) = \dfrac {MDD(T)}{\max _{t \in \left( 0,T\right) }\prod _{k=1}^{t}\left( 1+R_{k}\right)} mdd(T)=maxτ∈(0,T)​d(τ)=maxt∈(0,T)​∏k=1t​(1+Rk​)MDD(T)​

value = (1 + r).cumprod()
value
2015-07-03         NaN
2015-07-04    1.026316
2015-07-05    1.076023
2015-07-06    1.002924
2015-07-07    1.040936
2015-07-08    1.073099
dtype: float64
D = value.cummax() - value
D
2015-07-03         NaN
2015-07-04    0.000000
2015-07-05    0.000000
2015-07-06    0.073099
2015-07-07    0.035088
2015-07-08    0.002924
dtype: float64
d = D / (D + value)
d
2015-07-03         NaN
2015-07-04    0.000000
2015-07-05    0.000000
2015-07-06    0.067935
2015-07-07    0.032609
2015-07-08    0.002717
dtype: float64
MDD = D.max()
MDD
0.07309941520467844
mdd =d.max()
mdd
# 对应的最大回撤率值为
0.06793478260869572
# 采用ffn库计算收益率累积最大回撤
ffn.calc_max_drawdown(value)
-0.06793478260869568
from empyrical import max_drawdown
# 使用 empyrical 计算收益率序列最大回撤
max_drawdown(r)
-0.06793478260869572

3. Java版本的最大回测

import java.util.Arrays;
import java.util.List;import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MaxDrawdownService {/*** 计算最大回撤:某段时间内连续收益率之和最小的值为最大回撤* * @Param rates:收益率*/@SuppressWarnings("all")public static double caculateMaxDrawdown(List<Double> rates) {double s = 0;double e = 0;double max = 0;double temp = 0;double ts = 0;// 收益率不为空if (!rates.isEmpty()) {for (int i = 0; i < rates.size(); i++) {// 获得收益率double r = rates.get(i);temp = temp + r;if (temp > 0) {ts = i + 1;e = i + 1;temp = 0;} else {if (temp < max) {s = ts;e = i;max = temp;}}}}log.info("最大回撤计算结果:maxsum={},start={},end={}", max, s, e);return max;}/*** 按照资金计算最大回撤* @param equityValues* @return*/public static double calMaxDrawdown(List<Double> equityValues) {if (equityValues == null || equityValues.size() < 2)return 0;double maxDrawdown = 0; // 最大回撤double maxEquityValue = equityValues.get(0); // 当日之前的最大资产净值for (int i = 1; i < equityValues.size(); i++) {double currentEquityValue = equityValues.get(i); // 当日资产净值double drawDown = (1 - currentEquityValue / maxEquityValue);maxDrawdown = Math.max(maxDrawdown, drawDown);maxEquityValue = Math.max(currentEquityValue, maxEquityValue);}log.info("calMaxDrawdown最大回撤计算结果:{}", maxDrawdown);return maxDrawdown;}public static void main(String[] args) {Double[] c = {0.026316,0.048433,-0.067935,0.037901,0.030899};caculateMaxDrawdown(Arrays.asList(c));Double[] c2 = {3.42,3.51,3.68,3.43,3.56,3.67};calMaxDrawdown(Arrays.asList(c2));}
}

使用python计算最大回撤相关推荐

  1. Python计算最大回撤、回撤天数

    Python计算最大回撤.回撤天数 "回撤"的概念 回撤是投资或者交易中常见的一个名词,是指账户的资金减少.资金回撤的定义分很多种,这些定义之间差异微小,大同小异,一般而言,资金回 ...

  2. python计算最大回撤_最大回撤线性算法实现

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

  3. python计算最大回撤_【邢不行|量化小讲堂系列36-python量化入门】如何通过3行Python代码计算最大回撤...

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. [历史文章汇总]请点击此处 [必读文章]: 个人微 ...

  4. python计算最大回撤_Python进阶量化交易场外篇3——最大回撤评价策略风险

    新年伊始,很荣幸笔者的<教你用 Python 进阶量化交易>专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习 ...

  5. python计算最大回撤_12最大回撤数据分析

    清华编程高手尹成带你基于算法实践python量化交易 量化交易是指以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种"大概率"事件以制定策 ...

  6. python计算最大回撤_Python做量化投资评价策略风险 如何计算最大回撤?

    2021年FRM主要时间节点 2020年12月 第一阶段报名时间:2020/12/01 - 2021/01/31 首次注册:$1000 USD / 非首次注册:$590 USD 2021年02月 第二 ...

  7. 【Python】 计算最大回撤率(金融工程)

    Python 计算最大回撤, 使用pandas库中的.cummax()函数计算 最大回撤:  ( 累计最大回报-当前回报 )最大值为最大回撤的位置 MDD = max(data['Ret'].cums ...

  8. 回撤率 python 平台_python怎么计算最大回撤

    python怎么计算最大回撤 发布时间:2020-08-24 11:53:41

  9. 计算最大回撤python_python 计算收益回撤比

    对一个基金A,有每日收益序列RET_A,用python计算其收益回撤比. 思考: 收益回撤比 = 年化收益率 / 最大回撤 计算年化收益率 import numpy as np import pand ...

最新文章

  1. python 数据逐个验证_在python中验证数据的最佳方法是什么?
  2. 重构风险程序员一定要遵守的规则
  3. linux中double大小,linux 下 float 和 double 精度计算差别
  4. 牛X的web报表设计工具Grid++Report
  5. Servlet的多重映射
  6. Angular CLI ng 指令指南
  7. (DBA之路【十一】)master-slave 机制原理
  8. Guitar Por如何演奏刮弦
  9. html第八章制作花样链接卡,利用flex布局横向滚动制作滑动选项卡以及内容滑块...
  10. WSGI Middleware
  11. 版本化SQL Server数据库
  12. java安装path_JDK安装时设置PATH和CLASSPATH环境变量有何作用?
  13. 【C++】图像加载(libpng、FreeImage、stb_image)
  14. Spire.XLS使用教程:在Java中将 Excel 转换为 CSV或将CSV转换为Excel
  15. php视频画面区域裁剪,怎么裁剪视频画面
  16. 如何利用OMIM数据库获取肿瘤相关所有突变基因?
  17. python逻辑量有_python逻辑运算符
  18. 教师资格证面试,你要知道的那些事!
  19. 优秀网站看前端 —— 小米Note介绍页面
  20. 【无标题】Linux服务器上监控网络带宽的18个常用命令

热门文章

  1. 苹果11如何设置9宫格_iPhone 11怎么设置九宫格输入法?iPhone11九宫格输入法设置教程...
  2. 计算机windows7连接打印机
  3. 室内设计优美语句_关于装修设计的唯美句子
  4. 2022全新老照片修复小程序/AI图片处理小程序
  5. (转)Moodle平台简介
  6. Android开发:调用系统图库选择图片
  7. 【TWS使用系列2】如何通过TWS下单及查看账户盈亏
  8. 有一分热,发一分光,用Python 爬取鲁迅先生《经典语录》
  9. 产品经理培训行业---以起点学院为主体的相关竞品分析报告
  10. 上半年结束,46万家公司倒闭,2024太难了!