Calculation of max. drawdown of an individual equity curve works as follows:
equity = 100 // arbitrary start value maxValue = equity maxDD = 1.0 // no drawdown foreach (ret in eqCurve) { equity *= ret if (equity > maxValue) maxValue = equity else { dd = equity / maxValue if (dd < maxDD) maxDD = dd } } return maxDD
Now we have access to the estimated drawdown at a given percentile level:
double MaxDDP(percentile) { idx = Round( ddList.Count * percentile/100.0 ) return 100.0 * (1.0 + ddList[idx]) // as a positive percentage }
System Quality Algorithm as Pseudo Code
Input is a sequence of daily account values, typically in dollars.
// Create a list of daily returns for ( all account values ) ReturnsList.Add( av[i] / av[i-1] ) // Bootstrap for( all bootstrap iterations ) { // build a one year synthetic equity curve from three day segments for(segment=0; segment < 252/3; segment++) { // random selection of segment idx = Random(0 .. ReturnsList.Count-2) eqCurve.Add( ReturnsList[idx] ) eqCurve.Add( ReturnsList[idx+1] ) eqCurve.Add( ReturnsList[idx+2] ) } // calculate max DD of synthetic equity curve maxDD = MaxDD(eqCurve) ddlist.Add(maxDD) } Sort(ddList)