Gurobi Python API再平衡投资组合优化模型不可行性排查
投资组合优化模型不可行问题排查与修正
咱们直接定位问题核心:你的模型不可行的根源是再平衡阈值约束的写法错误,导致了无法满足的矛盾约束。
问题出在哪里?
先看你代码里的这行约束:
m2.addConstrs((vars_abs[item]*vars_ind[item] >= rebalancing_threshold for item in subassets), name='rebalancing_threshold')
你想用这个约束表达「如果某资产需要再平衡(vars_ind[item]==1),那它的持仓变化绝对值必须至少达到0.02」,但这个乘积约束的逻辑是错的:
- 当
vars_ind[item] = 0(不需要再平衡)时,左边的乘积结果是0,约束变成了0 >= 0.02——这显然不可能成立! - 从你提供的IIS文件也能看出来,所有列出的不可行约束都是这类乘积约束,这直接掐死了模型的可行空间。
而你之前写的关联二进制变量和持仓变化的指示约束是正确的:
for item in subassets: m2.addConstr((vars_ind[item]==1) >> (vars_abs[item] >= 1e-5)) m2.addConstr((vars_ind[item]==0) >> (vars_abs[item] <= 1e-5))
这部分已经明确了:vars_ind=1对应变化超过极小值(需要调整),vars_ind=0对应变化几乎为0(不需要调整)。
怎么修正?
把错误的乘积约束替换成指示约束,精准表达你的真实需求:「只有当标记为需要再平衡时,才要求变化绝对值≥0.02」。
删除原来的乘积约束,换成下面的代码:
for item in subassets: # 仅当vars_ind[item]为1时,要求持仓变化绝对值不低于阈值 m2.addConstr( (vars_ind[item] == 1) >> (vars_abs[item] >= rebalancing_threshold), name=f'rebalancing_threshold_{item}' )
额外检查点
修正后,再确认几个约束的合理性:
- 总再平衡资产数限制
max_number_rebalancing=10,结合每个资产至少变化0.02,总变化下限是10*0.02=0.2,而你的总变化上限max_rebalancing=0.5,这两个值没有冲突,没问题。 - 确认
rebalancing_threshold=0.02是符合业务逻辑的,如果后续还是不可行,可以考虑适当降低这个阈值,或者调整总再平衡资产数的限制。
按照这个修正后,模型的约束逻辑就通顺了,应该能解决不可行的问题。
内容的提问来源于stack exchange,提问作者Paolo Baudissone
相关产品推荐
相关产品推荐

