1

私の動物園シリーズで performanceAnalytics を使用することができず、独自のスクリプトを作成することにしました。

最長のドローダウンを計算する場合は、入力として cummax(equity)-equity を取得する必要があります。また、これらの期間の最大ドローダウン値も示します。

修正版は以下。

私のスクリプトを確認してください。期待どおりに動作しません。一部の maxDD はゼロです。他の人にも役立つことを願っています。人々がこのようなものを探しているフォーラムで、多くのメッセージを見てきました。

私はリッチーの提案でそれを修正しました:

  findDD <- function(DD, n=5){
  rr <- rle(sign(coredata(DD)))
  lens <- rr$length
  lens[!rr$value] <- 0
  ll <- head(order(lens, decreasing=TRUE),n)
  sumas <- cumsum(c(1,rr$length)) # I need to access the original lenghts 
  maxDD <- sapply(ll,FUN = function(x) max(window(DD,start=index(DD)[sumas[x]],end=index(DD)[sumas[x+1]-1])))
  data.frame(start=index(DD)[sumas[ll]],end=index(DD)[sumas[ll+1]-1], length=(index(DD)[sumas[ll+1]-1]-index(DD)[sumas[ll]])+1, maxDD)
}

また、index(DD)[] の代わりに index(DD[]) を書いていたため、順序付けされた回答が得られなかった問題を修正しました。

今はうまくいっているようですが、よくわかりません。

Joshua へ: 最初は、私のデータは cron インデックスの Zoo でしたが、今は posixct インデックスの xts に変換しました。

"2010-01-11 18:00:00" 9338.37028375963
"2010-01-11 18:15:00" 8086.45780960387
"2010-01-11 18:30:00" 7762.75622449016
"2010-01-11 18:45:00" 8358.3609798313
"2010-01-11 19:00:00" 8598.69695502083
"2010-01-11 19:15:00" 8568.56256494502
"2010-01-11 19:30:00" 8488.4281748692
...

performanceAnalytics ではまだ機能しませんが、グラフ化して自分で計算を行うことはできます。Drawdown(myData) は、すべてのデータ値が NaN の xts シリーズを返します。私は findDrawdown コードを見てきましたが、絶対的なドローダウンではなく相対的なドローダウンを測定するため、私のものとは異なります。

とにかく、私のスクリプトが誰かの役に立つことを願っています。

4

3 に答える 3

3

tseriesパッケージの古い関数を見ることができmaxdrawdownます。マニュアルページの例を次に示します。

mxdrwdR> # Realistic example
mxdrwdR> data(EuStockMarkets)

mxdrwdR> dax <- log(EuStockMarkets[,"DAX"])

mxdrwdR> mdd <- maxdrawdown(dax)

mxdrwdR> mdd
$maxdrawdown
[1] 0.25647

$from
[1] 236

$to
[1] 331
于 2010-11-23T12:57:05.907 に答える
1

PerformanceAnalyticsの関数は、chronをインデックスとして使用する場合にのみ失敗します。以前、zoo/xtsインデックス値をchronに依存しないように提案しました。

このエラーは、それが機能しない理由のヒントを示しています。「行名は、「1985-03-15」などの標準の日付形式である必要があります」。chronは標準の日付形式を使用しないため、エラーが発生します。

library(quantmod)
library(PerformanceAnalytics)
library(chron)

getSymbols("SPY")
r <- na.omit(ROC(Cl(SPY)))
# xts object with 'Date' index
str(SPY)
table.Drawdowns(r)
table.Drawdowns(as.zoo(r))
# convert index to chron
index(r) <- as.chron(index(r))
table.Drawdowns(r)          # fails
table.Drawdowns(as.zoo(r))  # fails
# convert index to POSIXct
index(r) <- as.POSIXct(index(r))
table.Drawdowns(r)
table.Drawdowns(as.zoo(r))
于 2010-11-24T13:28:12.167 に答える
1

最大ドローダウンについては何も知りませんが、コードに関するいくつかの考えを以下に示します。


入力がどのような形式になるかは完全には明らかではありませんDD。正しい形式であることを確認するために、入力チェックが必要になる場合があります。


rr <- rle(coredata(sign(DD)))

この関数をオーバーロードしていない限りsign、数値ベクトル (-1、0、および 1 を含む) を返します。ということsign(coredata(DD))ですか?


lens[rr$value == FALSE] <- 0

変数を定義しますlensが、後で使用に戻りrr$lengthます。


rr$value == FALSE

!rr$value代わりに使用してください。それはより明確です。


ll <- head(order(rr$length, decreasing=TRUE),5)

これがメソッドの中心にあるのかどうかはわかりませんが、5 にハードコーディングするのではなく、ユーザーが関数に使用される最長実行回数を入力できるようにすることをお勧めします。


スペースを入れる場所に一貫性があると、コードが読みやすくなります。個人的には、カンマの後のスペースと演算子の前後のスペースが好きです。

于 2010-11-23T16:39:22.773 に答える