Rollapply & XTS.Можно ли вывести время максимального значения в окне? - PullRequest
3 голосов
/ 30 сентября 2011

Я изучаю некоторые данные о финансах Yahoo с помощью QuantMod.

Как бы я определил не только максимальную и минимальную цену за скользящее окно данных, но также точную временную отметку этих максимумов и минимумов?Я попытался which.max () с rollapply, но это только сообщает 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

В идеале любой подход, который я использую, должен учитывать факт дублирования цен, который является обычным явлением, и в этом случае я бы приказал своему окну взять первоеиз максимальных значений и последнее из минимальных значений.

Ответы [ 2 ]

3 голосов
/ 01 октября 2011

Существует большая проблема с этим планом. Элемент coredata представляет собой матрицу, поэтому все элементы должны быть бесклассовыми и иметь одинаковый режим. Вы не можете иметь объекты класса Date в объекте xts, и если вы настаиваете на символьном классе, тогда все остальные элементы также будут символическими. Таким образом, с этим пониманием все еще возможно сделать что-то, вычислив результат 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"
0 голосов
/ 01 февраля 2012

Я думаю, что вы можете добавить еще один числовой столбец, представляющий дату, к вашему исходному объекту 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
...