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

Popular posts from this blog

javascript - Create a stacked percentage column -

Optimising Firebase database by automatically overwriting data -

javascript - Angular UI-Grid customTemplate directive causing rows to load slowly/? -