Start, End and Duration of Maximum Drawdown in Python

匿名 (未验证) 提交于 2019-12-03 01:14:02

问题:

Given a time series, I want to calculate the maximum drawdown, and I also want to locate the beginning and end points of the maximum drawdown so I can calculate the duration. I want to mark the beginning and end of the drawdown on a plot of the timeseries like this:

a busy cat http://oi61.tinypic.com/r9h4er.jpg

So far I've got code to generate a random time series, and I've got code to calculate the max drawdown. If anyone knows how to identify the places where the drawdown begins and ends, I'd really appreciate it!

import pandas as pd import matplotlib.pyplot as plt import numpy as np  # create random walk which I want to calculate maximum drawdown for:  T = 50 mu = 0.05 sigma = 0.2 S0 = 20 dt = 0.01 N = round(T/dt) t = np.linspace(0, T, N) W = np.random.standard_normal(size = N)  W = np.cumsum(W)*np.sqrt(dt) ### standard brownian motion ### X = (mu-0.5*sigma**2)*t + sigma*W   S = S0*np.exp(X) ### geometric brownian motion ### plt.plot(S)  # Max drawdown function        def max_drawdown(X):     mdd = 0     peak = X[0]     for x in X:         if x > peak:              peak = x         dd = (peak - x) / peak         if dd > mdd:             mdd = dd     return mdd      drawSeries = max_drawdown(S) MaxDD = abs(drawSeries.min()*100) print MaxDD   plt.show()

回答1:

Just find out where running maximum minus current value is largest:

n = 1000 xs = np.random.randn(n).cumsum() i = np.argmax(np.maximum.accumulate(xs) - xs) # end of the period j = np.argmax(xs[:i]) # start of period  plt.plot(xs) plt.plot([i, j], [xs[i], xs[j]], 'o', color='Red', markersize=10)



回答2:

Your max_drawdown already keeps track of the peak location. Modify the if to also store the end location mdd_end when it stores mdd, and return mdd, peak, mdd_end.



回答3:

on the back of this I added unerwater analysis if that helps anyone...

def drawdowns(equity_curve):     i = np.argmax(np.maximum.accumulate(equity_curve.values) - equity_curve.values) # end of the period     j = np.argmax(equity_curve.values[:i]) # start of period      drawdown=abs(100.0*(equity_curve[i]-equity_curve[j]))      DT=equity_curve.index.values      start_dt=pd.to_datetime(str(DT[j]))     MDD_start=start_dt.strftime ("%Y-%m-%d")       end_dt=pd.to_datetime(str(DT[i]))     MDD_end=end_dt.strftime ("%Y-%m-%d")       NOW=pd.to_datetime(str(DT[-1]))     NOW=NOW.strftime ("%Y-%m-%d")      MDD_duration=np.busday_count(MDD_start, MDD_e  
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!