找回密码
 注册
查看: 3527|回复: 0

R语言----资产组合计算及图形显示

  [复制链接]
发表于 2013-4-1 17:45:21 | 显示全部楼层 |阅读模式
以前都是用MATLAB或是EXCEL给学生讲资产组合的计算问题,实际R语言也可以做一样的事情。资产组合要解决的问题并不复杂,即给定一个可选的资产集合,要从中选择出一个最优组合,使其收益率较大,而风险较小。如果可选资产只有两个的话,问题非常简单,可以通过求导最优化的方式得到结果,即有效资产前沿的解析解。如果资产集合超过两个那么问题要复杂一些。首先需要给定一个要求的期望收益率,再求出在此约束下的方差最小组合,这可以通过二次规划解出。这样得到有效前沿上的一个点。然后更改期望收益率,又可以得到另一个最优解,如此反复即可得到多资产组合的有效前沿。

下面我们先用R语言中quadprog包的二次规划求解函数来计算一个例子,再用fPortfolio包中的函数来完成同样的任务。例子中使用的数据来自于fPortfolio包中的SMALLCAP.RET数据集,使用了其中的四个资产来示例。
  1. library(quadprog)
  2. library(fPortfolio)
  3. data <- SMALLCAP.RET[, c("BKE", "GG", "GYMB", "KRON")]
  4. # 计算得到收益率数据的协方差矩阵和期望
  5. sigma <- covEstimator(data)$Sigma
  6. mu <- covEstimator(data)$mu
  7. # 计算给定期望收益率为0.03条件下的最优组合,且不可作空
  8. A <- cbind(rep(1, 4), mu,diag(rep(1, 4))) #约束系数
  9. D <- sigma # 协方差矩阵
  10. x <- mu # 期望收益
  11. b <- c(1, 0.03, 0,0,0,0) #约束的右侧值
  12. res <- solve.QP(2 * D, x, A, b, meq=2)
  13. round(res$solution,2)
复制代码
得到最优资产组合的权重向量为0.26,0.26,0.00,0.48,quadprog包的二次规划求解在设置参数上不那么直观,而且不能够直接计算原始数据。更为方便的是使用fPortfolio包中的系列函数。下面使用efficientPortfolio()函数来计算给定期望下的最优组合,使用前需要设定函数所需的参数,一个用来表示组合的设定,另一个用来表示组合的约束。
  1. # 设定组合的期望收益率为0.03
  2. spec <- portfolioSpec(portfolio=list
  3.                        (targetReturn=0.03))
  4. # 设定组合的约束不许做空
  5. cons <- 'LongOnly'
  6. # 求解
  7. res <- efficientPortfolio(data, spec = spec,
  8.                           constraints = cons)
  9. summary(res)
复制代码
res.png


存在res中的输出结果非常丰富,其中包括了最优组合的权重,以及在此权重下的组合期望收益率和组合标准差,此外还提供了组合的风险价值VaR和条件风险价值CVaR。输出中的风险预算表示各资产对组合风险的贡献比例,可见KRON所占风险最高。我们还可以计算出有效前沿上的所有组合并绘制成图。
  1. spec <- portfolioSpec(portfolio=list
  2.                        (nFrontierPoints = 100,
  3.                        riskFreeRate=0.01))
  4. # 计算有效前沿,并不许做空
  5. frontier <- portfolioFrontier(data,spec=spec,
  6.                              constraints = cons)
  7. # 有效前沿绘图
  8. frontierPlot(frontier,
  9.              pch = 19,
  10.              cex = 0.5,
  11.              xlim=c(0,0.25),
  12.              ylim=c(0,0.035))
  13. grid()
  14. abline(h = 0, col = "grey30")
  15. abline(v = 0, col = "grey30")
  16. minvariancePoints(frontier, pch = 19, col = "red")
  17. tangencyPoints(frontier, pch = 19, col = "blue")
  18. tangencyLines(frontier, col = "darkblue",lwd=3)
  19. singleAssetPoints(frontier, pch = 19, cex = 1.5, col = topo.colors(6))
  20. front <- frontierPoints(frontier)
  21. monteCarloPoints(frontier, mcSteps = 500, pch = 19,
  22. cex = 0.3)
  23. lines(front, col = "red4", lwd = 3)
复制代码
efficient.png

原址http://www.tuicool.com/articles/BzUria
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-12-4 01:18 , Processed in 0.025649 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表