Как рассчитать MaximumDrawdown, используя Returns в Python

1

У меня есть final DataFrame с возвратом моего портфолио. Я пытаюсь вычислить MaxDrawdown с использованием возвратов. Я попробовал приведенный ниже код и видел много вопросов, связанных с stackexchange. Но не в состоянии решить это. Можно ли вычислить максимальный результат с использованием доходности портфеля.

              Returns
1/2/2009     0.030483579
1/5/2009     0.002872092
1/6/2009     0.01461333
1/7/2009    -0.032431836
1/8/2009     0.0055774
1/9/2009    -0.019844336
1/12/2009   -0.019705618
1/13/2009    0.001093185
1/14/2009   -0.032726765
1/15/2009    0.013635182
1/16/2009    0.009807648
1/20/2009   -0.044440252
1/21/2009    0.035156229
1/22/2009   -0.01460641
1/23/2009    0.007399468
1/26/2009    0.007910521
1/27/2009    0.007848472
1/28/2009    0.028944903
1/29/2009   -0.023816962
1/30/2009   -0.02550717
2/2/2009    -0.000292223
2/3/2009     0.020191091
2/4/2009    -7.93651E-06
2/5/2009     0.020070065
2/6/2009     0.026235957
2/9/2009    -0.001606124
2/10/2009   -0.03629415
2/11/2009    0.00248416
2/12/2009    0.001925152
2/13/2009   -0.00441840

Код:

cum_returns = (1 + final).cumprod()
drawdown =  1 - final.div(final.cummax())

Может ли кто-нибудь помочь мне в решении этого. Спасибо!

Теги:
pandas
quantitative-finance
finance

2 ответа

3
Лучший ответ

IIUC после cumprod добавления diff и мин является макс-дро вниз

(df.Returns+1).cumprod().diff().min()
Out[316]: -0.043177386133390616

Основываясь на определении MDD

s=(df.Returns+1).cumprod()
np.ptp(s)/s.max()
Out[319]: 0.11457761692384323
  • 0
    Спасибо за ответ! Как просадка может быть отрицательной ?? Можете ли вы объяснить более подробно, что делает код?
  • 0
    Я думаю, что расчет - это просадка, а не максимальная просадка. Поправьте меня если я не прав
Показать ещё 2 комментария
2

Вы можете получить фреймворк с максимальной суммой до даты, используя pandas.expanding() (doc), а затем примените max к окну.

pandas.expanding будет применять функцию в способе pandas.rolling, но с окном, которое начинается в начале фрейма данных и расширяется до текущей строки (подробнее об этих функциях Window здесь и pandas.expanding):

>> cum_returns = (1 + final).cumprod()
>> drawdown =  1 - final.div(final.cummax())
>> drawdown.expanding().max()

            Returns
1/2/2009   0.000000
1/5/2009   0.000000
1/6/2009   0.000000
1/7/2009   0.032432
1/8/2009   0.032432
1/9/2009   0.046343
1/12/2009  0.065136
1/13/2009  0.065136
1/14/2009  0.094742
1/15/2009  0.094742
1/16/2009  0.094742
1/20/2009  0.114578
1/21/2009  0.114578
1/22/2009  0.114578
1/23/2009  0.114578
1/26/2009  0.114578
1/27/2009  0.114578
1/28/2009  0.114578
1/29/2009  0.114578
1/30/2009  0.114578
2/2/2009   0.114578
2/3/2009   0.114578
2/4/2009   0.114578
2/5/2009   0.114578
2/6/2009   0.114578
2/9/2009   0.114578
2/10/2009  0.114578
2/11/2009  0.114578
2/12/2009  0.114578
2/13/2009  0.114578

Помещение просадок и Максимальное сокращение (MDD) вместе в кадре данных, чтобы вы могли сравнить результат:

>> df_dd =  pd.concat([drawdown, drawdown.expanding().max()], axis=1)

>> df_dd.columns = ['drawdown', 'MDD'] 

>> df_dd
           drawdown       MDD
1/2/2009   0.000000  0.000000
1/5/2009   0.000000  0.000000
1/6/2009   0.000000  0.000000
1/7/2009   0.032432  0.032432
1/8/2009   0.027035  0.032432
1/9/2009   0.046343  0.046343
1/12/2009  0.065136  0.065136
1/13/2009  0.064114  0.065136
1/14/2009  0.094742  0.094742
1/15/2009  0.082399  0.094742
1/16/2009  0.073399  0.094742
1/20/2009  0.114578  0.114578
1/21/2009  0.083450  0.114578
1/22/2009  0.096837  0.114578
1/23/2009  0.090154  0.114578
1/26/2009  0.082957  0.114578
1/27/2009  0.075759  0.114578
1/28/2009  0.049007  0.114578
1/29/2009  0.071657  0.114578
1/30/2009  0.095336  0.114578
2/2/2009   0.095601  0.114578
2/3/2009   0.077340  0.114578
2/4/2009   0.077347  0.114578
2/5/2009   0.058830  0.114578
2/6/2009   0.034137  0.114578
2/9/2009   0.035688  0.114578
2/10/2009  0.070687  0.114578
2/11/2009  0.068379  0.114578
2/12/2009  0.066585  0.114578
2/13/2009  0.070709  0.114578
  • 0
    Можете ли вы объяснить больше о коде. Это немного неясно
  • 1
    Добавил больше комментариев. У вас есть больше информации в ссылках.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню