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