假设您拥有以下data.frame,mydata
:
dput(mydata)
structure(list(risk = c(3, 4, 7, 3, 8, 10), return = c(50, 60,
60, 40, 30, 80)), .Names = c("risk", "return"), row.names = c(NA,
-6L), class = "data.frame")
考虑mydata
中的每一行代表投资组合选择的风险和回报。风险和收益是分数,而不是典型金融投资组合中的收益和差异。我们希望通过改变投资组合权重来最大化回报并最小化投资组合的风险。假设我想要求出最佳投资组合(定义为最大化收益/风险),受限于权重必须总和为1,并且个人权重不能大于.3。我会把它解决为一个线性程序:
library(lpSolveAPI)
my.lp <- make.lp(1+nrow(mydata), nrow(mydata))
#column constraints
set.column(my.lp, 1, c(1, 0, 0, 0, 0, 0, 1))
set.column(my.lp, 2, c(0, 1, 0, 0, 0, 0, 1))
set.column(my.lp, 3, c(0, 0, 1, 0, 0, 0, 1))
set.column(my.lp, 4, c(0, 0, 0, 1, 0, 0, 1))
set.column(my.lp, 5, c(0, 0, 0, 0, 1, 0, 1))
set.column(my.lp, 6, c(0, 0, 0, 0, 0, 1, 1))
set.objfn(my.lp,obj=(-1)* (mydata$return/mydata$risk))
#no weight can exceed .3
set.rhs(my.lp, c(rep(.3,nrow(mydata)),1))
set.constr.type(my.lp, c(rep("<=",nrow(mydata)),"="))
solve(my.lp)
print(get.variables(my.lp))
# [1] 0.1 0.0 0.3 0.3 0.0 0.3
现在,我想解决给定风险承受能力的最优分配,即在给定平均投资组合风险不能超过设定值的约束条件下,最大化平均回报。我仍然希望保持权重必须总和为1的约束,并且没有个体权重可以大于.3。理想情况下,我会使用这种方法生成一个帕累托前沿,为每个风险等级分配最优分配(即平均风险等级的最大平均回报)。
我是优化的新手,所以如果有人能指导我完成这个方法,我们将不胜感激。