2013-03-07 6 views
2

Предположим, мы имеем XTS объект OHLC возвращает серию для SPX (SPX)Динамический период Подменю через XTS в R

Если бы я хотел, чтобы динамически Подмножество эти возвращения, так что мы могли бы, скажем, подмножество период с Business Day 9 из каждый месяц до 2 business days before the end of the month, что было бы самым эффективным способом сделать это с помощью xts?

Я пытался играть с гнездятся некоторые комбинации .index/xts функций, таких как

SPX[.indexmday(SPX)==1] 

, а также некоторые функции даты из RQuantLib и lubridate, но с разной степенью успеха.

Я уверен, что есть довольно удобный и эффективный способ сделать это. Любой совет очень ценится!

+0

Это ежедневные данные? – GSee

ответ

3

Вот способ, используя отрицательные значения для head и tail:

SPX <- getSymbols("^GSPC", src="yahoo", auto.assign=FALSE) 
do.call(rbind, lapply(split(SPX, 'months'), function(x) tail(head(x, -2), -9))) 

Он расщепляется «месяцев», а затем применяет функцию каждого месяца. Функция получает все, кроме первых 9 дней, за исключением последних двух дней в xts. Наконец, rbind результаты объединены в один объект xts.

Edit:

Вы можете использовать xts::first и xts::last вместо head и tail так, что он будет работать с другими, чем ежедневно частот.

do.call(rbind, lapply(split(SPX, 'months'), function(x) { 
    first(xts::last(x, "-2 days"), "-9 days") 
})) 

Обновление адреса комментарий:

Если вы хотите выполнить другие операции на подмножествах, вам нужно проверить, чтобы убедиться, что есть по крайней мере одна строка данных. Если в течение определенного месяца нет дней в вашем объекте xts после 9-го и до второго-последнего дня, анонимная функция выше вернет NULL.

do.call(rbind, lapply(split(SPX, 'months'), function(x) { 
    dat <- first(xts::last(x, "-2 days"), "-9 days") 
    if (NROW(dat) > 0) OpCl(dat) 
})) 

Хотя, в этом случае, вы можете просто позвонить OpCl() по результатам моего первоначального ответа, чтобы получить тот же результат.

tmp <- do.call(rbind, lapply(split(SPX, 'months'), function(x) { 
    first(xts::last(x, "-2 days"), "-9 days") 
})) 
OpCl(tmp) 
+0

Пока мы находимся в этом, как вы думаете, лучший метод получения OpCl (или любой другой стандартной периодичности) возвращается для каждого подпериода через ваш метод? т.е. вместо того, чтобы возвращать только временные ряды цен для каждого подпериода, вы заканчиваете объект, возвращающий OpCl? –

Смежные вопросы