8、最大回撤
数据准备:
import pandas as pd
import numpy as np
df=pd.DataFrame({'pd_cd':['A','A','A','A','B','B','B','B'],
'trd_dt':[20170101,20170102,20170103,20170104,20170101,20170102,20170103,20170104],
'adj':[1.06,1.04,1.03,1.04,1.02,1.03,1.04,1.05]})
1.使用数组计算
自定义计算方法:
def getMaxDrawdown(x):
'''
:param x: 一组已经按照日期排好序的数组
:return: 最大回撤
'''
j = np.argmax((np.maximum.accumulate(x) - x) / x)#最大回撤率
# j = np.argmax(np.maximum.accumulate(x) - x) # 最大回撤
if j == 0:
return 0
i = np.argmax(x[:j])
d = (x[i] - x[j]) / x[i]
# d = (x[i] - x[j])
return float(-d)
def applyMaxDrawdown(x):
'''
:param x: 一个已经按照日期排好序的数据集
:return: 最大回撤值
'''
f = x.reset_index()
array = pd.Series(f['adj'])##此处要填写计算的列名
return getMaxDrawdown(array)
调用以上方法计算数据集的最大回撤:
#注意要先按日期排好序,否则计算的值不对
df=df.sort_values(by=['pd_cd','trd_dt'],ascending=True)
#以下两种方法调用均可
# df=df.groupby(by=['pd_cd'],as_index=False).agg({'adj':applyMaxDrawdown})
df=df.groupby(by=['pd_cd'],as_index=False).apply(lambda x:applyMaxDrawdown(x))