2016-11-22 91 views
0

约束我试图对投资组合优化问题的工作,基本上我们有一些产品中,%投资组合和收益率。基本上我必须将总体回报率最优化。该问题变得棘手,因为有最低限制特定产品优化与R中

数据:

product share_per return_per min_share_per 
prod1 0.5  0.1  0.2 
prod2 0.2  0.4  0.1 
prod3 0.2  0.05  0.0 
prod4 0.1  0.04  0.0 
prod5 0.0  0.3  0.0 

基本上我们在列share_per进行优化,使产品*(share_per * return_per) *最大 我无可救药尝试,这是

mat <- matrix(c(0.5, 0.2, 0.2, 0.1, 0.0)) 
colnames(mat) <- c("return_per") 

minmax <- function(x, a) (sum(a*x)) 
opt <- apply(mat, 1, function(i) { 
    optimize(minmax, c(0, 1), a = i[["return_per"]], maximum=T)$maximum 
}) 

mat2 <- cbind(mat, opt) 
mat2 

正如你可以看到我既不能找出哪里SPE cify具体到行

我知道constrOptim是不是我应该寻找的约束,但是我不约束的部分。

回答

1

你可以试试这个:

df <- read.table(text='product share_per return_per min_share_per 
       prod1 0.5  0.1  0.2 
       prod2 0.2  0.4  0.1 
       prod3 0.2  0.05  0.0 
       prod4 0.1  0.04  0.0 
       prod5 0.0  0.3  0.0', header=TRUE) 

ret <- df$return_per 

fn <- function(sp) sum(ret*sp) # objective 

Amat <- rbind(diag(nrow(df)), diag(-1,nrow(df)), rep(-1,nrow(df))) # constraints 
bvec <- c(df$min_share_per, rep(-1, nrow(df)), -1)    # sp_j >= min_share_per, 
                    # sp_j <= 1 and 
                    # sum_j sp_j <= 1 
init <- c(0.5,0.2,0.2,0.05,0.01) # making sure that the initial value is in the feasible region 

sol <- constrOptim(init, fn, NULL, ui = Amat, ci = bvec, control=list(fnscale=-1)) # maximize 
round(sol$par, 2) 
# [1] 0.2 0.8 0.0 0.0 0.0 
+0

哇哦!做得非常好!我不能够感谢你! –