如何使用PYOMO和couenne解决“非固定界限或权重”以解决投资组合优化问题

时间:2019-07-16 20:42:31

标签: pyomo nonlinear-optimization mixed-integer-programming

我正在尝试在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])可以很好地工作。我永远对善于帮助我的善良的人负有债务。

1 个答案:

答案 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)。但是在您的情况下,双方都有变量。