2016-11-22 92 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

哇哦!做得非常好!我不能夠感謝你! –