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

R语言_根据马科维茨投资组合理论画出最优投资组合线以 3 只股票的 156 个交易日对数收益率为例 data lt read csv dayly stocks csv 数据读取 R lt 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 di

#以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里应该是这样子的图像。

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

 模拟以上代码,又去找了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() 

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

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

 谨以此篇感谢我的导师

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227855.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午8:22
下一篇 2026年3月16日 下午8:22


相关推荐

  • 博弈论学习笔记(六)纳什均衡之约会游戏与古诺模型

    博弈论学习笔记(六)纳什均衡之约会游戏与古诺模型可以将纳什均衡看成一种自我实施的协议,假设每个人都相信大家都会遵守协议,那么大家就都会遵守。纳什均衡是和领导力紧密联系的。在协调博弈中,领导力的作用就是促成人们达到某个特定均衡而不是其他均衡。尤其是某些缺乏领导的混乱状态,在这类博弈中领导力的作用举足轻重。–领导力的用武之地。举个简单的例子,如下表,很显然协调能够起到作用。αβα1,10…

    2022年10月15日
    5
  • 经验干货:使用tf.py_func函数增加Tensorflow程序的灵活性

    经验干货:使用tf.py_func函数增加Tensorflow程序的灵活性nbsp nbsp 不知不觉 笔者接触 Tensorflow 也满一年了 在这一年当中 笔者对 Tensorflow 的了解程度也逐渐加深 相比笔者接触的第一个深度学习框架 Caffe 而言 笔者认为 Tensorflow 更适合科研一些 网络搭建与算法设置的自由度也更大 使用 Tensorflow 实现自己的算法也更迅速 nbsp nbsp 但是 笔者认为 Tensorflow 还是有不足的地方 第一体现在 Tensorflow 的数据机制 由于 te

    2026年3月17日
    3
  • Linux查看当前用户及其权限管理[通俗易懂]

    Linux查看当前用户及其权限管理[通俗易懂]linux查看当前用户cwhoami或whoami或whomomlikes[ec2@ip-10-10-5-79~]$whoami创建用户打开终端,输入:sudoadduser[用户名][ec2@ip-10-10-5-79~]$sudoadduserxiaozhou切换用户打开终端,输入:su[用户名]或者su-l[用户名][ec2@ip-10-10-5-79~]$suxiaozhou用户组在Linux系统中,每个用户都有一个归属(用户组

    2022年5月29日
    52
  • 32位程序使用超过4G的内存

    32位程序使用超过4G的内存众所周知 所有的 32 位应用程序都有 4GB 的进程地址空间 因为 32 位地址最多可以映射 4GB 的内存 对于 MicrosoftWin 操作系统 应用程序可以访问 2GB 的进程地址空间 32 位 Linux 可以访问 3GB 地址空间 这就是称为用户模式的虚拟地址空间 这 2GB 的用户模式虚拟地址空间位于 4GB 地址空间的低一半 而与之相对应的高一半 2GB 地址空间由操作系统内核使用 因此被成为内核模式的虚拟地址空

    2026年3月19日
    3
  • Thread.currentThread().getContextClassLoader()与Test.class.getClassLoader()区别

    Thread.currentThread().getContextClassLoader()与Test.class.getClassLoader()区别忘记以前有没有问过这个问题,总之我现在有看到几个地方有这个:Thread.currentThread().getContextClassLoader()我总是想不出在什么情况下会用这种方式获得一个ClassLoader,因为好像默认情况下,它返回的是和加载应用的ClassLoader是同一个,比如说在一个类Test中写ClassLoader cl = Thread.curren

    2022年6月6日
    37
  • php设计模式总结-工厂模式

    php设计模式总结-工厂模式

    2022年3月12日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号