我几个月来一直在努力解决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%变化。任何人都可以重现这个并提供建议,或试着指出我正确的方向吗?
提前致谢!
答案 0 :(得分:6)
我已经找到了我自己的问题的答案。我认为优化运行的时间不够长。通过在maxeval = 1000000
列表中指定opts
,我得到了满足约束条件的答案。