失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > R语言_根据马科维茨投资组合理论画出最优投资组合线

R语言_根据马科维茨投资组合理论画出最优投资组合线

时间:2024-03-15 23:06:06

相关推荐

R语言_根据马科维茨投资组合理论画出最优投资组合线

#以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_vectcov_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,])-1len=length(data[,1]-1prices=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_vectcov_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()

跑完是这样的图(对比一下,就知道程序里的参数都是干森么的啦!

谨以此篇感谢我的导师

如果觉得《R语言_根据马科维茨投资组合理论画出最优投资组合线》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。