我正在进行优化(下面的简化示例)。在这个例子中,我试图在一个经济环境(k1)期间最小化资产组合(a,b,c,d,e,f,g,h,i,j)的风险,对于给定的可接受水平在以另一经济环境为特征的时期内的风险(k2)。我希望能够确保a + g = 1,但我无法弄清楚如何制定约束。到目前为止,我只能确保比c = d = 0。此外,我的真实世界使用它有更多的变量和更多的行在k1和k2,所以你们有任何想法,使这更快,非常感谢。
library(nloptr)
#Build a data set
set.seed(4)
k1<-matrix(sample(-100:100, 1000, replace=T), ncol=10)
set.seed(6)
k2<-matrix(sample(-100:100, 1000, replace=T), ncol=10)
colnames(k1)<-letters[1:10]
colnames(k2)<-letters[1:10]
#Function to be minimized
fn<-function(H) {
Y<-t(t(k1)*(H))
return(quantile(rowSums(Y), .05, na.rm=TRUE)+400)
}
#For a given eqn
eqn<-function(H) {
Y<-t(t(k2)*(H))
return(quantile(rowSums(Y), .05, na.rm=TRUE))
}
#Lower and upper bounds (c=d=0)
lb<-rep(0, 10)
ub<-rep(1,10)
ub[3:4]<-0
#Guess solution
pars<-rep(1, 10)
pars[3:4]<-0
sol <- auglag(pars, fn=fn, gr=NULL, heq=eqn, lower=lb, upper=ub, nl.info = FALSE, control = list(xtol_rel = 1e-8, maxeval = 20000))
答案 0 :(得分:2)
这是不平等约束的解决方案。 k2
矩阵在平等功能中没有业务,因为据我所知,你的评论中你只想避免进入一个高风险的地方&#34;不一定完全处于&#34;风险&#34;的特定水平。风险最小化问题要么属于hin
(不等式规范),要么属于目标函数。此策略无需将'b'
和'c'
参数的上限和下限设置为相同的值。 (这就是具有相等约束的原因。)只需将abs()或平方值之和设置为函数的return
。
eqn<-function(H) {
(sum( H[ c(1,7) ]) -1)^2 +abs(H[2]) +abs(H[3])
}
这表明H [c(1,2,3,7)的成功完成和值与您的规范一致:
k1<-matrix(sample(-100:100, 1000, replace=T), ncol=10)
set.seed(6)
k2<-matrix(sample(-100:100, 1000, replace=T), ncol=10)
colnames(k1)<-letters[1:10]
colnames(k2)<-letters[1:10]
fn<-function(H) {
Y<-t(t(k1)*(H))
return(quantile(rowSums(Y), .05, na.rm=TRUE)+400)
}
eqn<-function(H) {
(sum( H[c(1,7)]) -1)^2 +abs(H[2]) +abs(H[3])
}
lb<-rep(0, 10)
ub<-rep(1,10)
pars<-rep(1, 10)
pars[3:4]<-0
pars[c(1,7)] <- .5
sol <- auglag(pars, fn=fn, gr=NULL, heq=eqn, lower=lb, upper=ub, nl.info = FALSE, control = list(xtol_rel = 1e-8, maxeval = 20000))
#--------
> sol
$par
[1] 6.678320e-01 1.445484e-20 5.193411e-21 2.230321e-01 9.168071e-01
[6] 1.000000e+00 3.321727e-01 4.100418e-07 9.999992e-01 1.000000e+00
$value
[1] 122.3241
$iter
[1] 20001
$global_solver
[1] "NLOPT_LN_AUGLAG"
$local_solver
[1] "NLOPT_LN_COBYLA"
$convergence
[1] 5
$message
[1] "NLOPT_MAXEVAL_REACHED: Optimization stopped because maxeval (above) was reached."