我试图了解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)))
}