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

我熟悉这样一种普遍的看法,即矢量化解决方案会更好。
问题是:
我能把这个问题矢量化吗?
这个解决方案是什么样子的?
它有多有益?
编辑
我将Alexander的答案修改为以下函数:
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())

09-20 19:29