我对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)
我会使用它(因为它有效)但我还需要添加一些不等式约束,所以我可以用这种方式来捏造它。
非常感谢任何帮助/解释!