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

Ого! красиво сделано !! Я не могу поблагодарить вас достаточно! –

Смежные вопросы