Single Index Model
Single Index Model
symbols <-c("BABA","IBM","GOOG","MSFT","AMZN","AAPL","^GSPC")
days<-252;rf <- 0.001
stock <- list();daily.return<-list()
xx <- matrix(rep(0,6*(length(symbols)-1)),ncol=6, nrow=length(symbols)-1)
col <- matrix(rep(0,5*(length(symbols)-1)),ncol=5,nrow=length(symbols)-1)
for (i in 1:length(symbols)) {
stock[[i]] <- tail(getSymbols(symbols[i],src="yahoo",return.class="xts",auto.assign=FALSE),days)
daily.return[[i]] <- periodReturn(stock[[i]],period='monthly')
}
##
##
##
##
##
##
##
##
##
daily.return<-as.data.frame(daily.return)
colnames(daily.return)<-symbols
for(i in 1:(length(daily.return)-1)){
xx[i,1] <- lm(data=daily.return,formula=daily.return[,i] ~
daily.return[,length(daily.return)])$coefficients[1]
xx[i,2] <- lm(data=daily.return,formula=daily.return[,i] ~
daily.return[,length(daily.return)])$coefficients[2]
xx[i,3] <- xx[i,1]+xx[i,2]*mean(daily.return[,length(daily.return)])
xx[i,4] <- sum(lm(data=daily.return, formula=daily.return[,i] ~ daily.return[,length(daily.return)])$res
xx[i,5] <- (xx[i,3]-rf)/xx[i,2]
1
xx[i,6] <- i
}
rownames(xx)<-symbols[1:(length(daily.return)-1)]
aaa <- xx[order(-xx[,5]),]
col[,1] <- (aaa[,3]-rf)*aaa[,2]/aaa[,4]
col[,3] <- aaa[,2]^2/aaa[,4]
for(i in 1:(length(daily.return)-1)) {
col[i,2] <- sum(col[1:i,1])
col[i,4] <- sum(col[1:i,3])
}
for(i in 1:(length(daily.return)-1)) {
col[i,5] <- var(daily.return[,length(daily.return)])*col[i,2]/
(1+var(daily.return[,length(daily.return)])*col[i,4])
}
z_short <- (aaa[,2]/aaa[,4])*(aaa[,5]-col[(length(daily.return)-1),5])
x_short <- z_short/sum(z_short)
noshort<-as.matrix(aaa[1:which(col[,5]==max(col[,5])), ])
z_no_short <- (noshort[,2]/noshort[,4])*(noshort[,5]-max(col[,5]))
x_no_short <- z_no_short/sum(z_no_short)
order<-as.numeric(aaa[,6])
expectation<-colMeans(daily.return[,order])%*%x_short
risk<-sd(as.matrix(daily.return[,order]) %*% x_short)
expectation
##
[,1]
## [1,] -0.4495219
risk
## [1] 0.5108066
order_no<-order[1:length(x_no_short)]
expectation<-colMeans(daily.return[,order_no])%*%x_no_short
risk<-sd(as.matrix(daily.return[,order_no]) %*% x_no_short)
expectation
##
[,1]
## [1,] 0.05670537
risk
## [1] 0.09146087
x_no_short
##
AMZN
GOOG
## 0.8124993 0.1875007
expectation
##
[,1]
## [1,] 0.05670537
risk
## [1] 0.09146087
plot(risk,expectation,col="red",pch=19,xlab="Risk",ylab="Return",
ylim=c(min(colMeans(daily.return),expectation),max(colMeans(daily.return),expectation)),
xlim=c(min(sqrt(diag(var(daily.return))),risk),max(sqrt(diag(var(daily.return))),risk)))
abline(h=0,col="red")
for (i in 1:length(symbols)){
points(sd(daily.return[,i]),mean(daily.return[,i]),col="blue",pch=17)
text(sd(daily.return[,i]),mean(daily.return[,i]),colnames(daily.return)[i])
}
0.02
GOOG
MSFT
0.00
AAPL
^GSPC
IBM
0.02
Return
0.04
0.06
AMZN
BABA
0.04
0.06
0.08
0.10
Risk
0.12
0.14