r - 受范数不等式约束的二次函数最小化

标签 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} 是向量其中,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)

最佳答案

这看起来像是一个简单的 QP(二次规划)问题。使用 QP 求解器代替通用 NLP(非线性编程)求解器可能更容易(不需要导数、函数等)。 R 有一个称为quadprog 的QP 求解器。为quadprog设置一个问题并不是完全微不足道的,但是here是一个非常相似的投资组合示例,带有完整的 R 代码,用于展示如何解决此问题。它具有相同的目标(最小化风险)、相同的预算约束以及下限和上限。该示例只是有一个额外的约束,指定所需的最低投资组合返回。

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

enter image description here

这实际上看起来像一个凸模型。我可以使用 Cplex、Gurobi 和 Mosek 等“大型”求解器来解决它。这些求解器支持凸二次约束问题。我还相信这可以表述为圆锥编程问题,从而开辟更多可能性。

这是我在 R 中使用 cccp 包的示例。cccp 代表 锥约束凸问题,是 CVXOPT 的端口。

enter image description here

关于r - 受范数不等式约束的二次函数最小化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34165200/

相关文章:

optimization - 使用贝叶斯优化的深度学习结构的超参数优化

python - 最速下降轨迹行为

convex-optimization - 如何实现凸优化包?

ggplot2 中面的旋转

r - XPath 选择和连接所有文本节点

mysql - 您将如何优化以下查询

c# - 二进制数组将映射减少到 C# 中的矩形

machine-learning - 逻辑回归中成本函数的局部和全局最小值

r - 将 geom_vline 扩展到绘图之外

r - 从包含 $ 符号且位于关键字前后的文本中提取数据