Репликация нелинейного решателя XL GRG в R (пример предоставлен)

Я пытаюсь воспроизвести с помощью 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 со следующими ограничениями:

сумма (вес) = 1

wgt ‹= maxWgt

wgt ›= minWgt

Это будет эквивалентный снимок экрана (с ошибкой!) С решением на основе XL.

введите описание изображения здесь Спасибо.


person Matteo Castagna    schedule 20.06.2019    source источник


Ответы (1)


Этого можно добиться с помощью функции 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). Если вы установите цель как -objective, вы получите максимум.

person Matteo Castagna    schedule 20.06.2019