我正在通过quantmod研究一些雅虎财务数据。
我如何确定滚动数据窗口的最高和最低价格,以及这些高点和低点的确切时间戳?我已尝试使用rollapply的which.max(),但这只报告滚动窗口本身的值的seq,而不是保存时间戳的行的.index()。
有人可以建议解决方案吗?
下面是一个可重复的例子,我希望有一些样本输出......
> library(quantmod)
> getSymbols("BET.L")
xmin <- rollapply(BET.L$BET.L.Close,10,min, ascending = TRUE)
names(xmin) <- "MinClose"
xmax <- rollapply(BET.L$BET.L.Close,10,max, ascending = TRUE)
names(xmax) <- "MaxClose"
head(cbind(BET.L$BET.L.Close, as.xts(xmax), as.xts(xmin)),15)
BET.L.Close MaxClose MinClose
2010-10-22 1550.00 NA NA
2010-10-25 1546.57 NA NA
2010-10-26 1545.00 NA NA
2010-10-27 1511.26 NA NA
2010-10-28 1490.00 1550.00 1395
2010-10-29 1435.00 1546.57 1381
2010-11-01 1447.00 1545.00 1347
2010-11-02 1420.00 1511.26 1347
2010-11-03 1407.00 1490.00 1347
2010-11-04 1395.00 1447.00 1347
2010-11-05 1381.00 1447.00 1347
2010-11-08 1347.00 1490.00 1347
2010-11-09 1415.00 1490.00 1347
2010-11-10 1426.00 1490.00 1347
2010-11-11 1430.00 1490.00 1347
我希望生成的输出类型如下所示:
BET.L.Close MaxClose MinClose MaxDate MinDate
2010-10-22 1550.00 NA NA NA NA
2010-10-25 1546.57 NA NA NA NA
2010-10-26 1545.00 NA NA NA NA
2010-10-27 1511.26 NA NA NA NA
2010-10-28 1490.00 1550.00 1395 2010-10-22 2010-11-04
2010-10-29 1435.00 1546.57 1381 2010-10-25 2010-11-05
理想情况下,我采取的任何方法都必须满足重复价格这一常见的事实,在这种情况下,我会命令我的窗口取第一个最大值和最后一个最小值。
答案 0 :(得分:3)
这个计划存在很大问题。 coredata元素是一个矩阵,因此所有元素必须是无类别的并且具有相同的模式。你不能在xts对象中拥有Date类的对象,如果你坚持使用一个字符类,那么它将强制所有其他元素也是字符。所以理解了它仍然可以通过计算which.max
结果来做某事,然后创建一个行号,which.max
- 值是一个偏移量,最后使用该结果作为索引进入对象的index
。 (对不起“which”和“index”的双重用法。希望代码中含义清楚。)
xmin <- rollapply(BET.L$BET.L.Close,10,min)
names(xmin) <- "MinClose"
xmax <- rollapply(BET.L$BET.L.Close,10,max, ascending = TRUE)
names(xmax) <- "MaxClose"
head(dat <- cbind(BET.L$BET.L.Close, as.xts(xmax), as.xts(xmin)),15))
w.MaxDate <- rollapply(BET.L$BET.L.Close,10, which.max)
names(w.MaxDate) <- "w.maxdt"
dat <- cbind(dat, as.xts(w.MaxDate) )
dat<-cbind(dat,as.xts(seq.int(236), order.by=index(dat)))
> head(dat)
BET.L.Close MaxClose MinClose w.maxdt ..2
2010-10-22 1550.00 NA NA NA 1
2010-10-25 1546.57 NA NA NA 2
2010-10-26 1545.00 NA NA NA 3
2010-10-27 1511.26 NA NA NA 4
2010-10-28 1490.00 1550.00 1395 1 5
2010-10-29 1435.00 1546.57 1381 1 6
dat$maxdate <- xts( index(dat)[dat$..2-5+dat$BET.L.Close.1], order.by=index(dat))
> head(dat)
BET.L.Close MaxClose MinClose w.maxdt ..2 maxdate
2010-10-22 1550.00 NA NA NA 1 NA
2010-10-25 1546.57 NA NA NA 2 NA
2010-10-26 1545.00 NA NA NA 3 NA
2010-10-27 1511.26 NA NA NA 4 NA
2010-10-28 1490.00 1550.00 1395 1 5 14904
2010-10-29 1435.00 1546.57 1381 1 6 14907
所以我得到了日期的整数表示。只需查看输入向量的头部,就可以看到它们是正确的值:
> head(index(dat)[dat$..2-5+dat$w.maxdt])
[1] NA NA NA NA "2010-10-22" "2010-10-25"
答案 1 :(得分:0)
我认为您可以向原始xts对象添加一个表示日期的数字列,然后使用rollapply。从下面的示例中查看 xminmax :
require(quantmod)
getSymbols("BET.L")
## add Date as numeric
BET.L$dt <- as.numeric(format(index(BET.L), "%Y%m%d"))
xmin <- rollapply(BET.L, 10, align='r', by.column = FALSE,
FUN = function(dw)
return(dw[which.min(dw[,'BET.L.Close']), c('BET.L.Close', 'dt')])
)
xmax <- rollapply(BET.L, 10, align='r', by.column = FALSE,
FUN = function(dw)
return(dw[which.max(dw[,'BET.L.Close']), c('BET.L.Close', 'dt')])
)
xminmax <- cbind(xmin, xmax)
## to get back to dates use:
## as.Date(as.character(as.integer(xminmax$dt.xmin)), format = "%Y%m%d")
## left edge of data window
x_ldt <- rollapply(BET.L$dt, 10, align='r', function(dw) return(dw[1]))
结果:
head(xminmax)
BET.L.Close.xmin dt.xmin BET.L.Close.xmax dt.xmax
2010-11-04 1395 20101104 1550.00 20101022
2010-11-05 1381 20101105 1546.57 20101025
2010-11-08 1347 20101108 1545.00 20101026
2010-11-09 1347 20101108 1511.26 20101027
2010-11-10 1347 20101108 1490.00 20101028
2010-11-11 1347 20101108 1447.00 20101101