diff options
| -rw-r--r-- | bandit.R | 16 | ||||
| -rw-r--r-- | getYahooData.R | 93 | ||||
| -rw-r--r-- | patch-adjRatios.R | 56 |
3 files changed, 70 insertions, 95 deletions
@@ -1,6 +1,18 @@ +#fix bug in adjRatios +source("patch-adjRatios.R") +assignInNamespace("adjRatios",adjRatios,ns="TTR") library(TTR) -#fix bug in getYahooData -source("getYahooData.R") +rm(adjRatios) + +tickerlist <- list() +result <- c() +for(i in 479:500){ + ticker <- sp500[i,"ticker"] + test <- getYahooData(ticker,"20000101") + test2 <- getYahooData2(ticker,"20000101") + result <- c(result,test$Close[1]-test2$Close[1]) +} + sp500<- read.table("sp500 tickers 10-04.csv",sep="\t",header=T,quote="",colClasses="character",strip.white=T) colnames(sp500) <- c("name","ticker") #replace / by - diff --git a/getYahooData.R b/getYahooData.R deleted file mode 100644 index a758ae1..0000000 --- a/getYahooData.R +++ /dev/null @@ -1,93 +0,0 @@ -getYahooData<-function (symbol, start, end, freq = "daily", type = "price", adjust = TRUE, quiet = FALSE) -{ - if (missing(start)) { - beg <- as.POSIXlt("1900-01-01") - } - else { - beg <- as.POSIXlt(as.Date(as.character(start), "%Y%m%d")) - } - if (missing(end)) { - end <- as.POSIXlt(Sys.Date()) - } - else { - end <- as.POSIXlt(as.Date(as.character(end), "%Y%m%d")) - } - if (beg > end) - stop("Start date must be before end date.") - if (beg > as.POSIXlt(Sys.Date())) - stop("Start date is after today's date.") - freq <- match.arg(freq, c("daily", "weekly", "monthly")) - type <- match.arg(type, c("price", "split")) - if (type == "price") { - freq.url <- substr(freq, 1, 1) - } - else { - freq.url <- "v" - if (freq != "daily" & !quiet) - message("Only freq=\"daily\" data available for type=\"split\".\n", "Setting freq=\"daily\"...") - } - flush.console() - if (type == "price") { - if (adjust) { - if (freq == "daily") { - ohlc <- getYahooData(symbol, start, freq = "daily", type = "price", adjust = FALSE, quiet = TRUE) - divspl <- getYahooData(symbol, start, freq = "daily", type = "split", adjust = FALSE, quiet = TRUE) - ohlc <- merge(ohlc, divspl, all = TRUE) - if (NROW(divspl) != 0) { - if(!all(is.na(ohlc[is.na(ohlc[,"Close"]),"Split"]))){ - cat("ugly WAT fix!\n") - ohlc[162,"Close"] <- 83.75 - } - 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[time(ohlc[, "Open"] * d.ratio * s.ratio), "Open"] <- ohlc[, "Open"] * d.ratio * s.ratio - ohlc[time(ohlc[, "High"] * d.ratio * s.ratio), "High"] <- ohlc[, "High"] * d.ratio * s.ratio - ohlc[time(ohlc[, "Low"] * d.ratio * s.ratio), "Low"] <- ohlc[, "Low"] * d.ratio * s.ratio - ohlc[time(ohlc[, "Close"] * d.ratio * s.ratio), "Close"] <- ohlc[, "Close"] * d.ratio * s.ratio - ohlc[time(ohlc[, "Volume"] * (1/d.ratio)), "Volume"] <- ohlc[, "Volume"] * (1/d.ratio) - ohlc <- ohlc[, c("Open", "High", "Low", "Close", "Volume", "Unadj.Close", "Div", "Split", "Adj.Div")] - } - } - else stop("Only freq=\"daily\" adjusted data is currently supported.") - } - else { - url <- paste("http://ichart.finance.yahoo.com/table.csv?s=", symbol, "&a=", beg$mon, "&b=", beg$mday, "&c=", beg$year + 1900, "&d=", end$mon, "&e=", end$mday, "&f=", end$year + 1900, "&g=", freq.url, "&ignore=.csv",sep = "") - ohlc <- read.table(url, header = TRUE, sep = ",") - ohlc[, "Adj.Close"] <- NULL - ohlc <- ohlc[order(ohlc[, "Date"]), ] - ohlc <- xts(ohlc[, -1], as.POSIXct(as.character(ohlc[, 1]))) - } - } - else { - if (!quiet) - message("Unadjusted and adjusted dividend data are always returned.") - url <- paste("http://ichart.finance.yahoo.com/x?s=", symbol, "&a=", beg$mon, "&b=", beg$mday, "&c=", beg$year + 1900, "&d=", end$mon, "&e=", end$mday, "&f=", end$year + 1900, "&g=", freq.url, "&y=0&z=30000", sep = "") - ohlc <- read.table(url, skip = 1, sep = ",", fill = TRUE, as.is = TRUE) - div <- data.frame(Date = ohlc[ohlc[, "V1"] == "DIVIDEND", "V2"], Adj.Div = as.numeric(ohlc[ohlc[, "V1"] == "DIVIDEND", "V3"]), stringsAsFactors = FALSE) - spl <- data.frame(Date = ohlc[ohlc[, "V1"] == "SPLIT", "V2"], Split = as.character(ohlc[ohlc[, "V1"] == "SPLIT", "V3"]), stringsAsFactors = FALSE) - ohlc <- merge(div, spl, by.col = "Date", all = TRUE) - if (NROW(ohlc) == 0) - return(ohlc) - ohlc[, "Date"] <- as.Date(as.character(ohlc[, "Date"]), "%Y%m%d") - ohlc[, "Split"] <- sub(":", "/", ohlc[, "Split"]) - ohlc[, "Split"] <- 1/sapply(parse(text = ohlc[, "Split"]), eval) - ohlc <- ohlc[order(ohlc[, 1]), ] - ohlc <- xts(ohlc[, -1], as.POSIXct(as.character(ohlc[, 1]))) - if (all(is.na(ohlc[, "Split"]))) { - s.ratio <- rep(1, NROW(ohlc)) - } - else { - s.ratio <- adjRatios(split = ohlc[, "Split"])[, 1] - } - ohlc <- cbind(ohlc, ohlc[, "Adj.Div"] * (1/s.ratio)) - colnames(ohlc)[3] <- "Div" - ohlc[, "Split"] <- as.numeric(ohlc[, "Split"]) - ohlc <- ohlc[, c("Div", "Split", "Adj.Div")] - } - ohlc <- ohlc[paste(beg, end, sep = "/"), ] - return(ohlc) -} diff --git a/patch-adjRatios.R b/patch-adjRatios.R new file mode 100644 index 0000000..a96f541 --- /dev/null +++ b/patch-adjRatios.R @@ -0,0 +1,56 @@ +## adjRatiosR <- function(split, div, close){ +## split[is.na(split)] <- 1 +## #backpopulate the split ratio vector from the tail +## split <- rev(cumprod(rev(split))) +## coredata(split) <- c(coredata(split)[-1],1) +## div.index <- !is.na(div) +## stopifnot(is.na(div[1])) +## if(any(div.index)){ +## div[div.index] <- 1-div[div.index]/coredata(close[which(div.index)-1]) +## div[!div.index] <- 1 +## div <- rev(cumprod(rev(div))) +## coredata(div) <- c(coredata(div)[-1],1) +## }else{ +## coredata(div) <- rep(1,length(div)) +## } +## return(try.xts(merge(split,div),error="bad things are going to happen")) +## } + +adjRatios <- function (splits, dividends, close) +{ + if (!missing(dividends) && missing(close)) + stop("\"close\" must be specified to adjust dividends") + if (missing(close) || all(is.na(close)) || NROW(close) == + 0) { + close <- NA + } + else { + close <- try.xts(close, error = stop("\"as.xts(close)\" failed")) + } + if (missing(splits) || all(is.na(splits)) || NROW(splits) == 0) { + splits <- NA + } + else { + splits <- try.xts(splits, error = stop("\"as.xts(splits)\" failed")) + } + if (missing(dividends) || all(is.na(dividends))|| NROW(dividends) == 0) { + dividends <- NA + } + else { + dividends <- try.xts(dividends, error = stop("\"as.xts(dividends)\" failed")) + } + obj <- merge.xts(close, splits, dividends) + # for a non NA dividend value, close from the previous day must be non NA + #otherwise we can't compute the dividend ratio + if(any(is.na(close[-length(close)][!is.na(dividends)[-1]]))){ + stop("can't compute dividend ratio") + } + # if close is NA, then we can't compute the dividend ratio anway + #if (!isTRUE(is.na(close))) { + # obj <- obj[!is.na(obj[, 1]), ] + #} + adj <- .Call("adjRatios", obj[, 2], obj[, 3], obj[, 1], PACKAGE = "TTR") + adj <- xts(cbind(adj[[1]], adj[[2]]), index(obj)) + colnames(adj) <- c("Split", "Div") + return(adj) +} |
