最大回撤
最大回撤是指:在任一时间点向后推,产品净值到达最低点时,收益率回撤幅度的最大值。这一指标描述了投资者买入某资产可能出现的最为糟糕的情况。
公式:
即,最大回撤是在每一个时间点上向后求其跌幅,然后找出最大的。从公式的第二个等式,我们首先给出最大回撤的一个直观算法
最大回撤的算法
一、首先给出计算最大回撤的一个算法(先找出累计收益率的波峰点,在向后寻找最大的跌幅,即为最大回撤)
- 将累计收益率按照日期进行排列;
- 接着找到所有波峰的点,即当日的累计收益率大于前一日累计收益率的点,并用数组记录下来,命名为
- 接着在第二步得到的每一个"波峰"处,向后寻找跌幅最大的那个点,即为最大回撤
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'])
接着计算沪深300指数的最大回撤
drawndown,startdate,enddate = MaxDrawdown(data0['retcum'])
最大回撤结果为:72.30%。最大回撤开始日期为:
Timestamp('2007-10-16 00:00:00')
最大回撤结束日期为:
Timestamp('2008-11-04 00:00:00')
可以看出,直接投资指数会有较大的回撤。需要进一步地控制风险