1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
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)
|