diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2011-10-07 12:14:57 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2011-10-07 12:14:57 -0400 |
| commit | b9d26539cb63226365722bc4b535416dc2c08e8d (patch) | |
| tree | 68ecabff3add980b1f16b1e6be541911f54a4ce1 /getYahooData.R | |
| parent | 6832e21da3823535e15965f01d71ad7bbc7dd823 (diff) | |
| download | bandit-b9d26539cb63226365722bc4b535416dc2c08e8d.tar.gz | |
Some code cleanup
Diffstat (limited to 'getYahooData.R')
| -rw-r--r-- | getYahooData.R | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/getYahooData.R b/getYahooData.R new file mode 100644 index 0000000..a758ae1 --- /dev/null +++ b/getYahooData.R @@ -0,0 +1,93 @@ +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) +} |
