最後に、私はそれを解決することができました。DirkとDarren、コメントありがとうございます。PerformanceAnalyticsパッケージの「maxdrawdown」関数は私が必要としていたものではありませんでしたが、これによりPerformanceAnalyticsに注意を払い、このサイトとインターネットを検索しました。findDrawdownsは、私のニーズに近い同じパッケージから機能しますが、とにかく私が探していたものではありませんでした(新しいドローダウンの計算を開始するには、最後の高値を更新する必要がありますが、極大値と最小値を取得する必要があります考慮に入れる)。さらに試行錯誤しながら、FORサイクルなしで自分のタスクを解決する独自のコードを作成しました。:)これがコードです。ボーナスとして-それは資産の一定の成長/下降のバーの数でベクトルを返します。誰かがそれを改善する方法をアドバイスできれば幸いです。
library(rusquant)
library(quantmod)
library(tseries)
na.zero <- function(x) {
tmp <- x
tmp[is.na(tmp)] <- 0
return(tmp)
}
my.cumulative.grdd <- function(asset) {
# creating list for temporary data
tmp <- list()
#
# tmp$asset.lag <- na.locf(lag(asset), fromLast=TRUE)
# calculating ROC for the asset + getting ROC shifted by 1 element to the left and to the right
# to compare ROC[i] and ROC[i+1] and ROC[i-1]
tmp$asset.roc <- na.zero(ROC(asset))
tmp$asset.roc.lag <- na.zero(lag(tmp$asset.roc))
tmp$asset.roc.lag1 <- na.locf(lag(tmp$asset.roc, k=-1))
# calculating indices of consequent growth/drawdown waves start and end
tmp$indexfrom <- sapply(index(tmp$asset.roc[sign(tmp$asset.roc) * sign(tmp$asset.roc.lag) <= 0]), function(i) which(index(tmp$asset.roc) == i), simplify=TRUE)
tmp$indexto <- c(sapply(index(tmp$asset.roc[sign(tmp$asset.roc) * sign(tmp$asset.roc.lag1) <= 0]), function(i) which(index(tmp$asset.roc.lag1) == i), simplify=TRUE), length(index(tmp$asset.roc)))
# this is necessary to work around ROC[1] = 1
tmp$indexfrom <- tmp$indexfrom[-2]
tmp$indexto <- tmp$indexto[-1]
# calculating dates of waves start/end based on indices
tmp$datesfrom <- (sapply(tmp$indexfrom, FUN=function(x) format(index(asset)[x])))
tmp$datesto <- (sapply(tmp$indexto, FUN=function(x) format(index(asset)[x])))
tmp$dates <- apply(cbind(tmp$indexfrom, tmp$indexto), 2, FUN=function(x) format(index(asset)[x]))
# merging dates for selection (i.e. "2012-01-02::2012-01-05") and calculation of cumulative product
tmp$txtdates <- paste(tmp$datesfrom, tmp$datesto, sep="::")
# extracting consequent growth/drawdowns
tmp$drawdowns.sequences <- lapply(tmp$txtdates, function(i) tmp$asset.roc[i])
# calculating cumulative products for extracted sub-series
tmp$drawdowns.sequences.cumprods <- lapply(tmp$drawdowns.sequences, function(x) cumprod(1+x)-1)
# generating final result
result <- list()
result$len <- tmp$indexto - tmp$indexfrom + 1
result$cumgrdd <- xts(unlist(tmp$drawdowns.sequences.cumprods), index(tmp$asset.roc))
return(result)
}
# let's test
getSymbols("SPY", from="2012-01-01")
spy.cl <- Cl(SPY)
spy.grdd <- my.cumulative.grdd(spy.cl)
spy.grdd