最小化二次函数受制于规范不等式约束

时间:2015-12-08 20:16:02

标签: r optimization convex-optimization quadratic-programming quadprog

我正在尝试解决以下不等式约束:

鉴于N股的时间序列数据,我正在尝试构建投资组合权重向量,以尽量减少回报的方差。

目标函数:

min w^{T}\sum w
s.t. e_{n}^{T}w=1
\left \| w \right \|\leq C

其中w是权重向量,\sum是协方差矩阵,e_{n}^{T}是1的向量,C是常量。其中第二个约束(\left \| w \right \|)是不等式约束(权重的2范数)。

我尝试使用nloptr()函数,但它给出了一个错误:提供的算法不正确。我不确定如何选择正确的算法,我也不确定这是否是解决这种不等式约束的正确方法。

我也愿意使用其他功能,只要他们解决了这个约束。

这是我尝试的解决方案:

data <- replicate(4,rnorm(100))
N <- 4
fn<-function(x) {cov.Rt<-cov(data); return(as.numeric(t(x) %*%cov.Rt%*%x))}     
eqn<-function(x){one.vec<-matrix(1,ncol=N,nrow=1); return(-1+as.numeric(one.vec%*%x))}


C <- 1.5
ineq<-function(x){
  z1<- t(x) %*% x
  return(as.numeric(z1-C))  
}   

uh <-rep(C^2,N)
lb<- rep(0,N)
x0 <- rep(1,N)

local_opts <- list("algorithm"="NLOPT_LN_AUGLAG,",xtol_rel=1.0e-7)
opts <- list("algorithm"="NLOPT_LN_AUGLAG,",
             "xtol_rel"=1.0e-8,local_opts=local_opts)
sol1<-nloptr(x0,eval_f=fn,eval_g_eq=eqn, eval_g_ineq=ineq,ub=uh,lb=lb,opts=opts)

2 个答案:

答案 0 :(得分:2)

这看起来像一个简单的QP(二次规划)问题。使用QP求解器而不是通用NLP(非线性规划)求解器(不需要衍生物,函数等)可能更容易。 R有一个名为quadprog的QP求解器。为quadprog设置问题并非完全无关紧要,但here是一个非常相似的投资组合示例,其中包含完整的R代码,以说明如何解决此问题。它具有相同的目标(最小化风险),相同的预算约束以及下限和上限。该示例只有一个额外的约束,指定了所需的最小投资组合回报。

实际上我误读了这个问题:第二个约束是|| x || &lt; = C.我认为我们可以将整个模型表达为:

enter image description here

这实际上看起来像凸模型。我可以用像Cplex,Gurobi和Mosek这样的“大”解决方案解决它。这些求解器支持凸二次约束问题。我也相信这可以表述为锥形编程问题,开辟了更多的可能性。

以下是我在R. cccp中使用package cccp的示例 Cone Constrained Convex Problems是一个CVXOPT的端口。

enter image description here

答案 1 :(得分:1)

权重的2范数没有意义。它必须是1标准。这实质上是对投资组合杠杆的限制。 1-norm(w)&lt; = 1.6意味着投资组合最多为130/30(对不起,这里使用金融语言)。您想要阅读关于二次锥体的信息。 w&lt; COV w = w&lt; L&gt;(Cholesky分解)因此w&#39; Cov w = 2-Norm(Lw)^ 2。因此,您可以引入线性约束y-Lw = 0和t> = 2-Norm(Lw)[这定义了二次锥形]。现在你最小化了。 1-范数也可以用锥体代替,因为abs(x_i)= sqrt(x_i ^ 2)= 2-norm(x_i)。因此,为向量x的每个元素引入一个二次锥。