4

私はR(およびquantmod libを介した取引タスクへのその応用)を学び、コミュニティをかなり定期的に調べて、ここから多くの新しい知識とトリックを取得しています。R全般、特にquantmodlibについての私の印象-それは素晴らしいです。

この時点で、ベテランのRユーザーの助けが必要です。getSymbolsを介してダウンロードした時系列を使用しており、それぞれローカルの最小値/最大値から累積成長/ドローダウンを計算する必要があります。

FORサイクルを使用してタスクを解決することも、MS Excelで必要なモデリングを実行することもできますが、FORサイクルを必要とせず、Rでより「ネイティブ」なより単純なソリューションを見つけたいと思います。

例。入力データ:

20121121    79810
20121122    79100
20121123    80045
20121126    81020
20121127    80200
20121128    81350
20121129    81010
20121130    80550
20121203    80780
20121204    81700
20121205    83705
20121206    83350
20121207    83800
20121210    85385

結果:

            CLOSE   Cumulative gr/dd
20121121    79810   N/A
20121122    79100   0.58%
20121123    80045   1.55%
20121126    81020   2.37%
20121127    80200   -0.10%
20121128    81350   0.06%
20121129    81010   -0.76%
20121130    80550   -0.82%
20121203    80780   0.73%
20121204    81700   3.78%
20121205    83705   5.19%
20121206    83350   -1.50%
20121207    83800   1.67%
20121210    85385   2.22%
4

4 に答える 4

1

計算はすでに関数としてtseriesパッケージに含まれていますmaxdrawdown。これがその例の始まりです:

mxdrwdR> # Toy example
mxdrwdR> x <- c(1:10, 9:7, 8:14, 13:8, 9:20)

mxdrwdR> mdd <- maxdrawdown(x)

mxdrwdR> mdd
$maxdrawdown
[1] 6

$from
[1] 20

$to
[1] 26

これをパーセンテージに変換するのは非常に簡単です。関数自体の(短い)コードを見てください。

于 2013-02-06T20:41:36.517 に答える
1

Dirkの答えを補完するために、PerformanceAnalyticsパッケージにはさまざまなドローダウンオプションがあります。これは私のコードの一部からの抜粋であり、成長の計算(およびボーナスとしてのシャープレシオ)も示しています。

#x is an xts object containing OHLC data
profit=ROC(x$Close)
growth=sum(na.omit(profit)),
equity=exp(sum(na.omit(profit))),
sharpe=as.vector(SharpeRatio.annualized(profit)),
maxDrawdown=maxDrawdown(profit)
于 2013-02-07T10:31:41.690 に答える
1

最後に、私はそれを解決することができました。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
于 2013-02-10T13:33:39.230 に答える
1

ジグザグポイントを使用して山と谷を見つけ、パーセントの減少/増加を計算できます。例えば

    s <- get(getSymbols('goog'))["2012::"]
    z <- ZigZag(s[,2:3],10,percent=TRUE)
    # 10 in this example is the sensitivity to changes. 
    # if you want to use closing prices use s instad of s[,2:3]

    # extract the extreme points
    z <- rbind(z[findPeaks(z)-1],z[findValleys(z)-1])
    # calculate the difference
    names(z) <- c("zig")
    z$PercentChange <- ((z - Lag(z)) / z) * 100 

それが役に立てば幸い

于 2013-03-12T17:03:09.343 に答える