Основной вопрос о том, как получить следующий / предыдущий элемент в XTS - PullRequest
2 голосов
/ 25 февраля 2011

У меня очень простой вопрос ... Предположим, я могу получить цену закрытия для определенного символа для текущей даты в объекте xts, используя

closePrice<-as.double(Cl(get(symbol))[currentDate]) 

Как я могу получить цену закрытия в первый торговый деньдень, два дня, три дня, ... или n дней до / после?

closePriceNDaysBefore<-as.double(Cl(get(symbol))[currentDate - n]) 

не в порядке ...

Заранее спасибо.

С уважением, Само.

Ответы [ 4 ]

3 голосов
/ 25 февраля 2011

Вы можете сделать это довольно легко, в зависимости от того, что вы подразумеваете под «текущей датой».

Если текущая дата - это последняя запись (только что обновленные данные), то последняя и первая помогут:

> x <- xts(1:10, Sys.Date()-0:9)
> x <- xts(1:10, Sys.Date()-0:9)
> x
           [,1]
2011-02-16   10
2011-02-17    9
2011-02-18    8
2011-02-19    7
2011-02-20    6
2011-02-21    5
2011-02-22    4
2011-02-23    3
2011-02-24    2
2011-02-25    1

# gets the last 3 periods (days here)
> last(x,3)  # or last(x, "3 days")
           [,1]
2011-02-23    3
2011-02-24    2
2011-02-25    1

# this would get you the 3rd day back from the end
> first(last(x,3),1)
           [,1]
2011-02-23    3

Если вместо этого вам нужно, чтобы текущая дата означала что-то вроде даты, о которой вы заботитесь в этом конкретном цикле / контексте, аргумент which.i = TRUE для подмножества поможет- поскольку он использует тот же самый быстрый поиск ISO, но возвращает позиции, которые соответствуют.То есть он не выполняет подмножество.

> x[x["2011-02-25", which.i=TRUE] - 0]  # today
           [,1]
2011-02-25    1

> x[x["2011-02-25", which.i=TRUE] - 1]  # yesterday
           [,1]
2011-02-24    2
> x[x["2011-02-25", which.i=TRUE] - 2]  # 2 days ago...
           [,1]
2011-02-23    3

> x[x["2011-02-25", which.i=TRUE] - 3]  # you get the idea ;-)
           [,1]
2011-02-22    4

> x["2011-02-25", which.i=TRUE] 
[1] 10
0 голосов
/ 25 февраля 2011

Полезно помнить, что вы можете сместить вектор в любом направлении, взяв его за хвост или за голову.В вашем случае добавьте NA в начале, потому что у первого дня нет «вчера».

M$Prev.Close <- c(NA, head(M$SPY.Close, -1))
0 голосов
/ 25 февраля 2011

Используйте which () и сопоставьте вашу строку даты с именами строк.Тогда результат является числовым и может быть обработан как числовой индекс:

M <- as.xts(read.table(textConnection(" SPY.Close    mavg      dn.1      up.1 
2010-11-18    119.96 120.713 118.17955 119.99845   
2010-11-19    120.29 120.470 118.33112 120.09688   
2010-11-22    120.19 120.240 118.47911 120.18489   
2010-11-23    118.45 119.924 118.55112 120.20888   
2010-11-24    120.20 119.734 118.63565 120.27635   
") ) )
> M[which(rownames(M)=="2010-11-22"), "SPY.Close"]
[1] 120.19
> M[which(rownames(M)=="2010-11-22")-1, "SPY.Close"]
[1] 120.29

Спасибо Дж. Винчестеру за то, что он указал, что объекты xts, созданные последовательным применением функций getSymbols и Cl из Quantmod, имеют пустое значение или NULL.имена строк, но функция time () может обращаться к этой информации и использоваться как:
which(as.character(time(M))=="2010-11-22")

0 голосов
/ 25 февраля 2011

Предполагая, что ваши данные являются ежедневными и включают в себя только торговые дни, откладывайте временной ряд перед поднабором.

closePriceNDaysBefore <- as.double(lag(Cl(get(symbol)),n)[currentDate])

Если это не сработает, пожалуйста, уточните структуру данных.

...