Вы можете использовать комбинацию 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
с align="right"
).
end(numerJ); end(denomJ)
#[1] "2012-07-20"
#[1] "2012-07-20"
Ошибка Yahoo
Возможно, проблема, с которой вы столкнулись, связана с ошибкой Yahoo, из-за которой иногда — например, прямо сейчас — Yahoo дублирует последнюю (в хронологическом порядке) строку данных. Если это так, попробуйте удалить повторяющуюся строку, прежде чем пытаться использовать данные для своих расчетов.
tidx <- tail(index(closePrices), 2)
if(tidx[1] == tidx[2]) {
closePrices <- closePrices[-NROW(closePrices), ]
}
person
GSee
schedule
21.07.2012
align=right
в вашем вызовеrollapply
(или использовать оболочкуrollapplyr
). См.?rollapply
- person GSee   schedule 21.07.2012rollapply
, поэтому по умолчанию вы получилиalign = "center"
. Может быть, вы хотитеalign="left"
илиalign="right"
вrollapply
или, может быть, вы хотитеlag
на какую-то другую сумму. - person G. Grothendieck   schedule 22.07.2012