在R中使用nloptr时初始值无变化

t3psigkw  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(150)

几个月来,我一直在为R中的优化问题而苦苦挣扎。多亏了梦幻体育数据的例子,我终于找到了线性问题的lpSolve。然而,我最初的和(仍然)当前的问题是尝试在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%开始改变。有人能复制这个并提供建议吗?或者试着给我指出正确的方向?
先谢了!

jqjz2hbq

jqjz2hbq1#

我已经找到了我自己问题的答案。我认为优化运行的时间不够长。通过在opts列表中指定maxeval = 1000000,我得到了满足约束的答案。

ulydmbyx

ulydmbyx2#

我发现nloptr对两者都很敏感,maxeval太低和太高
我通常设置我的maxeval = 1e7。在95%的情况下都有效。
如果nloptr返回的是初始猜测值,那么修改一下它的opts,它通常会工作。
但是,如果有人知道捕捉这个错误的可靠方法,请告诉我...

相关问题