2016-01-14 15 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

相關問題