在R中复制XL GRG非线性求解器(提供示例)

时间:2019-06-20 10:29:04

标签: r nonlinear-optimization

我正在尝试用R复制这个优化问题,而XL求解器似乎可以解决这个问题(我假设它是一个不错的解决方案);我似乎无法使包/功能在所有相关的方框中打勾。

这本质上是具有不等式约束的非线性优化问题。

可以使用以下代码片段复制问题的相关元素:

varCovar <- matrix(data = c(0.000576046, 0.000126261, 0.00012385, 0.000104201, 5.57911E-05,
                   0.000126261, 0.000411463, 9.88479E-05, 0.000100924, 0.000109183,
                   0.00012385, 9.88479E-05, 0.00038341, 6.42237E-05, 5.20799E-05,
                   0.000104201, 0.000100924, 6.42237E-05, 0.000291617, 4.6866E-05,
                   5.57911E-05, 0.000109183, 5.20799E-05, 4.6866E-05, 0.000155289), 
                   nrow = 5)

ret <- c(0.01,0.05,0.02,0.035,0.0136)
wgt <- c(0,0.3,0.3,0.3,0.1)

minWgt <- 0
maxWgt <- 0.3

rf <- 0.03

ptfRet <- sum(ret*wgt)
retVar <- sqrt(t(wgt) %*% varCovar %*% wgt)

sr <- (ptfRet-rf)/retVar

我需要通过更改sr并使其具有以下约束来最大化wgt

  

sum(wgt)= 1

     

wgt <= maxWgt

     

wgt> = minWgt

这将是基于XL的解决方案的等效屏幕截图(有错误!)。

enter image description here 谢谢。

1 个答案:

答案 0 :(得分:0)

这可以使用NlcOptim::solnl()函数来实现。

这就是我最终要做的:

obj <- function(wgt) {
  ptfRet <- sum(ret*wgt)
  retVar <- sqrt(t(wgt) %*% varCovar %*% wgt)
  sr  <- -(ptfRet-rf)/retVar
  return(sr)
}

con <- function(wgt) {
  f = NULL
  f = rbind(f, sum(wgt)-1)
  return(list(ceq = f, c = NULL))
}

result <- solnl(X = wgt, objfun = obj, confun = con, 
                lb = rep(minWgt, length(wgt)), ub = rep(maxWgt, length(wgt)))

solWgt <- result$par
solSR <- -result$fn

唯一的陷阱似乎是该函数返回最小值(根据CRAN doc)。 如果将目标设置为-objective,则将获得最大值。