应用xts的函数

时间:2012-07-21 07:05:02

标签: excel r xts zoo

我的数据目前是每行每日股票价格的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。

我正在寻找的输出是:

  • 6/21/2012 = .11
  • 6/20/2012 = .27
  • 6/19/2012 = .46
  • 6/18/2012 = .39
  • 6/15/2012 = .22

2 个答案:

答案 0 :(得分:2)

如果没有确切的数据,很难确切地说出您的问题是什么,但问题似乎是rollapplyrollapply只会将函数应用于整个区间,除非参数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)

您可以使用diffrunSumrollapplyr

的组合
#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,则denomJrollapplyr都会在同一日期结束(这与使用rollapplyalign="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), ]
}