diff options
| -rw-r--r-- | bandit.R | 114 | ||||
| -rw-r--r-- | sp500-bloomberg.RData | bin | 0 -> 41463488 bytes |
2 files changed, 36 insertions, 78 deletions
@@ -1,7 +1,9 @@ +source('utils.R') sp500<- read.table("sp500 tickers 10-17.csv",sep="\t",header=T,quote="",colClasses="character",strip.white=T) colnames(sp500) <- c("name","ticker") #replace / by - sp500$ticker <- sub('/', '-', sp500$ticker) +load("sp500-bloomberg.RData") #first don't take care about survivor bias tickerlist <- list() @@ -11,103 +13,59 @@ for(i in 1:length(sp500$ticker)){ cat("ticker",i,ticker,"\n") } -#compute matrix of returns -ticker <- sp500[1,"ticker"] -returns <- diff(log(tickerlist[[ticker]]$Close)) -for(i in 2:length(sp500[,"ticker"])){ - ticker <- sp500[i,"ticker"] - returns <- merge(returns,diff(log(tickerlist[[ticker]]$Close))) +price2return <- function(x){ + diff(log(abs(x))) +} + +#compute list of returns +tickerlist <- names(stock.data) +returns <- price2return(stock.data[[tickerlist[1]]]$Close) +for(i in 2:length(tickerlist)){ + ticker <- tickerlist[i] + returns <- merge(returns,price2return(stock.data[[ticker]]$Close),all=T) } -colnames(returns) <- sp500[,"ticker"] +colnames(returns) <- tickerlist returns <- returns[-1,] -universe <- which(!is.na(returns[1,])) -returns.subset <- returnds[,universe] #constant weight rebalancing -w <- rep(1/dim(returns.subset)[2],dim(returns.subset)[2]) N <- 1000000 W <- N -for(day in 1:length(returns[,1])){ - r <- as.vector(exp(returns.subset[day,])-1) +for(day in 1:NROW(returns)){ + date <- time(returns)[day] + subset <- memb(sp500$ticker,add,date) + r <- as.vector(exp(returns[day,subset])-1) r[is.na(r)] <- 0 #NA means we don't have quotes that day, but next return #will catch up + w <- rep(1/length(r),length(r)) dN <- N*crossprod(w,r) N <- N+dN W <- c(W,N) } -#no rebalancing -N <- 1000000 -W <- N -R <- rep(1,dim(returns.subset)[2]) -for(day in 1:length(returns[,1])){ - r <- as.vector(exp(returns.subset[day,])) - r[is.na(r)] <- 1 - R <- R*r - W <- c(W,N*mean(R)) -} - -indexchange <- read.table("IndexChange_500.csv",sep="\t",header=T,quote="", - colClasses="character") -#cleanup tickers -indexchange$Ticker.add <- sub('/', '-',indexchange$Ticker.add) -indexchange$Ticker.add <- sub('.wi', '',indexchange$Ticker.add,fixed=T) -indexchange$Ticker.add <- sub('wi', '',indexchange$Ticker.add) -indexchange$Ticker.add <- sub('.', '-',indexchange$Ticker.add,fixed=T) -indexchange$Ticker.del <- sub('/', '-',indexchange$Ticker.del) -indexchange$Ticker.del <- sub('.wi', '',indexchange$Ticker.del,fixed=T) -indexchange$Ticker.del <- sub('wi', '',indexchange$Ticker.del) -indexchange$Ticker.del <- sub('.', '-',indexchange$Ticker.del,fixed=T) - -#rollback sp500 changes -sp500.historic <- sp500 -for( i in 1:100){ - #Ticker.add empty means index is <500 for a while - if(indexchange$Ticker.add[i]!=""){ - if(!is.na(match(indexchange$Ticker.add[i],sp500.historic$ticker))){ - sp500.historic <- - sp500.historic[-match(indexchange$Ticker.add[i],sp500.historic$ticker),] - }else{ - cat(paste("ticker",indexchange$Ticker.add[i],"not found\n")) - next() - } - } - #add ticker that was removed - if(indexchange$Ticker.del[i]!=""){ - sp500.historic <- rbind(sp500.historic, - c(indexchange$Company.Deletions[i], - indexchange$Ticker.del[i])) - } -} -n.stocks <- ncol(P) -N <- nrow(P) +#bandit strategy current.wealth <- 1 -w <- rep(1/n.stocks,n.stocks) -dP <- apply(P,2,diff) -L <- rep(0,n.stocks) V <- 0 -W <- w pnl <- 0 -for(i in 1:(N-1)){ - r <- dP[i,]/as.numeric(P[i,]) - #r <- c(r,-r) - pnl <- cbind(pnl,current.wealth*crossprod(w,r)) - current.wealth <- 1+sum(pnl) - L <- rbind(L,-r) - V <- V+crossprod(w,r^2) - T <- 2/3*sqrt(log(N)/V) - #w <- exp(-T*(apply(1+L,2,prod)-1)) - w <- exp(-T*colSums(L)) +members <- memb(sp500$ticker,add,as.Date("2000-01-01")) +w <- rep(1/499,499) +L <- rep(0,NCOL(returns)) +for(day in 1:NROW(returns)){ + #browser() + date <- time(returns)[day] + r <- exp(coredata(returns[day,]))-1 + r[is.na(r)] <- 0 + V <- V+drop(crossprod(w,r[,members]^2)) + #L <- exp(-colSums(returns[1:day,],na.rm=T))-1 + L <- L-r + pnl <- c(pnl, current.wealth*crossprod(w,r[,members])) + current.wealth <- 1 + sum(pnl) + members <- memb(sp500$ticker,add,date) + #eta <- 2/3*sqrt(log(500)/V) + eta <- 0.15 + w <- exp(-eta*L[,members]) w <- w/sum(w) - W <- rbind(W,w) - if(i%%10==0){ - cat(current.wealth,sep="\n") - } } -price2return <- function(x){ - diff(x)/x[-length(x)] -} #number of shares implementations tc <- 0.005+0.02 days <- nrow(data.bus) diff --git a/sp500-bloomberg.RData b/sp500-bloomberg.RData Binary files differnew file mode 100644 index 0000000..7fd3aed --- /dev/null +++ b/sp500-bloomberg.RData |
