我正在尝试在PYOMO中实施均方差基数约束的投资组合优化(MVCCPO)问题,然后使用MINLP求解器couenne进行求解。
MVCCPO基于传统的投资组合优化问题(Markowitz的原始均值-方差模型),但增加了两个约束:1)基数约束和2)下限和上限约束。有关其使用示例,请参见http://www.jhumanities.net/article_86973_2cc8b3b4209b171bd61268833c04ee07.pdf;它是在第2页上用数学公式表示的(不幸的是,我会在这里写出来,但是由于stackoverflow的限制,我无法)
当我尝试运行解决MVCCPO问题时,遇到错误“非固定边界或重量”。此问题来自以下约束:
l_ {i} \ delta_ {i} <= w_ {i} <= u_ {i} \ delta_ {i}
其中l_ {i}和u_ {i}是投资股票i的下限和上限:下限和上限约束。 \ delta_ {i}是基数约束,当不投资股票时为0,要投资股票时为1。w_ {i}是投资于股票i的投资组合的数量。
以下是PYOMO中当前如何实现约束条件
def floor_ceiling_and_cardinality_constraint(self, m, i):
return inequality((m.delta[i]*self.l[i]), m.x[i], (m.delta[i] * self.u[i]))
如何实现这种约束?我知道所提到的约束是有缺陷的,因为删除约束的基数部分(\ delta_ [i])可以很好地工作。我永远对善于帮助我的善良的人负有债务。
答案 0 :(得分:0)
三明治约束
l(i)*δ(i) ≤ x(i) ≤ u(i)*δ(i)
通常应实现为两个约束:
l(i)*δ(i) ≤ x(i)
x(i) ≤ u(i)*δ(i)
这些现在是简单明了的线性约束。
注意:Pyomo支持以下形式的约束
l(i) ≤ expression ≤ u(i)
直接(请参见link)。但是在您的情况下,双方都有变量。