3
我一直在努力解决R中的优化问题好几个月了。我终于想出了线性问题lpSolve
,这要归功于幻想运动数据的例子。然而,我的原始和(仍然)当前的问题是尝试在等式约束下使用nloptr
在R中进行非线性优化。在R中使用nloptr没有改变初始值
我试图做的是最小化两股投资组合的方差,回报几乎完全负相关(对于那些熟悉学术金融的人来说,最终目标是证明/反驳是否存在套利机会)。我希望尽量减少方差,但须两个权重被精确地等于1的总和,而0和1之间存在下面是确切的代码我使用,它应该是容易再现:
sd1 <- 0.01
sd2 <- 0.025
corr.lo <- -0.999
# Objective function
eval.f <- function(w) {
return(
(w[1]*sd1)^2 +
(w[2]*sd2)^2 +
(2*w[1]*w[2]*sd1*sd2*corr.lo)
)
}
# Constraint function
eval.g <- function(w) {
return(w[1] + w[2] - 1)
}
w0 <- c(0.5, 0.5)
opts <- list('algorithm' = 'NLOPT_GN_ISRES', 'xtol_rel' = 1.0e-8)
res <- nloptr(
x0 = w0,
eval_f = eval.f,
lb = c(0,0),
ub = c(1,1),
eval_g_eq = eval.g,
opts = opts
)
优化运行没有错误,并生成以下:
> res
Call:
nloptr(x0 = w0, eval_f = eval.f, lb = c(0, 0), ub = c(1, 1), eval_g_eq = eval.g, opts = opts)
Minimization using NLopt version 2.4.0
NLopt solver status: 5 (NLOPT_MAXEVAL_REACHED: Optimization stopped because maxeval (above) was reached.)
Number of Iterations....: 100
Termination conditions: xtol_rel: 1e-08
Number of inequality constraints: 0
Number of equality constraints: 1
Current value of objective function: 0.000125508655202602
Current value of controls: 0.5 0.5
我使用上面的算法,因为这是一个没有告诉我,我需要一个梯度(这我不熟悉)运行。问题是,w0
的初始值不会从每个50%改变。任何人都可以重现这一点,并提供建议,或尝试指向正确的方向吗?
在此先感谢!
有趣。它是否影响性能? – Modi
@Modi,@Ryan Price,我有同样的问题,只是试过你的解决方案,并设置'maxeval = 1000000'。我一直在尝试近24小时。我已经增加了“最大值”,但没有达到你的水平,没有任何区别。不知何故超过一定的水平,它开始工作。感谢您发布此问题。花了我一段时间找到答案。 – Courvoisier
我也在学习表演。我正在使用'nloptr'。在我的情况下,'Rsolnp :: solnp'需要300毫秒,这非常高。我需要把它带到少于10毫秒。 (不知道我可以在R,但我至少可以调查使用哪种算法) – Courvoisier