Skip to content

Instantly share code, notes, and snippets.

@lockefox
Last active August 29, 2015 14:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lockefox/d8f7e3b3df03934bd7ee to your computer and use it in GitHub Desktop.
Save lockefox/d8f7e3b3df03934bd7ee to your computer and use it in GitHub Desktop.
#### 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