getBloombergData <- function(conn,ticker,start.date){ require(TTR) ohlc <- bdh(conn,paste(ticker,"Equity"),c("PX_OPEN","PX_HIGH","PX_LOW","PX_LAST","VOLUME"),start.date,dates.as.row.names=F) colnames(ohlc) <- c("Date","Open","High","Low","Close","Volume") ohlc <- xts(ohlc[,-1],as.Date(ohlc$Date)) #split information spl <- bds(conn,paste(ticker,"Equity"),c("EQY_DVD_ADJUST_FACT")) # bds returns NULL if there is no data. #Adjustment Factor Operator Type # 1 = div # 2 = mul # 3 = add # 4 = sub #Adjustment Factor Flag # 1 = prices only # 2 = volumes only # 3 = prices and volume # can't handle 3 or 4 yet if(NROW(spl)!=0){ if (NROW(spl[spl[,"Adjustment Factor Operator Type"] %in% c(3, 4),])>0){ stop("case not handled") }else{ spl[spl[,"Adjustment Factor Operator Type"]==1, "Adjustment Factor"] <- 1/spl[spl[,"Adjustment Factor Operator Type"]==1, "Adjustment Factor"] } spl <- xts(data.frame(spl$"Adjustment Factor", ifelse(spl$"Adjustment Factor Flag" %in% c(2,3), spl$"Adjustment Factor",NA)), order.by = as.Date(spl$"Adjustment Date")) #aggregate non-unique dates spl <- as.xts(aggregate(spl, identity, prod, na.rm=T)) if(any(time(spl)>= start.date & time(spl)<=Sys.Date())){ spl <- window(spl, start=start.date, end = Sys.Date()) }else{ spl <- NULL } } #div information #we need to override the end date as well cause the Ex-Date might be in the #future override_fields <- c("DVD_START_DT", "DVD_END_DT") override_values <- c(format(start.date,"%Y%m%d"),format(Sys.Date(),"%Y%m%d")) div <- bds(conn,paste(ticker,"Equity"), c("DVD_HIST"), override_fields, override_values) if(NROW(div)!=0){ div <- xts(div$"Dividend Amount", as.Date(div$"Ex-Date")) } if(is.null(div) && is.null(spl)){ divspl <- NULL }else if(is.null(div)){ #need to use merge.xts, otherwise spl is cast to a numeric divspl <- merge.xts(NA, spl ,all=T) }else if(is.null(spl)){ divspl <- merge.xts(div ,NA, NA, all=T) }else{ divspl <- merge(div, spl, all=T) } if(!is.null(divspl)){ colnames(divspl) <- c("Adj.Div","Split","Split2") ohlc <- merge(ohlc, divspl, all = TRUE) if (all(is.na(ohlc[, "Split2"]))) { s.ratio2 <- rep(1, NROW(ohlc)) }else { s.ratio2 <- adjRatios(split = ohlc[, "Split2"])[, 1] } ohlc <- cbind(ohlc, ohlc[, "Adj.Div"] * (1/s.ratio2)) colnames(ohlc)[NCOL(ohlc)] <- "Div" adj <- adjRatios(ohlc[, "Split"], ohlc[, "Div"], ohlc[, "Close"]) s.ratio <- adj[, 1] d.ratio <- adj[, 2] cn <- colnames(ohlc) ohlc <- cbind(ohlc, ohlc[, "Close"]) colnames(ohlc) <- c(cn, "Unadj.Close") ohlc[, "Open"] <- ohlc[, "Open"] * d.ratio * s.ratio ohlc[, "High"] <- ohlc[, "High"] * d.ratio * s.ratio ohlc[, "Low"] <- ohlc[, "Low"] * d.ratio *s.ratio ohlc[, "Close"] <- ohlc[, "Close"] * d.ratio * s.ratio ohlc[, "Volume"] <- ohlc[, "Volume"] * (1/s.ratio2) ohlc <- ohlc[, c("Open", "High", "Low", "Close", "Volume", "Unadj.Close", "Div", "Split", "Adj.Div")] }else{ cn <- colnames(ohlc) ohlc <- cbind(ohlc, ohlc[, "Close"]) colnames(ohlc) <- c(cn, "Unadj.Close") ohlc <- merge(ohlc,NA,NA,NA,all = TRUE) colnames(ohlc) <- c(colnames(ohlc)[1:6],"Adj.Div","Split","Div") } return( ohlc ) }