精华内容
下载资源
问答
  • 使用python计算最大回撤

    千次阅读 2018-12-04 15:05:09
    使用python计算最大回撤 1. 单期简单收益率 Rt=Pt−Pt−1Pt−1R_{t}=\dfrac {P _{t}-P_{t-1}}{P_{t-1}}Rt​=Pt−1​Pt​−Pt−1​​ 说明: RtR_tRt​ 为单期简单收益率 PtP_tPt​ 为t期的价格 Pt−1P_{t-1}Pt−1​...

    使用python计算最大回撤

    1. 单期简单收益率

    Rt=PtPt1Pt1R_{t}=\dfrac {P _{t}-P_{t-1}}{P_{t-1}}
    说明:

    1. RtR_t 为单期简单收益率
    2. PtP_t 为t期的价格
    3. Pt1P_{t-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)的最高峰值与现在价值PTP_T之间的回落值,用数学公式表达为:

    D(T)=max{0,maxt(0,T)PtPT}D\left( T\right) =\max \left\{ 0,\max _{t\in (0,T)}P_t-P_{T}\right\}

    2.2 对应的回撤率为:

    d(T)=D(T)maxt(0,T)ptd\left(T\right) = \dfrac {D\left( T\right) }{\max _{t\in \left( 0,T\right) }p_{t}}

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

    MDD(T)=maxτ(0,T)D(τ)=maxτ(0,T)[maxt(0,τ)PtPτ]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(τ)MDD(T)maxt(0,T)Ptmdd\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)对应的是在(0,T)时段内资产价值从最高峰回落到最低谷的幅度。最大回撤常用来描述投资者在持有资产是可能面临的最大亏损。

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

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

    时刻T对应的回撤值为:
    D(T)=max{0,maxt(0,T)k=1t(1+Rk)k=1T(1+Rk)}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)=D(T)maxt(0,T)k=1t(1+Rk)d(T) = \dfrac {D\left( T\right) }{\max _{t\in \left( 0,T\right) }\prod _{k=1}^{t}\left( 1+R_{k}\right) }

    最大回撤为:
    MDD(T)=maxτ(0,T)D(τ)=maxτ(0,T)[maxt(0,τ)k=1t(1+Rk)k=1τ(1+Rk)]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(τ)=MDD(T)maxt(0,T)k=1t(1+Rk)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)}

    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));
    	}
    }
    
    展开全文
  • 本程序为Ernest Chen所著Quantitative Trading中文版书中42页中例子,书中主要介绍了如何使用Excel和matlab来实现夏普比率与计算最大回撤和最大回撤时间的方法,python作为一种开源语言,能够实现matlab的相同功能,...

    本程序为Ernest Chen所著Quantitative Trading中文版书中42页中例子,书中主要介绍了如何使用Excel和matlab来实现夏普比率与计算最大回撤和最大回撤时间的方法,python作为一种开源语言,能够实现matlab的相同功能,并能写交易程序,因此采用python实现了书中功能,作为练手

    #计算夏普率与回撤与回撤时间

    #第一次完成于2016/5/24
    import pandas as pd
    import numpy as np
    import math 
    import matplotlib.pyplot as plt
    #读取sheet1中的内容,存放在data中,数据类型为DataFrame
    data = pd.ExcelFile('example3_4.xls')
    data = data.parse('Sheet2')
    #计算日收益率(G3-G2)/G2
    data['return']=(data['Adj Close'].shift(-1)-data['Adj Close'])/data['Adj Close']
    #计算超额回报率
    data['exReturn']=data['return']-0.04/252
    #计算夏普比率
    sharperatio=math.sqrt(252)*data['exReturn'].mean()/data['exReturn'].std()
    print('该策略的夏普率为: ', sharperatio)
    data['Adj Close'].plot()
    #计算累积收益率cumret=(1+return).cumsum
    data['cumret']=np.cumprod(1+data['exReturn'])-1
    fig = plt.figure()
    data['cumret'].plot()
    #计算累积最大收益率,最大回撤,累积最长回撤时间
    Max_cumret=np.zeros(len(data))
    retracement=np.zeros(len(data))
    Re_date=np.zeros(len(data))


    for i in range(len(data)):
        #计算累积最大收益率
        if i==0:
            Max_cumret[0]=data['cumret'][0]
            retracement[0]=(1+Max_cumret[0])/(1+data['cumret'][0])-1
        else:
            #计算累积最大收益率
            Max_cumret[i]=max(Max_cumret[i-1],data['cumret'][i])
            #计算策略回撤
            retracement[i]=float((1+Max_cumret[i])/(1+data['cumret'][i])-1)
        #计算最大回撤时间
        if retracement[i]==0:
            Re_date[i]=0
        else:
            Re_date[i]=Re_date[i-1]+1
    #计算最最大回撤幅度
    retracement=np.nan_to_num(retracement)
    Max_re=retracement.max()
    #计算最大回撤时间
    Max_reDate=Re_date.max()
    展开全文
  • python计算资金曲线最大回撤

    千次阅读 2019-02-12 14:12:57
    import ffn import pandas as pd data=pd.read_csv("D:/test.txt") print(data) value 0 1.0000 1 1.0106 2 1.0446 3 1.0955 4 1.0949 5 1.0963 6 1.0961 7 1.0962 8 1.1017 ...10 ...
    import ffn
    import pandas as pd
    data=pd.read_csv("D:/test.txt")
    print(data)
    
         value
    0   1.0000
    1   1.0106
    2   1.0446
    3   1.0955
    4   1.0949
    5   1.0963
    6   1.0961
    7   1.0962
    8   1.1017
    9   1.1016
    10  1.1139
    11  1.1191
    12  1.1188
    13  1.1186
    14  1.1185
    15  1.1201
    16  1.1277
    17  1.1340
    18  1.1342
    19  1.1426
    20  1.1439
    21  1.1461
    22  1.1537
    23  1.1496
    24  1.1549
    25  1.1599
    26  1.1594
    27  1.1644
    28  1.1643
    29  1.1731
    ..     ...
    43  1.1866
    44  1.2025
    45  1.1992
    46  1.1937
    47  1.2290
    48  1.2291
    49  1.2291
    50  1.2288
    51  1.2300
    52  1.2313
    53  1.2268
    54  1.2255
    55  1.2306
    56  1.2236
    57  1.2325
    58  1.2301
    59  1.2365
    60  1.2497
    61  1.2467
    62  1.2560
    63  1.2557
    64  1.2552
    65  1.2551
    66  1.2555
    67  1.2565
    68  1.2624
    69  1.2636
    70  1.2671
    71  1.2773
    72  1.2762
    
    [73 rows x 1 columns]
    
    ffn.calc_max_drawdown(data)
    
    value   -0.013387
    dtype: float64
    
    
    
    展开全文
  • 引言: 邢不行的系列帖子“量化小讲堂”,通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助。 ... 【必读文章】EOS期现套利,一周时间,15%无风险收益...如何通过3行Python代码计算...

    引言:

    邢不行的系列帖子“量化小讲堂”,通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助。

    【历史文章汇总】请点击此处

    【必读文章】EOS期现套利,一周时间,15%无风险收益

                         10年400倍策略分享(附视频逐行代码讲解)

    个人微信:xbx9585,有问题欢迎交流。


     

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

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

     

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

    我自己的话,首先是看年化收益。收益太差,基本就不用看了。

    其次我就看最大回撤

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

    本文通过逐行讲解python代码的方式,详细解释什么是最大回撤,以及具体计算方法,完整的源代码见文末

    另外,除了年化收益,最大回撤之外,我第三看中的指标是什么呢?这个大家可以在评论中回复,感兴趣的人多的话,下次写篇文章讲讲。

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

     

     

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

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

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

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

     

     

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

    实际上,要计算最大回撤,我们需要的只有 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%的回撤。

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

     

     

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

     

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

    如果你想入门量化,但是始终找不到方向,可以加入我的知识星球。我会在里面解答你的问题,分享我的感悟,不论是投资、技术,还是职业选择、思维方式。

                                                                           -- 学习和成长从来都不是一个人的事 --

    展开全文
  • 详解如何使用python计算一只股票的最大回撤率? 一、什么是最大回撤率? 最大回撤率:在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。最大回撤用来描述买入产品后可能出现的最...
  • 计算基金最大回撤Python代码 def get_maximum_retracement(date_totalworth_dict:dict): """ date_totalworth_dict:dict eg. -->{'2019-10-16': 1.0022, '2019-09-11': 1.0, '2019-09-12': 1.0, } return ...
  • 一、如何计算最大回撤 最大回撤:在选定周期内,任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值,它是一个非常重要的风险指标。 1.1计算公式 我们来看这张图,你可以作为一只基金的表现,它代表...
  • 理解最大回撤Python实现

    千次阅读 2019-12-12 17:29:04
    最大回撤 最大回撤率,是指统计周期内的最大产品净值的时点往后推,当产品净值回落到最低点时,产品收益率的回撤幅度。...这里会存在一个偏差,即选取的计算周期,每天、每个月、每小时计算最大回撤实际...
  • 以月为窗口,挑选一只基金or股票,查看它近2年最大回撤率; 找到从08年-至今的金融危机时间段,并呈现在这些危机时间段内,该基金or股票的历次回撤率。 给了3天时间,代码我1天不到就写完了,写完之后我就去做自己...

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
关键字:

python计算最大回撤

python 订阅