使用python中的矢量化解决方案计算最大下拉

最大支取是量化金融中常用的风险度量,用于评估经历过的最大负回报

最近,我对使用循环方法计算最大压降的时间感到不耐烦

def max\u dd\u循环(返回):
“”“假定返回是一个系列”“”
到目前为止的最大值=无
开始,结束=无,无
r=returns.add(1).cumprod()
对于r_,从r.index开始:
对于r索引中的r_端:
如果r_启动<完:
电流=r.ix[r\u结束]/r.ix[r\u开始]-1
如果(最大到目前为止为无)或(当前<最大到目前为止):
最大到目前为止=电流
开始,结束=r\u开始,r\u结束
返回到目前为止的最大值,开始,结束

我熟悉一种普遍的看法,即矢量化解决方案会更好

问题是:

  • 我可以矢量化这个问题吗
  • 这个解决方案看起来像什么
  • 它有多大的好处

编辑

我将Alexander的答案修改为以下函数:

def max\u dd(返回值):
“”“假定返回是一个系列”“”
r=returns.add(1).cumprod()
dd=r.div(r.cummax()).sub(1)
mdd=dd.min()
end=dd.argmin()
start=r.loc[:end].argmax()
返回mdd、开始、结束

df_returns被假定为一个返回数据框架,其中每列是一个单独的策略/经理/安全,每行是一个新日期(例如每月或每天)

cum_returns=(1+df_returns).cumprod()
提取=1-cum_returns.div(cum_returns.cummax())

发表评论