#以3只股票的156个交易日对数收益率为例 data <- read.csv("./dayly_stocks.csv") #数据读取 R <- 100*array( c(data$平安银行,data$万科A,data$神州高铁),dim=c(156,3)) #计算平均收益率与协方差矩阵 mean_vect = apply(R,2,mean,na.rm=TRUE) mean_vect cov_mat = cov(R,use="complete.obs") sd_vect = sqrt(diag(cov_mat)) #约束条件:包括等式和不等式约束, Amat = cbind(rep(1,3),mean_vect,diag(1,nrow=3)) # 设置约束矩阵 muP = seq(min(mean_vect)+.0001,max(mean_vect)-.0001,length=300) #length为绘制投资组合线提供的样本数,不能太小,也没必要太大 sdP = muP # 投资组合收益的标准差 weights = matrix(0, nrow=300,ncol=3) # 投资组合权重 library(quadprog) #可能会需要提前install.packages("quadprog") for (i in 1:length(muP)) # 找出与设置预期收益率对应的最优组合权重 { bvec = c(1,muP[i],rep(0,3)) #有x只股票就需要rep(0,x) result = solve.QP(Dmat=2*cov_mat,dvec=rep(0,3),Amat=Amat,bvec=bvec,meq=2)#这里的3同样需要改成股票数目) sdP[i] = sqrt(result$value) weights[i,] = result$solution } pdf("./qp.pdf",width=6,height=5) #将绘制的最优投资组合线储存在qp.pdf中 par(mfrow = c(1,1)) plotthe efficient frontier (and inefficient frontier) plot(sdP,muP,type="l", xlab="risk(%)",ylab="reward(%)",xlim=c(0,25),ylim=c(0,5),lty=3)#这里的xlim,ylim的长度需要跑出来试试大小是否合适,A股risk在0-25%,return在0-5%。 mufree = 1.0 # 设置无风险利率,无风险利率为y轴截距 points(0, mufree,cex=4,pch="*") # 显示无风险利率 sharpe =( muP-mufree)/sdP # 计算夏普比率 ind = (sharpe == max(sharpe)) # 找出最大夏普比率 print(weights[ind,]) # 找出切线组合 lines(c(0,sdP[ind]),c(mufree,muP[ind]),lwd=4,lty=1, col = "blue") # 找出最优投资组合线 points(sdP[ind],muP[ind],cex=4,pch="*") # 显示切线投资组合 ind2 = (sdP == min(sdP)) # 计算最小风险组合 points(sdP[ind2],muP[ind2],cex=2,pch="+") # 显示最小风险组合 ind3 = (muP > muP[ind2]) lines(sdP[ind3],muP[ind3],type="l",xlim=c(0,25), ylim=c(0,3),lwd=2, col = "red") # 画出有效前沿 text(sd_vect[1],mean_vect[1],"Vanke",cex=1.15) text(sd_vect[2],mean_vect[2],"Pingan",cex=1.15) text(sd_vect[3],mean_vect[3],"Gaotie",cex=1.15) graphics.off()
跑出来pdf里应该是这样子的图像。

模拟以上代码,又去找了50家新三板企业的日收盘价。
#如果收集的是日收盘价,需要提前进行数据计算 #日收盘价到日对数收益率 #以50只股票的153个交易日收盘价为例 data <- read.cv("./dayly_stock.csv") D=length(data[1,])-1 len=length(data[,1]-1 prices=data[2,D] R <- 100*diff(log(as.matrix(prices[2:len,1:50]))) #对数收益率=log(Pt)-log(Pt-1) #再重复使用上面的代码得出最优投资组合线 #计算平均收益率与协方差矩阵 mean_vect = apply(R,2,mean,na.rm=TRUE) mean_vect cov_mat = cov(R,use="complete.obs") sd_vect = sqrt(diag(cov_mat)) #约束条件:包括等式和不等式约束, Amat = cbind(rep(1,50),mean_vect,diag(1,nrow=50)) # 设置约束矩阵 muP = seq(min(mean_vect)+.0001,max(mean_vect)-.0001,length=300) #length为绘制投资组合线提供的样本数,不能太小,也没必要太大 sdP = muP # 投资组合收益的标准差 weights = matrix(0, nrow=300,ncol=50) # 投资组合权重 library(quadprog) #可能会需要提前install.packages("quadprog") for (i in 1:length(muP)) # 找出与设置预期收益率对应的最优组合权重 { bvec = c(1,muP[i],rep(0,50)) #有x只股票就需要rep(0,x) result = solve.QP(Dmat=2*cov_mat,dvec=rep(0,50),Amat=Amat,bvec=bvec,meq=2)#这里的原来3只股票,同样需要改成股票数目50) sdP[i] = sqrt(result$value) weights[i,] = result$solution } pdf("./qp.pdf",width=6,height=5) #将绘制的最优投资组合线储存在qp.pdf中 par(mfrow = c(1,1)) plotthe efficient frontier (and inefficient frontier) plot(sdP,muP,type="l", xlab="risk(%)",ylab="reward(%)",xlim=c(0,5),ylim=c(-0.2,1.0),lty=3)#这里的xlim,ylim的长度需要跑出来试试大小是否合适,A股risk在0-25%,return在0-5%。 mufree = 0 # 设置无风险利率,无风险利率为y轴截距 points(0, mufree,cex=4,pch="*") # 显示无风险利率 sharpe =( muP-mufree)/sdP # 计算夏普比率 ind = (sharpe == max(sharpe)) # 找出最大夏普比率 print(weights[ind,]) # 找出切线组合 lines(c(0,sdP[ind]),c(mufree,muP[ind]),lwd=4,lty=1, col = "blue") # 找出最优投资组合线 points(sdP[ind],muP[ind],cex=4,pch="*") # 显示切线投资组合 ind2 = (sdP == min(sdP)) # 计算最小风险组合 points(sdP[ind2],muP[ind2],cex=2,pch="+") # 显示最小风险组合 ind3 = (muP > muP[ind2]) lines(sdP[ind3],muP[ind3],type="l",xlim=c(0,5), ylim=c(-0.2,2),lwd=2, col = "red") # 画出有效前沿 text(sd_vect[1],mean_vect[1],"1",cex=1.15) text(sd_vect[2],mean_vect[2],"2",cex=1.15) text(sd_vect[3],mean_vect[3],"3",cex=1.15) graphics.off()
跑完是这样的图(对比一下,就知道程序里的参数都是干森么的啦!
谨以此篇感谢我的导师
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227855.html原文链接:https://javaforall.net
