使用Scipy Optimize Minimize使用多个约束时出错

时间:2016-07-14 12:50:19

标签: python optimization scipy constraints minimize

我对Python很陌生;我试图将一个投资组合分配优化器组合在一起,通过改变分配向量,在给定目标投资组合回报水平的情况下,最大限度地降低投资组合风险。

为此,我使用scipy.optimize.minimize。目前,如果我一次只使用一个约束,它可以正常工作,例如:

def total_constr_fun(allocation):
    return numpy.sum(allocation) - 1

total_constr = {'type':'eq', 'fun': total_constr_fun}

optimalallocation = optimize.minimize(risk_fctn,starting_allocation,method='SLSQP',bounds=bds,constraints=total_constr)

其中分配中每个元素的边界为0%到100%。

risk_fctn本质上是一个标准偏差函数,其中分配是唯一的参数。这个输出是一个标量。

但是,如果我尝试使用另一个约束(也可以单独使用),请说:

target_value = inputs['target_value'] #i.e. target value is a scalar which is defined earlier in the script

def target_constraint(allocation):
   return return_fctn(allocation) - target_value 


cons = [{'type':'eq', 'fun': target_constraint},
                {'type':'eq', 'fun': total_constr_fun}]


optimize.minimize(risk_fctn,starting_allocation,method='SLSQP',bounds=bds,constraints=cons)

然后我在LSQ子问题中得到错误'奇异矩阵C'。如果我使用圆括号而不是方形,那就相同了。

奇怪的是,如果我这样做,它会起作用:

constraint = {'type':'eq', 'fun': lambda allocation: [numpy.sum(allocation) - 1, return_fctn(allocation) - target_value]}

optimize.minimize(risk_fctn,starting_allocation,method='SLSQP',bounds=bds,constraints=constraint)

我会使用它(因为它有效)但我还需要添加一些不等式约束,所以我可以用这种方式来捏造它。

非常感谢任何帮助/解释!

0 个答案:

没有答案