summaryrefslogtreecommitdiffstats
path: root/bandit.R
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2011-10-21 12:27:18 -0400
committerGuillaume Horel <guillaume.horel@gmail.com>2011-10-21 12:27:18 -0400
commit078cc1d78d03efdb560afde37b321a4474677de6 (patch)
tree60dab38e6b34719599dc6ba0b76ecc85b383f029 /bandit.R
parent8f7ce6c5d8feb1242e6dce41dbf901b13c497353 (diff)
downloadbandit-078cc1d78d03efdb560afde37b321a4474677de6.tar.gz
Implemented the bandit strategy
not really working so far
Diffstat (limited to 'bandit.R')
-rw-r--r--bandit.R114
1 files changed, 36 insertions, 78 deletions
diff --git a/bandit.R b/bandit.R
index 8e2fe70..4ce86bf 100644
--- a/bandit.R
+++ b/bandit.R
@@ -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)