我正在尝试用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的解决方案的等效屏幕截图(有错误!)。
答案 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,则将获得最大值。