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

2024-05-21 02:16:16 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文:我是PyPortfolioOpt的开发人员,这是一个python投资组合优化库,我试图允许用户为最大夏普比率问题添加约束

目前,用户可以将其约束作为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)传递给constraint lambda函数,以创建一个有效的cvxpy约束,然后将其传递给cp.Problem并求解它

我遇到的问题是,最大化夏普比率需要进行变量替换。形式为Ax ~ b(其中~表示相等或不相等)的约束必须变成Ax ~ k * b,其中k是非负优化变量

我尝试的一件事是将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:如何将表示w / k >= 0.01的cvxpy约束对象(已实例化)转换为表示w >= k * 0.01的cvxpy约束对象?

否则,我有没有办法重新设计?我想保留lambda函数API


Tags: andlambda函数用户notaxcpare
1条回答
网友
1楼 · 发布于 2024-05-21 02:16:16

Perhaps there is some API for decomposing an already instantiated constraint so that I can put in a variable?

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

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

相关问题 更多 >