ежемесячный возврат и неравная продолжительность месяца

У меня более 300 компаний, и мне нужно рассчитать для них ежемесячный доход, а затем использовать его в качестве одной из переменных в моем наборе данных. Я скачиваю цены с Yahoo и рассчитываю ежемесячный доход с помощью пакета Quantmod:

require(quantmod)    
stockData <- lapply(symbols,function(x) getSymbols(x,auto.assign=FALSE, src='yahoo', from = '2000-01-01'))
    stockDataReturn <- lapply(stockData,function(x) monthlyReturn(Ad(x))) 

Проблема, с которой я столкнулся, заключается в том, что у некоторых компаний есть разные дни окончания месяца (из-за остановок торговли и т. Д.), Что отражено в выходном списке: 2013-12-30 для компании AAA и 2013-12-31 для компании BBB и остальных. пример.

Когда я объединяю список, используя

returns <- do.call(merge.xts, stockDataReturn)

Создается отдельная строка за 30 декабря 2013 г. со всеми НП, кроме компании AAA. Как я могу это решить? Я понимаю, что мне нужно придерживаться формата месяц-год, который мне нужно использовать в качестве индекса перед слиянием.

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


person m45ha    schedule 11.12.2016    source источник


Ответы (1)


Вы можете использовать floor_date lubridate для слияния с той же меткой времени начала месяца, а не меткой времени конца месяца. Или используйте ceiling date для округления до одной и той же метки времени конца месяца для всех ценных бумаг перед слиянием.

library(lubridate)
stockDataReturn <- lapply(stockDataReturn,
                              function(x) {
                                  index(x) <- floor_date(index(x), "month")
                                  # Or if you want to round to end of month change to:
                                  # index(x) <- ceiling_date(index(x), "month")
                                  x
                              })
returns <- do.call(merge, stockDataReturn)
colnames(returns) <- symbols
person FXQuantTrader    schedule 11.12.2016
comment
Это очень полезно. Как получить последний день месяца? ceiling_date(index(x), "month") -1? - person R.S.; 11.12.2016
comment
@ R.S. Да, это может работать с объектами даты в векторе индекса, но более безопасный подход, который работает с объектами POSIXct в векторе индекса, - это index(x) <- ceiling_date(index(x), "month") - days(1) - person FXQuantTrader; 12.12.2016
comment
@FXQuantTrader ОК. Спасибо. - person R.S.; 12.12.2016
comment
Вы можете работать с yearmon индексным классом (?yearmon). - person hvollmeier; 12.12.2016