Gunther is quite correct. I should have said I had written something API-compatible.
Adrian's worakround suggestion of using log() with the current version of maxdrawdown() works nicely, of course. I would suggest, however, that working in proportional [rather than absolute] terms be the default behavior of the maxdrawdown() function, as that is industry convention. If changing the behavior is unacceptable, the absolute-drawdown gotcha should at the least be extremely clearly documented. It already caused me to misquote drawdowns in a backtest to my boss!! -- Brian K. Boonstra Adrian Trapletti wrote: >> >> Regarding the upwardly compatible comment, the dollar drawdown that >> corresponds to the maximum fractional drawdown is not necessarily the >> maximum dollar drawdown. >> >> For example, in this situation the maximum fractional drawdown >> is from 100 to 75 but the maximum dollar drawdown is from 200 >> to 160. >> >>> x <- c(1, 100, 75, 200, 160) >> >> > > What type of drawdown to work with depends on the context. If working > in percent is more appropriate, then you might use > > maxdrawdown(log(x))$maxdrawdown > > or if log returns are not appropriate then the following > transformation provides the equivalent what was suggested > > -(exp(-maxdrawdown(log(x))$maxdrawdown)-1) > > > Best regards > Adrian > >>> maximumdrawdown(x) # function defined in post >> >> $maximumdrawdown >> [1] 0.25 >> >> $maxdrawdown >> [1] 25 >> >> $from >> [1] 2 >> >> $to >> [1] 3 >> >>> maxdrawdown(x) # function from tseries >> >> $maxdrawdown >> [1] 40 >> >> $from >> [1] 4 >> >> $to >> [1] 5 >> >> On 5/17/06, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: >> >>> Full_Name: Brian K. Boonstra >>> Version: 2.2.1 >>> OS: WinXP, OSX >>> Submission from: (NULL) (63.172.178.137) >>> >>> >>> The maxdrawdown function in tseries defines the maximum drawdown in >>> terms of >>> absolute dollars (or whatever units the input is in). Industry >>> convention is to >>> do this in percentage terms. I have written the code below as >>> maximumdrawdown(), which retains backward compatibility with the >>> current >>> version. It has the flaw that it does not check for zero or >>> negative values. >>> >>> maximumdrawdown <- function (x) >>> { >>> if (NCOL(x) > 1) >>> stop("x is not a vector or univariate time series") >>> if (any(is.na(x))) >>> stop("NAs in x") >>> cminx <- x/cummax(x) >>> mdd <- min(cminx) >>> to <- which(mdd == cminx) >>> from <- double(NROW(to)) >>> for (i in 1:NROW(to)) { >>> from[i] <- max( which(cminx[1:to[i]] == 1) ) >>> } >>> return(list(maximumdrawdown = 1-mdd, maxdrawdown = >>> (1-mdd)*x[from], from = >>> from, to = to)) >>> } >>> >>> ______________________________________________ >>> R-devel@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >>> >> >> > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel