最大回撤原理与计算-python实现

最大回撤

最大回撤是指:在任一时间点向后推,产品净值到达最低点时,收益率回撤幅度的最大值。这一指标描述了投资者买入某资产可能出现的最为糟糕的情况。

公式:maxdrawdown = min_{i\leq j } (x_j - x_i) = min_{j}(x_j - max_{i\leq j} x_i)

即,最大回撤是在每一个时间点上向后求其跌幅,然后找出最大的。从公式的第二个等式,我们首先给出最大回撤的一个直观算法

最大回撤的算法

一、首先给出计算最大回撤的一个算法(先找出累计收益率的波峰点,在向后寻找最大的跌幅,即为最大回撤)

  1. 将累计收益率按照日期进行排列;
  2. 接着找到所有波峰的点,即当日的累计收益率大于前一日累计收益率的点,并用数组记录下来,命名为maxcum
  3. 接着在第二步得到的每一个"波峰"处,向后寻找跌幅最大的那个点,即为最大回撤
import numpy as np
def MaxDrawdown(return_list):
    
    # 1. find all of the peak of cumlative return 
    maxcum = np.zeros(len(return_list))
    b = return_list[0]
    for i in range(0,len((return_list))):
        if (return_list[i]>b):
            b = return_list[i]
        maxcum[i] = b
    
    # 2. then find the max drawndown point
    i = np.argmax((maxcum-return_list)/maxcum) 
    if i == 0:
        return 0
    j = np.argmax(return_list[:i])   
    
    # 3. return the maxdrawndown
    return (return_list[j]-return_list[i])/return_list[j]

二、接着,使用np.maximum.accumulate函数计算最大回撤

import numpy as np
def MaxDrawdown(return_list):
    i = np.argmax((np.maximum.accumulate(return_list)- return_list)/np.maximum.accumulate(return_list))
    if i == 0:
        return 0
    j = np.argmax(return_list[:i])
    return(return_list[j] - return_list[i]) / return_list[j],j,i

对沪深300指数计算累计收益率,并计算最大回撤

import pandas as pd
import matplotlib.pyplot as plt

# import data and cleaning
data0 = pd.read_csv('F:\\5_quant\\Chapter7_Algorithms and Numerical Methods\\300data.csv')
data0.index = pd.to_datetime(data0['Date'])
data0 = data0.dropna()

# calculate the cummulated return of HS300
data0['pct_chg'] = data0['pct_chg']/100 + 1
data0['retcum'] = data0['pct_chg'].cumprod()
plt.plot(data0['retcum'])
HS300cum.png

接着计算沪深300指数的最大回撤

drawndown,startdate,enddate = MaxDrawdown(data0['retcum'])

最大回撤结果为:72.30%。最大回撤开始日期为:
Timestamp('2007-10-16 00:00:00')
最大回撤结束日期为:
Timestamp('2008-11-04 00:00:00')

可以看出,直接投资指数会有较大的回撤。需要进一步地控制风险

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容