numpy - Calculate max draw down with a vectorized solution in python -
maximum drawdown common risk metric used in quantitative finance assess largest negative return has been experienced.
recently, became impatient time calculate max drawdown using looped approach.
def max_dd_loop(returns): """returns assumed pandas series""" max_so_far = none start, end = none, none r = returns.add(1).cumprod() r_start in r.index: r_end in r.index: if r_start < r_end: current = r.ix[r_end] / r.ix[r_start] - 1 if (max_so_far none) or (current < max_so_far): max_so_far = current start, end = r_start, r_end return max_so_far, start, end i'm familiar common perception vectorized solution better.
the questions are:
- can vectorize problem?
- what solution like?
- how beneficial it?
edit
i modified alexander's answer following function:
def max_dd(returns): """assumes returns 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 assumed dataframe of returns, each column seperate strategy/manager/security, , each row new date (e.g. monthly or daily).
cum_returns = (1 + df_returns).cumprod() drawdown = 1 - cum_returns.div(cum_returns.cummax())
Comments
Post a Comment