我在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"
答案 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")