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 know the vector 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="") #cleanup tickers attach(indexchange) Ticker.add <- sub('/', '-',Ticker.add) Ticker.add <- sub('.wi', '',Ticker.add,fixed=T) Ticker.add <- sub('wi', '',Ticker.add) Ticker.add <- sub('.', '-',Ticker.add,fixed=T) Ticker.del <- sub('/', '-',Ticker.del) Ticker.del <- sub('.wi', '',Ticker.del,fixed=T) Ticker.del <- sub('wi', '',Ticker.del) Ticker.del <- sub('.', '-',Ticker.del,fixed=T) Date <- as.Date(Date,format="%m/%d/%y") for( jour in Date){ detach(indexchange)