Проблема извлечения данных Bloomberg в R с использованием bplpapi, данные не заполняются, а возвращенная дата начала неверна

Для всех пользователей Bloomberg и R:

Обычно у меня нет проблем с извлечением данных Bloomberg в R через пакет Rblpapi, но я столкнулся с проблемой при попытке получить данные на уровне индекса.

Проблема в том, что приведенный ниже код возвращает ошибочные результаты, поскольку он начинает извлекать данные, начиная с 1986 года (а не с 1950 года), и оставляет много значений NA, которые следует заполнить. Используя API Excel, данные обрабатываются нормально, но мне нужно добавить «days = a» для некоторых полей, так как они начинаются только после 1950 года.

Воспроизводимый пример (при условии, что у вас есть доступ к Bloomberg):

    # Load packages  ----------------------------------------------------------
library("Rblpapi")
library("tidyverse")
library("lubridate")

# Connect to Bloomberg --------------------------------------------------
blpConnect()


# Pull equity index-level specific data over time for S&P 500, S&P Mid Cap (400) and S&P Small Cap (600) indices  ---------------------- 

# Index tickers
tickers <- c("SPX Index", "MID Index", "SML Index")


# Bloomberg inputs 
myField <- c("PX_LAST", "TRAIL_12M_EPS", "TRAIL_12M_DILUTED_EPS", "BEST_EPS", "PE_RATIO", "BEST_PE_RATIO", 
             "TRAIL_12M_EBITDA_PER_SHARE",  "PX_TO_EBITDA", "PX_TO_BOOK_RATIO", "PX_TO_SALES_RATIO",
             "PX_TO_FREE_CASH_FLOW", "EQY_DVD_YLD_12M", "TOT_DEBT_TO_EBITDA", "EV_TO_T12M_SALES", "EV_TO_T12M_EBITDA",
             "TRAIL_12M_GROSS_MARGIN", "EBITDA_MARGIN", "TRAIL_12M_OPER_MARGIN", "TRAIL_12M_PROF_MARGIN",
             "RETURN_ON_ASSET", "RETURN_COM_EQY",  "RETURN_ON_CAP", "NET_DEBT_TO_EBITDA", "CUR_MKT_CAP", "AVERAGE_MARKET_CAP"
             )

# Pull data
sp_indices_fundmtls_raw <- as.data.frame(bdh(tickers,
                                             myField,
                                             start.date = as.Date("1950-01-01"),
                                             end.date   = Sys.Date(),
                                             include.non.trading.days = TRUE
                                             )
                                         )

Поскольку это не сработало, я попытался просто извлечь данные, используя только индекс SPX. Та же проблема. Затем я попробовал формулу с меньшим количеством бегущих строк

# Bloomberg inputs 
myField <- c("PX_LAST", "TRAIL_12M_EPS", "TRAIL_12M_DILUTED_EPS", "BEST_EPS", "PE_RATIO", "BEST_PE_RATIO", 
             "TRAIL_12M_EBITDA_PER_SHARE",  "PX_TO_EBITDA", "PX_TO_BOOK_RATIO", "PX_TO_SALES_RATIO",
             "PX_TO_FREE_CASH_FLOW", "EQY_DVD_YLD_12M",
             "TOT_DEBT_TO_EBITDA", "EV_TO_T12M_SALES", "EV_TO_T12M_EBITDA"
             )

Это сработало лучше, но все же началось в 1964 году, а не в 1950 году. Опять же, API Excel работает нормально и просто возвращает NA, если данные отсутствуют раньше, как я ожидал от R.

Это заставляет меня думать, что должно быть поле, которое требует опции или переопределения для правильного извлечения данных. Я пробовал добавить

ovrd <- c("PERIODICITY_OVERRIDE" = "D")


# Pull data
sp_indices_fundmtls_raw <- as.data.frame(bdh(tickers,
                                             myField,
                                             start.date = as.Date("1950-01-01"),
                                             end.date   = Sys.Date(),
                                             include.non.trading.days = TRUE,
                                             overrides = ovrd

                                             )
                                         )

Но не повезло.

Кто-нибудь может разобраться в проблеме?

Спасибо!


person DaveM    schedule 19.08.2019    source источник
comment
Я также должен добавить, что пробовал opt ‹- c (perioditySelection = DAILY) и поместил это в команду bdh, но это тоже не сработало.   -  person DaveM    schedule 19.08.2019


Ответы (1)


После долгих проб и ошибок я нашел способ получить данные.

Я создал функцию для извлечения данных:

      # Function to pull data
sp_indices_pull_fx <- function(myField, index_ticker) {
  df <- as.data.frame(bdh(index_ticker,
                          myField,
                          start.date = as.Date("1950-01-01"),
                          end.date   = Sys.Date(),
                          include.non.trading.days = TRUE
                          )
                      )

Затем я использовал lapply для циклического перебора каждого тикера. Например:

    # SP500
sp_500_pull      <- lapply(myField, sp_indices_pull_fx, index_ticker = "SPX Index")

Затем я объединил эти результаты в единый фрейм данных:

  # Merge
sp_500_fundmtls_raw      = Reduce(function(...) merge(..., all = TRUE), sp_500_pull)

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

person DaveM    schedule 20.08.2019