如何使用 PYOMO 和 couenne 解决 "non-fixed bound or weight" 的投资组合优化问题

How to solve "non-fixed bound or weight" using PYOMO and couenne for a Portfolio Optimization problem

我正在尝试在 PYOMO 中实现均值-方差基数约束投资组合优化 (MVCCPO) 问题,然后使用 MINLP 求解器 couenne 求解。

MVCCPO 基于传统的投资组合优化问题(markowitz 的原始均值-方差模型),但增加了两个约束:1) 基数约束和 2) 下限和上限约束。请参阅 http://www.jhumanities.net/article_86973_2cc8b3b4209b171bd61268833c04ee07.pdf 以获取其使用示例;它在第 2 页以数学方式制定(我会在这里写,但不幸的是,由于 Whosebug 的限制,我无法做到)

当我尝试 运行 解决 MVCCPO 问题时,我遇到了错误 "non-fixed bound or weight"。此问题来自以下约束:

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]) 它可以完美地工作。我将永远感激能够帮助我的善良灵魂。

这样的三明治约束
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)。但是在您的情况下,双方都有变量。