You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}'
    )

额外检查点

修正后,再确认几个约束的合理性:

  1. 总再平衡资产数限制max_number_rebalancing=10,结合每个资产至少变化0.02,总变化下限是10*0.02=0.2,而你的总变化上限max_rebalancing=0.5,这两个值没有冲突,没问题。
  2. 确认rebalancing_threshold=0.02是符合业务逻辑的,如果后续还是不可行,可以考虑适当降低这个阈值,或者调整总再平衡资产数的限制。

按照这个修正后,模型的约束逻辑就通顺了,应该能解决不可行的问题。

内容的提问来源于stack exchange,提问作者Paolo Baudissone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:57:33