3

我正在通过 quantmod 研究一些雅虎财务数据。

我如何不仅确定滚动数据窗口中的最高和最低价格,还确定这些高点和低点的确切时间戳?我试过 which.max() 与 rollapply 但这仅报告滚动窗口本身中值的序列,而不是包含时间戳的行的 .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

理想情况下,我采取的任何方法都必须考虑到常见的重复价格这一事实,在这种情况下,我会命令我的窗口采用最大值中的第一个和最小值中的最后一个。

4

2 回答 2

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"
于 2011-10-01T04:24:47.733 回答
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
于 2012-01-31T22:07:27.903 回答