diff
と または のいずれかrunSum
を組み合わせて使用できます。rollapplyr
#Get the data
library(quantmod)
getSymbols("AAPL")
これがあなたがやろうとしていることだと思います( への引数と への引数の使用に注意してlag
ください)diff.xts
n
runSum
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
また、使用する場合は両方numerJ
とdenomJ
両方が同じ日付で終了することに注意してくださいrollapplyr
(これはrollapply
withを使用するのと同じです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), ]
}