Bloomberg data pull issue in R using bplpapi,数据未填充且返回的开始日期不正确

Bloomberg data pull issue in R using bplpapi, data not populating and start date returned is incorrect

所有 Bloomberg 和 R 用户:

我通常可以通过 Rblpapi 包将 Bloomberg 数据提取到 R 中,但在尝试提取索引级数据时遇到了 运行 问题。

问题是 return 下面的代码在开始提取 1986 年(而不是 1950 年)的数据时会产生错误结果,并且会留下许多应该填充的值 NA。使用 excel API,数据很好,但我需要为某些字段添加 "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 年。同样,excel API 工作正常,如果数据较早丢失,则 return NA 正如我预期的那样做。

这让我觉得必须有一个字段需要一个选项或一个覆盖来正确地提取数据。我尝试添加

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

                                             )
                                         )

但运气不好。

谁能解决这个问题?

谢谢!

经过反复试验,我找到了获取数据的方法。

我创建了一个函数来提取数据:

      # 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 函数一次提取多个代码。