2016-01-14 13 views
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%改变。任何人都可以重现这一点,并提供建议,或尝试指向正确的方向吗?

在此先感谢!

回答

6

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

+1

有趣。它是否影响性能? – Modi

+0

@Modi,@Ryan Price,我有同样的问题,只是试过你的解决方案,并设置'maxeval = 1000000'。我一直在尝试近24小时。我已经增加了“最大值”,但没有达到你的水平,没有任何区别。不知何故超过一定的水平,它开始工作。感谢您发布此问题。花了我一段时间找到答案。 – Courvoisier

+0

我也在学习表演。我正在使用'nloptr'。在我的情况下,'Rsolnp :: solnp'需要300毫秒,这非常高。我需要把它带到少于10毫秒。 (不知道我可以在R,但我至少可以调查使用哪种算法) – Courvoisier

相关问题