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