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

Reply via email to