Я столкнулся с очень странной проблемой при работе с данными FRED через пакет quantmod.Я загружаю временные ряды SP500 с сайта и преобразую их в ежеквартальные изменения индекса в годовом исчислении, используя следующий код:
load_pkgs <- function(pkgs){
for(pkg in pkgs){
if(!(require(pkg, character.only=TRUE))){
install.packages(pkg)
library(pkg, character.only=TRUE)
}
}
}
load_fred_data <- function(series, new_names=NULL){
#' loads FRED data series specified in series and renames them to
#' new_names if given
#' if zoo object created does not have the same number of columns as
#' new_names' length, new_names is ignored
#' =================================================================
if(length(series) > 1){
z <- lapply(
series,
getSymbols,
src = 'FRED',
auto.assign = FALSE,
return.class = 'zoo'
) %>% do.call('merge', .)
} else {
z <- getSymbols(
series,
src = 'FRED',
auto.assign = FALSE,
return.class = 'zoo'
)
}
if(length(colnames(z) == length(new_names))){
colnames(z) <- new_names
}
return(z)
}
convert_monthly_level <- function(series){
#' takes as input a series of monthly values and returns a series of
#' quarterly YoY percent changes
#' geometric average of monthly YoY percent changes is used
#' =================================================================
series <- diff(series, lag = 12, arithmetic = F)
series <- (series * Lag(series, k = 1) * Lag(series, k = 2))^(1/3) - 1
index(series) <- index(series) %m-% months(3)
series <- series[month(index(series)) %in% c(1, 4, 7, 10)]
return(series)
}
load_pkgs(
c('downloader', 'dplyr', 'lubridate', 'quantmod', 'tseries', 'zoo')
)
sp <- load_fred_data('SP500') %>%
to.monthly
index(sp) <- as.Date(index(sp))
sp <- apply(sp, 2, function(x) zoo(x, order.by = index(sp)) %>% convert_monthly_level) %>%
zoo(order.by = as.Date(index(to.quarterly(sp))))
sp <- window(sp, start = core_st, end = core_end)
Когда я запускаю этот код, я получаю ежеквартальное возвращениезоопарк ряд годовых тенденций OHLC, но записи на 2017-10-01 являются NA, когда они не должны быть.Я подтвердил, что это происходит в zoo(order.by = as.Date(index(to.quarterly(sp))))
.Результат оператора apply точно такой, как я ожидал, а результат оператора, который я использую для создания индекса нового объекта zoo, точно такой, как я ожидал.Что-то теряется в переводе.Кроме того, это происходит по крайней мере с одной другой серией FRED, CCSA (Заявления о безработице).Может кто-нибудь помочь мне исправить эту ошибку?