用python逼近一个非线性问题

计算科学 Python 非线性方程 近似
2021-12-14 08:50:38

我需要你的帮助来解决我正在为学校解决的问题。我的目标是近似权重矩阵的系数,以便它们检查特定属性。所以我有W我的资产的权重矩阵和Ω这些资产的协方差矩阵。我的投资组合的全球风险,σ, 由 定义:σ=tW.Ω.W和资产数量的边际风险j经过 : σj=(Wj(Ω.W)j)/σ2.

我需要找到一种方法来近似权重,这样如果N是资产的数量,对于每个j,σj=1/Nj=1NWj=1,协方差矩阵是已知的。

我尝试在 python 中使用 package 中的fsolve函数scipy.optimize,但我得到的答案不符合我的标准,因为我需要W介于 0 和 1 之间且它们的总和为 1

我的程序:

def CalcPoids(A,t):
    n=len(A)
    W=MatriceCov(A,t-30,30)
    C=[(1/n) for i in range(n)]
    def g(x,i):
        M=np.dot(W,x)
        d=np.dot((x.T),np.dot(W,x))
        return(x[i]*M[i])/d - (1/n)
    def f(x):
        return [g(x,i) for i in range(n)]
    return op.fsolve(f,C)

其中MatriceCov只是计算我的资产的前 30 个值的协方差矩阵。

def MatriceCov(A,j,t):
    n=len(A)
    M=np.zeros((n,n))
    for i in range(n):
        M[i][i]=Variancet(A[i],j,t)
    for j in range(n):
        i=0
        while i<j:
            M[i][j]=M[j][i]=Covt(A[i],A[j],j,t)
            i+=1
    return M

如果您对如何解决此问题有任何想法,我们将不胜感激。

1个回答

迭代无法收敛的一个非常常见的原因是,由于编码错误,您给了它一个无效的方程组。我怀疑这就是这里发生的事情: in op.fsolve(f,C),参数C是开始的猜测,所以你最终解决了f(x)=0从...开始x0=C而不是解决f(x)=C.

请参阅https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.fsolve.html上的文档