现金流映射时,使用scipy.optimize的minimize或者fsolve求解方程未能返回正确结果

现象描述:做现金流映射时,为满足现值、久期等的条件,需在一定约束下求解方程,但使用scipy.optimize的minimize或者fsolve得到的结果与excel solver的不同(solver正确)。
》》问题:将一笔425日现值为1的现金流映射到期限为180日,360日和540日上。
》》已知:日期分别为180,360,425,540(单位:天);
上述日期对应的方差分别为0.36,0.56,0.65,0.81;
日期顶点180,360,540处利率的协方差矩阵V为
([[0.36,0.36,0.38],
[0.36,0.56,0.51],
[0.38,0.51,0.81]])
》》求:分配的比例(或权重)w=[(x,y,z)]
翻译成数学表达式:
x+y+z=1
180x+360y+540*z-(x+y+z)*425=0
wVw’=0.65

#1、用minimize
t1=180
t2=360
t=425
t3=540
var3=0.65
covMatrix=V #日期顶点t1、t2、t3处利率的协方差矩阵

fun=lambda x: np.power(var3-np.matmul(np.matmul(np.array([x[0],x[1],x[2]]),covMatrix),np.array([[x[0]],[x[1]],[x[2]]])),2)
cons=({'type':'eq','fun':lambda x:x[0]+x[1]+x[2]-1},
      {'type':'eq','fun':lambda x:t1*x[0]+t2*x[1]+t3*x[2]-(x[0]+x[1]+x[2])*t}
      )
x0=np.array([0.5,0.5,0])
res=optimize.minimize(fun,x0,constraints=cons)

结果:0.180.290.54 (不正确,不满足组合方差为0.65的条件)
excel结果:-0.231.090.13 (正确)

#2、用fsolve
def f(x):
    return np.array([np.power(var3-np.matmul(np.matmul(np.array([[x[0],x[1],x[2]]]),covMatrix),np.array([[x[0],x[1],x[2]]]).T),2),
                     x[0]+x[1]+x[2]-1,
                     t1*x[0] + t2 * x[1] + t3 * x[2] - (x[0]+x[1]+x[2]) * t])
root=optimize.root(f,[0.5,0.5,0])
结果:Result from function call is not a proper array of floats.

不知是哪里错了,不胜感谢。

该回答引用ChatGPT

根据您提供的信息,似乎存在两个问题。

问题1:使用scipy.optimize的minimize或fsolve得到的结果与excel solver的不同(solver正确)。

答案1:由于求解器的不同,不同的优化算法可能会在解决非线性方程组时给出不同的结果。Excel Solver可能使用的是不同的算法和起始点,因此得出的结果与scipy.optimize中的minimize或fsolve不同。但是,最终结果应该在误差允许范围内非常接近。因此,您应该检查优化算法的参数和起始点,并比较不同求解器的结果。

问题2:使用fsolve函数时,出现错误“Result from function call is not a proper array of floats”。

答案2:这个错误可能是由于您的约束条件没有正确设置。请确保约束条件返回的是一个数组,并检查所有约束条件的数量是否正确。此外,您可以尝试在约束条件的返回数组中添加一个类型为“eq”的元素,以确保所有约束条件都是等式约束条件。