【问题标题】:Optimize with Constraints in R [duplicate]使用 R 中的约束进行优化 [重复]
【发布时间】:2016-11-22 16:51:57
【问题描述】:

我正在尝试解决投资组合优化问题,基本上我们有一些产品,%portfolio 和回报率。基本上我必须将整体回报率优化为最大。这个问题变得棘手,因为有一个特定于产品的最小约束

数据:

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 进行优化,以使 product *(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

如您所见,我无法弄清楚在哪里指定特定于行的约束

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

【问题讨论】:

    标签: r optimization


    【解决方案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
    

    【讨论】:

    • 哇哦!干得漂亮!!真是太感谢你了!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2015-06-09
    相关资源
    最近更新 更多