cvxpy:将非线性约束转换为等效线性约束

罗伯特·马丁8

上下文:我是PyPortfolioOpt的开发人员,PyPortfolioOpt是python产品组合优化库,并且我试图允许用户为最大Sharpe比率问题添加约束。

当前,用户可以将其约束作为lambda函数传递,例如,使所有权重大于1%:

ef = EfficientFrontier(mu, S)  # mu and S are expected return and covariance
ef.add_constraint(lambda w: w >= 0.01)  # example new constraint
ef.min_volatility()  # optimise with constraint

在后端,我将cvxpy变量传递w = cp.Variable(n)给约束lambda函数,以创建有效的cvxpy约束,然后将其传递给cp.Problem并解决它。

我遇到的麻烦是,要最大化Sharpe比率,就需要进行变量替换。形式的约束Ax ~ b(where~表示相等或不相等)必须变为Ax ~ k * bwherek是非负优化变量。

我尝试的一件事是传递w / k给lambda函数。然后,这将导致约束w / k >= 0.01,我希望该约束等效于w >= k * 0.01,但可悲的是,这给出了:

DCPError: Problem does not follow DCP rules. Specifically:
The following constraints are not DCP:
0.01 <= var2817 / Promote(var2818, (20,)) , because the following subexpressions are not:
|--  var2817 / Promote(var2818, (20,))

然后,我以为我可以接受非线性约束constr = (w / k >= 0.01)并将其乘以k得到k * constr = (w >= 0.01 * k),但不能在cvxpy中乘以约束。

TL; DR:如何将表示的cvxpy约束对象(已实例化)转换为表示w / k >= 0.01的cvxpy约束对象w >= k * 0.01

否则,我有什么办法可以重新设计它?我想保留lambda函数API。

阿克瑟·阿格劳瓦尔

也许有一些API可以分解已经实例化的约束,以便可以放入变量?

约束是设计不变的。不变性简化了CVXPY的大部分逻辑。

为什么不构造新的约束?您当然可以检查约束的左侧和右侧。现在,可以通过检查args属性来完成(请参阅https://github.com/cvxgrp/cvxpy/blob/master/cvxpy/constraints/nonpos.py#L97)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将条件语句转换为线性约束

来自分类Dev

非线性约束 Cplex

来自分类Dev

Python约束的非线性优化

来自分类Dev

非线性函数的Scipy约束优化

来自分类Dev

多变量约束非线性极小化

来自分类Dev

无约束非线性优化函数

来自分类Dev

R中的非线性约束优化

来自分类Dev

多变量约束非线性极小化

来自分类Dev

非线性函数的Scipy约束优化

来自分类Dev

线性方程组中的非线性约束

来自分类Dev

将求解器GRG非线性函数转换为PuLP

来自分类Dev

如何将其转换为一组线性约束?

来自分类Dev

如何在Matlab中求解非线性约束优化?

来自分类Dev

约束非线性优化,值应为0.125的倍数

来自分类Dev

施加约束的非线性看似无关回归(SUR)

来自分类Dev

如何在Matlab中求解非线性约束优化?

来自分类Dev

向R中的非线性模型添加约束

来自分类Dev

约束线性优化设置

来自分类Dev

将曲线转换为线性

来自分类Dev

将非线性数值 PHP 数组索引转换为数组值

来自分类Dev

优化问题,非线性:R中的目标和约束条件自动分析Jacobian / Hessian

来自分类Dev

R中具有二次约束的单变量非线性优化

来自分类Dev

带约束的R线性模型

来自分类Dev

制定线性整数规划约束

来自分类Dev

线性规划条件约束

来自分类Dev

在MATLAB中找到具有非线性等式和不等式约束的方程组的非线性系统的最小值

来自分类Dev

将线性回归从Matlab转换为Python

来自分类Dev

将线性比例转换为对数

来自分类Dev

将表转换为分层与线性