library(TTR) #fix bug in getYahooData source("getYahooData.R") 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 - sp500$ticker <- sub('/', '-', sp500$ticker) #first don't take care about survivor bias tickerlist <- list() for(i in 1:length(sp500$ticker)){ ticker <- sp500[i,"ticker"] tickerlist[[ticker]] <- getYahooData(ticker,"20000101") } #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))) } colnames(returns) <- sp500[,"ticker"] 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) r[is.na(r)] <- 0 #NA means we don't have quotes that day, but next return #will catch up 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 attach(indexchange) 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")) } } #add ticker that was removed if(indexchange$Ticker.del[i]!=""){ sp500.historic <- rbind(sp500.historic, c(indexchange$Company.Deletions[i], indexchange$Ticker.del[i])) } } detach(indexchange)