[Rd] Convention difference in tseries.maxdrawdown (PR#8872)
B. Boonstra
forms at boonstra.org
Thu May 18 20:54:02 CEST 2006
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, rproject at boonstra.org <rproject at boonstra.org> 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 at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>
>>
>
More information about the R-devel
mailing list