2

私のデータは現在、行ごとの毎日の株価の xts または動物園オブジェクトであり、各列は異なる会社です。

library(quantmod)
getSymbols("AAPL;MSFT;YHOO")
closePrices <- merge(Cl(AAPL),Cl(MSFT),Cl(YHOO))

私はまだ R に不慣れで、このExcel 関数を再現するための支援が必要です。私が最初に考えたのは、関数を分子と分母に分割してから、インデックスを計算することでした。

dailyDiff <- abs(diff(closePrices,1))
numerJ <- diff(closePrices,10)
denomJ <- as.xts(rollapply(dailyDiff,11, sum))
idx <- abs(numerJ/denomJ)

各部分の値は正確でしたが、denomJ の日付が正しくないため、これは素晴らしいことでした。たとえば、numerJ の末尾は 2012 年 6 月 21 日になり、denomJ の末尾は 2012 年 6 月 14 日になります。

私が探している出力は次のとおりです。

  • 2012 年 6 月 21 日 = .11
  • 2012 年 6 月 20 日 = .27
  • 2012 年 6 月 19 日 = .46
  • 2012 年 6 月 18 日 = .39
  • 2012 年 6 月 15 日 = .22
4

2 に答える 2

2

正確なデータがなければ、問題が何であるかを正確に判断するのは困難ですが、問題はrollapply. 引数が に設定されてrollapplyいない限り、関数は区間全体にのみ適用されます。次の例を考えてみましょうpartialTRUE

require(zoo)
#make up some data
mat <- matrix(1:100,ncol=2)
colnames(mat) <- c("x1","x2")
dates <- seq.Date(from=as.Date("2010-01-01"),length.out=50,by="1 day")
zoo.obj <- zoo(mat,dates)
#apply the funcitons
numerJ <- diff(zoo.obj,10)  #dates okay
denomJ <- rollapply(zoo.obj,11, sum,partial=TRUE)  #right dates
denomJ2 <- rollapply(zoo.obj,11,sum) #wrong dates
index <- abs(numerJ/denomJ)  #right dates
于 2012-07-21T12:01:19.577 に答える
2

diffと または のいずれかrunSumを組み合わせて使用​​できます。rollapplyr

#Get the data
library(quantmod)
getSymbols("AAPL")

これがあなたがやろうとしていることだと思います( への引数と への引数の使用に注意してlagください)diff.xtsnrunSum

out <- diff(Cl(AAPL), lag=10) / runSum(abs(diff(Cl(AAPL))), n=11)
tail(out['/2012-06-21'])
#           AAPL.Close
#2012-06-14 -0.1047297
#2012-06-15  0.2176938
#2012-06-18  0.3888185
#2012-06-19  0.4585821
#2012-06-20  0.2653782
#2012-06-21  0.1117371

編集

rollapplyrあなたの質問を詳しく見てみると、あなたが求めている答えが ではない理由がわかりません。rollapplyに変更することを除いて、コードをrollapplyrそのまま使用すると、まさにあなたが探している出力のように見えます。

dailyDiff <- abs(diff(closePrices,1))
numerJ <- diff(closePrices,10)
denomJ <- as.xts(rollapplyr(dailyDiff,11, sum))
idx <- abs(numerJ/denomJ)
#           AAPL.Close MSFT.Close YHOO.Close
#2012-06-14  0.1047297 0.03826531 0.06936416
#2012-06-15  0.2176938 0.35280899 0.25581395
#2012-06-18  0.3888185 0.33161954 0.31372549
#2012-06-19  0.4585821 0.47096774 0.34375000
#2012-06-20  0.2653782 0.32644628 0.23750000
#2012-06-21  0.1117371 0.18997912 0.10256410

また、使用する場合は両方numerJdenomJ両方が同じ日付で終了することに注意してくださいrollapplyr(これはrollapplywithを使用するのと同じですalign="right"

end(numerJ); end(denomJ)
#[1] "2012-07-20"
#[1] "2012-07-20"

ヤフーバグ

おそらく、あなたが目にしている問題は、yahoo のバグで、たとえば現在、yahoo がデータの最後の (時系列で言えば) 行を複製することがあります。その場合は、計算にデータを使用する前に、重複した行を削除してみてください。

tidx <- tail(index(closePrices), 2)
if(tidx[1] == tidx[2]) {
  closePrices <- closePrices[-NROW(closePrices), ]
}
于 2012-07-21T19:42:54.207 に答える