问题描述
我正在尝试解决一个投资组合优化问题,其约束条件是权重可以为零或至少为 min
(Nx1
向量)。
import cvxpy as cp
w = cp.Variable(len(mu))
mins = np.ones(len(mu)) * 0.03
risk = cp.quad_form(w,S)
prob = cp.Problem(cp.Minimize(risk),[cp.sum(w) == 1,w >= 0,w >= min OR w == 0 # pseudocode for my desired constraint]
这相当于权重为 NOT 0 < w <= min
的约束,但我找不到在 CVXPY 中表达的方法(我在谷歌上搜索了诸如“cvxpy OR 约束”之类的内容,但无济于事)。
感觉好像我遗漏了一些明显的东西。也许有一个涉及一些布尔向量的解决方案?
解决方法
这称为 w
是一个半连续变量。大多数高级求解器直接支持这种类型的变量。由于 CVXPY 不理解半连续变量,我们可以使用二元变量 δ ∈ {0,1} 并形成约束:
δ⋅min ≤ w ≤ δ⋅max
我们可以在哪里设置 max=1
。
这使问题成为 MIQP(混合整数二次规划)问题。这通常意味着您需要使用支持此类模型的高端求解器。
,根据 Erwin 的回答,这是工作代码。
import cvxpy as cp
w = cp.Variable(n)
mins = np.ones(n) * 0.03
maxs = np.ones(n)
risk = cp.quad_form(w,S)
prob = cp.Problem(cp.Minimize(risk),[cp.sum(w) == 1,w >= 0,w >= cp.multiply(k,mins),w <= cp.multiply(k,maxs)])
prob.solve(solver="ECOS_BB")
编辑:根据评论将 k @ mins
更改为 cp.multiply(k,mins)