我的数据目前是每行每日股票价格的xts或zoo对象,每列都是不同的公司。
library(quantmod)
getSymbols("AAPL;MSFT;YHOO")
closePrices <- merge(Cl(AAPL),Cl(MSFT),Cl(YHOO))
我还是R的新手,需要一些帮助才能复制Excel function。我的第一个想法是将函数分成分子和分母,然后计算索引:
dailyDiff <- abs(diff(closePrices,1))
numerJ <- diff(closePrices,10)
denomJ <- as.xts(rollapply(dailyDiff,11, sum))
idx <- abs(numerJ/denomJ)
这很好,因为每个部分的值都是准确的,但是由denomJ的错误日期对齐。例如,numerJ的尾部转到6/21/2012,而denomJ的尾部转到6/14/2012。
我正在寻找的输出是:
答案 0 :(得分:2)
如果没有确切的数据,很难确切地说出您的问题是什么,但问题似乎是rollapply
。 rollapply
只会将函数应用于整个区间,除非参数partial
设置为TRUE
。请考虑以下示例
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
答案 1 :(得分:2)
您可以使用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 Bug
也许你看到的问题是雅虎的错误,有时候 - 例如,现在 - 雅虎重复最后一个(按时间顺序排列)的数据行。如果是这样,请在尝试使用数据进行计算之前尝试删除重复的行。
tidx <- tail(index(closePrices), 2)
if(tidx[1] == tidx[2]) {
closePrices <- closePrices[-NROW(closePrices), ]
}