我有一个包含 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 有多大,是否有通用的解决方案来解决此类问题?谢谢你
似乎我们缺少一条关键信息,即实际总和,因此我们只能真正计算 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
这对于我们使用的样本数字来说是有意义的。
如果您有任何疑问,请告诉我。