Bloomberg R错误(缺少值,其中是真/假)

时间:2017-05-02 15:19:27

标签: r bloomberg

我在R中使用Bloomberg相对较新。我的代码的最后一部分看起来循环遍历FTSE100中的所有代码并检查每个公司的市值是否大于10亿:

它会抛出错误“缺少需要TRUE / FALSE的值”

如何解决此问题?

#######################################################################################
#install all packages and apply library
#######################################################################################
#install.packages("openxlsx")
library("openxlsx")
#install.packages("devtools")
library("devtools")
#install.packages("Rblpapi")
library("Rblpapi")
#install.packages("zoo")
library(zoo)
#install.packages("TTR")
library(TTR)
#install.packages("lubridate")
library("lubridate")
#install.packages("quantmod")
library("quantmod")
#install.packages("MASS")
library("MASS")
#install.packages("dplyr")
library("dplyr")
#install.packages("ggplot2")
library("ggplot2")

con <- blpConnect()
c <- 4800
b <- Sys.Date()-4
a <- b-c

###########################################################################################
# # performance periods.
###########################################################################################
onemonth <- b-(30)
threemonth <- b-(90)
sixmonth <- b-(180)
oneyear <- b-(365)

###########################################################################################
# # benchmark to retrieve members. For example this would be NMX and one below would be UKX
###########################################################################################
benchmark1 <- "ukx index"

###########################################################################################
# # benchmark to calculate returns. 
###########################################################################################
benchmark2 <- "ukx index"




#################################################################################################################
# # THIS IS THE CODE TO match time series to one data frame and one time series. 
#################################################################################################################
###########################################################################################
# # Initialise bbg code, drop the tickers into the bbg loop.. 
###########################################################################################



###########################################################################################
# # market one month return 
###########################################################################################
con <- blpConnect()

p1 <- bdh(benchmark2, 
          fields = c("PX_LAST"), 
          start.date = onemonth, end.date = b)
p1$date <- as.Date(p1$date, format = "%d/%m/%Y")
p1$PX_LAST <- as.numeric(p1$PX_LAST)

mktonemonthrtn <- (last(p1$PX_LAST))/(p1$PX_LAST[1])-1



###########################################################################################
# # market three month return 
###########################################################################################
con <- blpConnect()

p2 <- bdh(benchmark2, 
          fields = c("PX_LAST"), 
          start.date = threemonth, end.date = b)
p2$date <- as.Date(p2$date, format = "%d/%m/%Y")
p2$PX_LAST <- as.numeric(p2$PX_LAST)

mktthreemonthrtn <- last(p2$PX_LAST)/(p2$PX_LAST[1])-1



###########################################################################################
# # market six month return 
###########################################################################################
con <- blpConnect()

p3 <- bdh(benchmark2, 
          fields = c("PX_LAST"), 
          start.date = sixmonth, end.date = b)
p3$date <- as.Date(p3$date, format = "%d/%m/%Y")
p3$PX_LAST <- as.numeric(p3$PX_LAST)

mktsixmonthrtn <- last(p3$PX_LAST)/(p3$PX_LAST[1])-1



###########################################################################################
# # market one year return 
###########################################################################################
con <- blpConnect()

p4 <- bdh(benchmark2, 
          fields = c("PX_LAST"), 
          start.date = oneyear, end.date = b)
p4$date <- as.Date(p4$date, format = "%d/%m/%Y")
p4$PX_LAST <- as.numeric(p4$PX_LAST)

mktoneyearrtn <- last(p4$PX_LAST)/(p4$PX_LAST[1])-1






#########################################################################################################################
# # PULL IN ALL TICKERS FROM THE BROADMARKET INDEX.
#########################################################################################################################
p <- bds(benchmark1, "indx_mweight_hist", overrides = c(end_date_override="20170428"))
p$tickers <- paste(p$`Index Member`, " EQUITY")
p <- cbind(p[3], p[2])

tickers <- p[1]



#########################################################################################################################
# # CHECK THEIR LENGTH AND WHETHER IT IS VALID. CREATE FILTERED TICKERS.
#########################################################################################################################
filteredtickers <- rep(0, nrow(tickers))

con <- blpConnect()


for (i in 1:nrow(tickers)){
  q <- bdh(tickers[i,], 
           fields = c("CUR_MKT_CAP"), 
           start.date = a, end.date = b)
  q$date <- as.Date(q$date, format = "%d/%m/%Y")
  q$CUR_MKT_CAP <- as.numeric(q$CUR_MKT_CAP)
  #class(q) == "data.frame"
  qlength <- (last(q$CUR_MKT_CAP))/1000

  if (qlength > 1){
    print(tickers[i,])

    if(qlength > 1){
      filteredtickers[i] <-  tickers[i,]}

  }

}

t <- as.data.frame(filteredtickers, stringsAsFactors = FALSE)
t <- subset(t, filteredtickers!="0")
colnames(t) <- "tickers"

2 个答案:

答案 0 :(得分:0)

当{R}正在执行某种逻辑操作但缺少所需的数据时,通常会发生missing value where TRUE/FALSE needed错误。我猜测罪魁祸首是if (qlength > 1),因为qlength是根据q$CUR_MKT_CAP和您的评论计算出来的,这在此行数据中不存在。

所以解决方案真的取决于你需要做什么。如果合适,最简单的方法是使用

从输入数据集中删除此行(或类似的行)
tickers1 <- tickers[-i,]   # where i is the offending row number

tickers1 <- tickers[!is.na(tickers$CUR_MKT_CAP),]  # if this field is NA

然后从这里开始使用tickers1代替tickers(或者改为覆盖tickers)。

另一个选择是在循环中构建其他东西,使用try()(感谢PhilC)或逻辑检查将专门捕获引发错误的内容,例如

for (i in 1:nrow(tickers)){
  q <- bdh(tickers[i,], 
           fields = c("CUR_MKT_CAP"), 
           start.date = a, end.date = b)
  if(!is.na(q$CUR_MKT_CAP)) {   # possible error check?
    q$date <- as.Date(q$date, format = "%d/%m/%Y")
    q$CUR_MKT_CAP <- as.numeric(q$CUR_MKT_CAP)
    #class(q) == "data.frame"
    qlength <- (last(q$CUR_MKT_CAP))/1000
    if (qlength > 1){
      print(tickers[i,])
      if(qlength > 1){
        filteredtickers[i] <-  tickers[i,]}
      }
    }
  }
  # else {
  # ... operations to do instead? ...
  # }
}

希望这有帮助 -

答案 1 :(得分:0)

您最好在Bloomberg上使用EQS功能,并使用BEQS功能链接到已保存的搜索。这是在不久前引入Rblpapi的,帮助台将能够帮助您设置初始屏幕。保存完成后,您可以按如下方式检索它。

如果您有一个名为“Swedish Mid Caps”的自定义保存的EQS屏幕,您只需要屏幕名称并将screenType标志设置为“PRIVATE”。 :

sw_eqs <- beqs(screenName = "Swedish Mid Caps", screenType = "PRIVATE")