在Python中求解具有N个未知数的N个系统方程

问题描述 投票:0回答:1

我有一个包含 N 种资产(N>300)的投资组合,我有每种资产的权重和价格,我的目标是收回每种资产的份额(数量)。为了简化起见,我们假设 N=3 来进行说明:

weight=[0.3,0.2,0.5]
price=[40,60,90]
share=[x1,x2,x3]

为了求解份额,我需要形成 3 个方程:

40*x1 / (40*x1 + 60*x2 + 90*x3)=0.3
60*x2 / (40*x1 + 60*x2 + 90*x3)=0.2
90*x3 / (40*x1 + 60*x2 + 90*x3)=0.5

我当然可以重新排列它们,然后形成矩阵 x 和 y 并使用

np.linalg.solve(x,y)

然而,棘手的部分是,我实际上有 300 个资产,而不是 3 个,所以我无法手动重新排列每个资产,然后形成我的 x 和 y 矩阵。无论 N 有多大,是否有通用的解决方案来解决此类问题?谢谢你

python
1个回答
0
投票

似乎我们缺少一条关键信息,即实际总和,因此我们只能真正计算 x1 与 x2 与 x3 的比率,但这可能足以让您到达您想要去的地方。

你想要一个通用的解决方案,所以我看了一下你展示的数学,它似乎很容易概括,所以我重新排列产生以下内容,其中第一行是你的方程,最后一行是通用的,可以应用生成矩阵:

现在我们有了这个方程,我们只需要把它插入到一个矩阵中,然后按照你的建议将

numpy
松开即可。为了适合您的情况,您只需将
tot
更改为您的总数,
sol2
将显示实际值而不是比率。

import numpy as np

weight = [0.3, 0.2, 0.5]
price = [40, 60, 90]
# share = [x1, x2, x3]

A = np.empty(shape=[len(weight), len(weight)], dtype=float)
for row in range(len(weight)):
    for col in range(len(weight)):
        A[row][col] = weight[row] * price[col]
        if row == col:
            A[row][col] -= price[col]

b = np.ones(shape=[len(weight)], dtype=float)
sol = np.linalg.solve(A, b)

tot = 100.0
raw_sum = sum([x * price[i] for i, x in enumerate(sol)])
sol2 = np.array([x / raw_sum for i, x in enumerate(sol)]) * tot

print(sol)
print(sol2)
print(tot, sum(xi * pi for xi, pi in zip(sol2, price)))

运行即产生

[-5.69986828e+14 -2.53327479e+14 -4.22212465e+14]
[0.75       0.33333333 0.55555556]
100.0 100.0

这对于我们使用的样本数字来说是有意义的。

如果您有任何疑问,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.