summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bandit.R16
-rw-r--r--getYahooData.R93
-rw-r--r--patch-adjRatios.R56
3 files changed, 70 insertions, 95 deletions
diff --git a/bandit.R b/bandit.R
index 3482daa..ea77c98 100644
--- a/bandit.R
+++ b/bandit.R
@@ -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)
+}