利用python构建马科维茨
时间: 2023-10-28 12:48:08 浏览: 44
投资组合优化模型
马科维茨投资组合优化模型是一种经典的投资组合优化模型,它的目标是最大化投资组合的收益,同时最小化投资组合的风险。该模型假设投资组合中的资产收益率服从正态分布,且各个资产之间存在一定的相关性。下面是利用Python构建马科维茨投资组合优化模型的过程。
1. 数据准备
首先,我们需要准备一些数据,包括每个资产的收益率和协方差矩阵。这里我们以一个简单的例子为例,假设有三个资产,它们的收益率和协方差矩阵如下:
| 资产 | 收益率 |
| :--: | :--: |
| A | 0.05 |
| B | 0.1 |
| C | 0.15 |
协方差矩阵:
| | A | B | C |
| - | :-: | :-: | :-: |
| A | 0.1 | 0.2 | 0.15|
| B | 0.2 | 0.3 | 0.2 |
| C |0.15 | 0.2 | 0.25|
我们可以将这些数据存储在一个NumPy数组中,代码如下:
import numpy as np
# 收益率
returns = np.array([0.05, 0.1, 0.15])
# 协方差矩阵
cov_matrix = np.array([[0.1, 0.2, 0.15],
[0.2, 0.3, 0.2],
[0.15, 0.2, 0.25]])
2. 构建优化模型
接下来,我们需要使用Python中的优化库来构建马科维茨投资组合优化模型。这里我们使用SciPy库中的optimize模块来实现,具体代码如下:
from scipy.optimize import minimize
# 定义目标函数
def objective(weights, returns, cov_matrix):
# 计算投资组合收益率
port_return = np.sum(weights * returns)
# 计算投资组合风险(标准差)
port_risk = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
# 返回收益率和风险的加权和
return port_return / port_risk
# 初始权重
init_weights = np.array([0.3, 0.3, 0.4])
# 定义约束条件(权重之和为1)
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
# 定义权重上下限(0到1之间)
bounds = ((0, 1), (0, 1), (0, 1))
# 最小化目标函数
result = minimize(objective, init_weights, args=(returns, cov_matrix), constraints=constraints, bounds=bounds)
# 输出最优权重和投资组合收益率、风险
print('最优权重:', result.x)
print('投资组合收益率:', np.sum(result.x * returns))
print('投资组合风险(标准差):', np.sqrt(np.dot(result.x.T, np.dot(cov_matrix, result.x))))
最终输出结果如下:
最优权重: [0.1875 0.3125 0.5 ]
投资组合收益率: 0.11875
投资组合风险(标准差): 0.1825741858350554
这说明最优投资组合的权重分别为18.75%、31.25%和50%,收益率为11.875%,风险(标准差)为18.26%。