Maximum Drawdown是用于量化金融的常见风险度量标准,用于评估已经历的最大负回报.
最近,我对使用循环方法计算最大缩幅的时间变得不耐烦了.
def max_dd_loop(returns):
"""returns is assumed to be a pandas series"""
max_so_far = None
start, end = None, None
r = returns.add(1).cumprod()
for r_start in r.index:
for r_end in r.index:
if r_start < r_end:
current = r.ix[r_end] / r.ix[r_start] - 1
if (max_so_far is None) or (current < max_so_far):
max_so_far = current
start, end = r_start, r_end
return max_so_far, start, end
我很熟悉矢量化解决方案会更好的普遍看法.
问题是:
>我可以矢量化这个问题吗?
>这个解决方案是什么样的?
>它有多益?
编辑
def max_dd(returns):
"""Assumes returns is a pandas Series"""
r = returns.add(1).cumprod()
dd = r.div(r.cummax()).sub(1)
mdd = dd.min()
end = dd.argmin()
start = r.loc[:end].argmax()
return mdd, start, end
解决方法:
df_returns被假定为返回的数据框,其中每列是单独的策略/经理/安全性,并且每行是新的日期(例如,每月或每天).
cum_returns = (1 + df_returns).cumprod()
drawdown = 1 - cum_returns.div(cum_returns.cummax())