假设我有一个权重投资组合,总和= 1
然后我想定义口袋(0,1,2),其中一些资产包含在那些口袋中,并且sum(weights_pocket_assets)< pocket_max_weight
在我的UI上,每个口袋有3列,如果资产在口袋中则填充1,否则为0(此阵列称为“口袋”)
mask = list(map(int, pockets[0]))
print(pocket_max[0], mask)
constr0 = {'type': 'ineq', 'fun': lambda x: pocket_max[0] - np.sum(np.ma.array(x, mask=np.logical_not(mask)))}
mask = list(map(int, pockets[1]))
print(pocket_max[1], mask)
constr1 = {'type': 'ineq', 'fun': lambda x: pocket_max[1] - np.sum(np.ma.array(x, mask=np.logical_not(mask)))}
mask = list(map(int, pockets[2]))
print(pocket_max[2], mask)
constr2 = {'type': 'ineq', 'fun': lambda x: pocket_max[2] - np.sum(np.ma.array(x, mask=np.logical_not(mask)))}
constr = [{'type': 'eq', 'fun': lambda x: np.sum(x) - 1}, constr0, constr1, constr2]
print(constr)
作为输出:
0.04 [1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0.08 [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0.05 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0]
[{'fun': <function Book.optimize.<locals>.<lambda> at 0x00000060CCD9AD90>, 'type': 'eq'},
{'fun': <function Book.optimize.<locals>.<lambda> at 0x00000060CCD9AD08>, 'type': 'ineq'},
{'fun': <function Book.optimize.<locals>.<lambda> at 0x00000060CCD9ABF8>, 'type': 'ineq'},
{'fun': <function Book.optimize.<locals>.<lambda> at 0x00000060CCD9AAE8>, 'type': 'ineq'}]
这似乎是正确的。
问题是仅使用eq和last ineq进行优化(即sum(w)= 1和sum(w_pocket_2)= 0.05)
此外,如果我只有2个口袋,它只用最后一个优化。
简而言之,它只需要优化中的最后一个ineq ...不知道出了什么问题。
编辑:
如果口袋是等于的(即,每个口袋的相同组件,即相同的面具)则考虑所有3'ineq'约束(即实际上最大约束,但如果它是第一个'ineq',则第二个或第三个是最有限制的)
只要口袋没有类似的组件(例如:我们为第二个'ineq'添加一个组件),只有最后一个'ineq'才能通过优化。
答案 0 :(得分:0)
通常,这是一个可变范围的问题(奇怪的东西,因为变量仍然被定义,但被覆盖。我没有进行更多的调查以完全理解)。以下代码按预期工作(考虑所有口袋限制):
constr += ({'type': 'ineq',
'fun': lambda x, mask, pocket_max, i: pocket_max[i] - np.sum(np.ma.array(x, mask=np.logical_not(mask))),
'args': (mask, pocket_max, i )}, )