Last active
August 29, 2015 14:24
-
-
Save lockefox/d8f7e3b3df03934bd7ee to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#### INCLUDE LIBRARIES #### | |
library(quantmod) #getSymbols/chartSeries | |
library(zoo) #rollmean/rollapply | |
library(plyr) | |
library(sde) #GBM() | |
library(ggplot2) #ggplot() | |
library(reshape) #melt() | |
#### SCRIPT GLOBALS #### | |
StockSymbol <- "MU" | |
date_range <- 300 | |
predict.start <- 50 #Number of days back predictions should start | |
predict.length <- 50 #Number of predictions GBM should make | |
predict.window <- 30 #Number of days look back for deviation calc | |
predict.repeat <- 2000 #Number of repeated cycles for predictions | |
predict.interest <- 0 #Intrest rate for GBM | |
plot.path <- getwd() | |
plot.width <- 1600 | |
plot.height <- 900 | |
rolling_window <- 10 | |
#### FETCH STOCK DATA #### | |
StockDF <- as.data.frame(getSymbols(Symbols=StockSymbol, src="google", env=NULL, return.class="data.frame", auto.assign=FALSE)) | |
##FIX HEADERS## | |
StockDF$Date <- as.Date(row.names(StockDF)) | |
names(StockDF) <- c("Open","High","Low","Close","Volume","Date") | |
#### PROCESS DATA #### | |
StockDF$rollingAvg <- rollmean(StockDF$Open, k=rolling_window, na.pad=TRUE, align="right") | |
StockDF$diff <- StockDF$Open - StockDF$rollingAvg | |
StockDF$perdiff <- StockDF$diff / StockDF$Open | |
StockDF$rollSD_diff <- rollapply(StockDF$diff, width=rolling_window, FUN=sd, fill=NA, align="right") | |
StockDF$rollSD_per <- rollapply(StockDF$perdiff, width=rolling_window, FUN=sd, fill=NA, align="right") | |
date.min <- max(StockDF$Date)-date_range | |
StockDF.sub <- subset(StockDF, Date > date.min) | |
StockDF.predict <- subset(StockDF, Date > (date.min-predict.window) & Date < date.min) | |
predict.date <- StockDF.sub$Date[NROW(StockDF.sub$Date)-predict.start] | |
lastPrice <- StockDF.sub$Open[StockDF.sub$Date==predict.date] | |
lowVar <- quantile(StockDF.predict$rollSD_per, 0.25, na.rm=TRUE) | |
medVar <- quantile(StockDF.predict$rollSD_per, 0.50, na.rm=TRUE) | |
hiVar <- quantile(StockDF.predict$rollSD_per, 0.75, na.rm=TRUE) | |
lowSig <- (lowVar - mean(StockDF.sub$rollSD_per, na.rm=TRUE)) / sd(StockDF.sub$rollSD_per, na.rm=TRUE) | |
medSig <- (medVar - mean(StockDF.sub$rollSD_per, na.rm=TRUE)) / sd(StockDF.sub$rollSD_per, na.rm=TRUE) | |
hiSig <- (hiVar - mean(StockDF.sub$rollSD_per, na.rm=TRUE)) / sd(StockDF.sub$rollSD_per, na.rm=TRUE) | |
#lastPrice <- StockDF$Open[as.character(StockDF$Date)==predict.date] | |
predict.matrix.low <- matrix(data=NA, nrow=predict.length+1, ncol=predict.repeat) | |
predict.matrix.med <- matrix(data=NA, nrow=predict.length+1, ncol=predict.repeat) | |
predict.matrix.hi <- matrix(data=NA, nrow=predict.length+1, ncol=predict.repeat) | |
for(count in 1:predict.repeat){ | |
predict.matrix.low[,count] <- GBM(lastPrice, predict.interest, lowSig, lowVar, predict.length) | |
predict.matrix.med[,count] <- GBM(lastPrice, predict.interest, medSig, medVar, predict.length) | |
predict.matrix.hi [,count] <- GBM(lastPrice, predict.interest, hiSig , hiVar , predict.length) | |
} | |
Stock_predict.low <- rep(NA, NROW(StockDF.sub) - predict.start - 1) | |
Stock_predict.med <- rep(NA, NROW(StockDF.sub) - predict.start - 1) | |
Stock_predict.hi <- rep(NA, NROW(StockDF.sub) - predict.start - 1) | |
#TODO: calculate summaries# | |
Stock_predict.low <- c(Stock_predict.low, GBM(lastPrice, predict.interest, lowSig, lowVar, predict.length)) | |
Stock_predict.med <- c(Stock_predict.med, GBM(lastPrice, predict.interest, medSig, medVar, predict.length)) | |
Stock_predict.hi <- c(Stock_predict.hi , GBM(lastPrice, predict.interest, hiSig , hiVar , predict.length)) | |
if(predict.length < predict.start){ #pad rows if prediction is short | |
Stock_predict.low <- c(Stock_predict.low, rep(NA, predict.start-predict.length)) | |
Stock_predict.med <- c(Stock_predict.med, rep(NA, predict.start-predict.length)) | |
Stock_predict.hi <- c(Stock_predict.hi , rep(NA, predict.start-predict.length)) | |
} | |
StockDF.sub$predict.low <- Stock_predict.low | |
StockDF.sub$predict.med <- Stock_predict.med | |
StockDF.sub$predict.hi <- Stock_predict.hi | |
StockDF.stack <- melt.data.frame(StockDF.sub, id.vars=c("Date"), measure.vars=c("Open","predict.low","predict.med","predict.hi")) | |
####PLOTTING#### | |
if(!exists("itter_counter")){ #Init itter_counter if doesn't exist | |
itter_counter<-0 | |
} | |
#TODO: cram predictions into XTS object for addLines?# | |
itter_counter <- itter_counter + 1 | |
plot.title <- paste0(StockSymbol," - ",date_range,"days" ) | |
plot.name <- paste0(StockSymbol,"_Predict-",itter_counter,"_",Sys.Date(),".png") | |
png(paste0(plot.path,plot.name),width=plot.width, height=plot.height) | |
GG <- ggplot(StockDF.stack, aes(x=Date, y=value, color=variable)) | |
GG <- GG + geom_line(size=1) | |
GG <- GG + labs(title=plot.title, color="Price", x="Date", y="Open Price") | |
print(GG) | |
dev.off() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment