为bloomberg中的独特的代码组合创建更有效的代码。

时间:2017-05-12 08:21:42

标签: r dataframe bloomberg processing-efficiency

我试图了解FTSE100中所有成分的独特组合。此外,我想看看每个独特组合之间的历史比率。

下面的方法有效,但看起来有点笨重,尤其是最后一个for循环。如果有关如何提高此代码效率的任何建议,我将不胜感激。

提前谢谢....

#######################################################################################
#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()
option.fields <- c("periodicitySelection")
option.values <- c("MONTHLY")
bbg.options <- structure(option.values, names = option.fields)

##########################################################################################################################
# # FOR REMOVING STOCKS BY LENGTH#########################################################################################
##########################################################################################################################
bb <- Sys.Date()-1
cc <- 4800
aa <- bb-cc


##########################################################################################################################
# # BENCHMARK FOR CONSTITUTENTS###########################################################################################
##########################################################################################################################
benchmark1 <- "UKX INDEX" 


##########################################################################################################################
# # BENCHMARK FOR CALCULATIONS############################################################################################
##########################################################################################################################
benchmark2 <- "UKX INDEX" 


##########################################################################################################################
# # MKT CAP RESTRICTION###################################################################################################
##########################################################################################################################
mktcap <- 1


require(Rblpapi)
con <- blpConnect()


#########################################################################################################################
# # PULL IN ALL TICKERS FROM THE BROADMARKET INDEX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#########################################################################################################################
p <- bds(benchmark1, "indx_mweight_hist", overrides = c(end_date_override="20170508"))
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.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#########################################################################################################################
filteredtickers <- rep(0, nrow(tickers))


con <- blpConnect()


for (i in 1:nrow(tickers)){
  q <- bdh(tickers[i,], 
           fields = c("CUR_MKT_CAP"), 
           start.date = aa, end.date = bb)
  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 <- length(q$CUR_MKT_CAP)

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

}


#########################################################################################################################
# # CHECK AND FILTER BY MARKET CAP RESTRICTION.
#########################################################################################################################
t <- as.data.frame(filteredtickers, stringsAsFactors = FALSE)
t <- subset(t, filteredtickers!="0")
colnames(t) <- "tickers"


filteredtickersII <- rep(0, nrow(t))

for (i in 1:nrow(t)){
  qq <- bdh(t[i,], 
            fields = c("CUR_MKT_CAP"), 
            start.date = aa, end.date = bb)
  qq$date <- as.Date(qq$date, format = "%d/%m/%Y")
  qq$CUR_MKT_CAP <- as.numeric(qq$CUR_MKT_CAP)
  qqlength <- (last(qq$CUR_MKT_CAP))/1000


  if(qlength > mktcap){
    filteredtickersII[i] <-  t[i,]}
}


s <- as.data.frame(filteredtickersII, stringsAsFactors = FALSE)
s <- subset(s, filteredtickersII!="0")
colnames(s) <- "tickers"    
stocklength <- rep(0, nrow(s))


for (i in 1:nrow(s)){
  qr <- bdh(s[i,], 
            fields = c("CUR_MKT_CAP"), 
            start.date = aa, end.date = bb)
  qr$date <- as.Date(qr$date, format = "%d/%m/%Y")
  qr$CUR_MKT_CAP <- as.numeric(qr$CUR_MKT_CAP)

if(length(qr$CUR_MKT_CAP) == qlength){
 stocklength[i] <- s[i,] 
}

}

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


#########################################################################################################################
# # Create two vectors of tickers s1 and s2
#########################################################################################################################
s1 <- sfiltered
s2 <- sfiltered

s1 <- as.vector(s1$tickers)
s2 <- as.vector(s2$tickers)


#########################################################################################################################
# # Create all the combinations between the two vectors
#########################################################################################################################
t <- expand.grid(s1=s1, s2=s2)
t <- t[order(t$s1),]
t <- data.frame(t)


#########################################################################################################################
# # if element from s1 and s2 are equal then make NA
#########################################################################################################################
for(i in 1:nrow(t)){
  if(t[i,1] == t[i,2]){
    t[i,2] = NA 
  }  
}


#########################################################################################################################
# # remove all rows with NA's XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#########################################################################################################################
t1 <- t[complete.cases(t),]


#########################################################################################################################
# # find all unique combinations by removing duplicate combinations XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
#########################################################################################################################
t1.sort = t(apply(t1, 1, sort))
t1 <- t1[!duplicated(t1.sort),]
t11 <- as.vector(t1$s1)
t12 <- as.vector(t1$s2)
uvzscore <- rep(0, nrow(t1))


#########################################################################################################################
# # calculate scores for all the unique combinations XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
#########################################################################################################################
for (i in 1:nrow(t1)){
  u <- bdh(t11[i], 
           fields = c("PX_LAST"), 
           start.date = aa, end.date = bb, options = bbg.options,
           overrides = NULL)
  u$date <- as.Date(u$date, format = "%d/%m/%Y")
  u$PX_LAST <- as.numeric(u$PX_LAST)
  ulength <- length(u$PX_LAST)

  v <- bdh(t12[i], 
           fields = c("PX_LAST"), 
           start.date = aa, end.date = bb, options = bbg.options,
           overrides = NULL)
  v$date <- as.Date(v$date, format = "%d/%m/%Y")
  v$PX_LAST <- as.numeric(v$PX_LAST)
  vlength <- length(v$PX_LAST) 

  uv <- u$PX_LAST/v$PX_LAST
  uvaverage <- mean(uv)
  uvstdev <- sd(uv)
  uvzscore[i] <- (50 + (10*((last(uv) - uvaverage)/uvstdev)))


}

0 个答案:

没有答案