提问人:Andres Mallcott 提问时间:9/30/2023 最后编辑:Andres Mallcott 更新时间:10/2/2023 访问量:84
Numpy中矩阵乘法的正确语法?
Correct syntax for matrix multiplication in Numpy?
问:
我想使用 Numpy 将以下公式转换为 Python 代码。请注意,mu 是 3x1 向量,sigma 是使用协方差矩阵的 3x3 矩阵。
u = np.array([0.0493, 0.0770, 0.0886])
cov_matrix = ([[0.0017, -0.0017, -0.0021],
[-0.0017, 0.0396, 0.0309],
[-0.0021, 0.0309, 0.0392]])
def hyperbola(u):
k = u * np.linalg.inv(cov_matrix)
l = u * np.linalg.inv(cov_matrix) * u[:, np.newaxis]
m = np.linalg.inv(cov_matrix)
g = (l * np.linalg.inv(cov_matrix) - k * np.linalg.inv(cov_matrix) * u[:, np.newaxis]) / (l*m - k**2)
h = (m * np.linalg.inv(cov_matrix) * u[:, np.newaxis] - k * np.linalg.inv(cov_matrix)) / (l*m - k**2)
a = h * cov_matrix * h[:, np.newaxis]
b = 2 * g * cov_matrix * h[:, np.newaxis]
c = g * cov_matrix * g[:, np.newaxis]
return np.sqrt(a * u**2 + b*u + c)
efficient_frontier = hyperbola(u)
我构造了上面的内容,但是,生成的双曲线是 3x3x3。我到底做错了什么?我确实在转置 mu 向量时遇到了一些问题,也许与此有关?
提前致谢!
编辑:我现在已经创建了下面的代码,它似乎产生了正确的代码结构,但没有产生预期的曲线形状。
def hyperbola(u):
k = u @ np.linalg.inv(cov_matrix) @ np.ones_like(u)
l = u @ np.linalg.inv(cov_matrix) @ u
m = np.ones_like(u) @ np.linalg.inv(cov_matrix) @ np.ones_like(u)
g = (l * np.linalg.inv(cov_matrix) @ np.ones_like(u) - k * np.linalg.inv(cov_matrix) @ u) / (l*m - k**2)
h = (m * np.linalg.inv(cov_matrix) @ u - k * np.linalg.inv(cov_matrix) @ np.ones_like(u)) / (l*m - k**2)
a = h @ cov_matrix @ h
b = 2 * g @ cov_matrix @ h
c = g @ cov_matrix @ g
return np.sqrt(a * u**2 + b*u + c)
efficient_frontier = hyperbola(u)
plt.plot(u, efficient_frontier)
plt.xlabel('Volatility')
plt.ylabel('Mean Return')
plt.grid(True)
预期曲线应类似于下面的红色曲线。为什么我得到不同的结果?我已经多次浏览了所有变量,但找不到差异。
答: 暂无答案
评论
*
@
h.T
h[:, np.newaxis]
.T
[:, np.newaxis]
3
(3, 1)
(1, 3)
@
hyperbola(u)
u
u = np.array([1, 2, 3])