Python 语言 用 Scipy 优化投资组合 马科维茨均值 方差模型

Python阿木 发布于 2025-06-09 10 次阅读


阿木博主一句话概括:基于Scipy的Python语言实现马科维茨均值-方差投资组合优化模型

阿木博主为你简单介绍:
本文将介绍如何使用Python语言和Scipy库实现马科维茨均值-方差投资组合优化模型。马科维茨模型是现代投资组合理论的核心,它通过最小化投资组合的方差来最大化预期收益率。本文将详细阐述模型的原理,并给出具体的代码实现,包括数据预处理、参数设置、模型计算和结果分析。

关键词:马科维茨模型,投资组合优化,Scipy,Python

一、
投资组合优化是金融领域的一个重要研究方向,旨在通过合理配置资产,实现收益最大化或风险最小化。马科维茨均值-方差模型是投资组合优化中的经典模型,它通过考虑资产的预期收益率和协方差矩阵来构建最优投资组合。本文将使用Python语言和Scipy库来实现这一模型。

二、马科维茨均值-方差模型原理
马科维茨模型的基本思想是,在给定的风险水平下,选择能够带来最大预期收益率的投资组合;或者在给定的预期收益率下,选择风险最小的投资组合。模型的核心是以下公式:

[ text{Maximize} quad E(R_p) - lambda cdot sigma_p^2 ]

其中,( E(R_p) ) 是投资组合的预期收益率,( sigma_p^2 ) 是投资组合的方差,( lambda ) 是风险厌恶系数。

三、Python代码实现
以下是基于Scipy库的Python代码实现马科维茨均值-方差投资组合优化模型。

python
import numpy as np
from scipy.optimize import minimize

假设我们有以下数据:
expected_returns = np.array([0.12, 0.10, 0.07, 0.05]) 各资产的预期收益率
cov_matrix = np.array([[0.10, 0.01, 0.02, 0.03],
[0.01, 0.08, 0.02, 0.03],
[0.02, 0.02, 0.07, 0.02],
[0.03, 0.03, 0.02, 0.09]]) 各资产间的协方差矩阵

定义目标函数,用于最小化风险
def objective(weights):
portfolio_return = np.sum(weights expected_returns)
portfolio_volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
return -portfolio_return + 0.1 portfolio_volatility 目标函数为负值,因为minimize函数默认进行最小化

定义约束条件,权重之和为1
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})

定义权重范围
bounds = tuple((0, 1) for _ in range(len(expected_returns)))

初始权重
initial_weights = np.array([0.25, 0.25, 0.25, 0.25])

使用minimize函数进行优化
optimal_weights = minimize(objective, initial_weights, method='SLSQP', bounds=bounds, constraints=constraints)

输出优化后的权重
print("Optimal weights:", optimal_weights.x)

四、结果分析
通过上述代码,我们得到了优化后的投资组合权重。这些权重可以用来构建实际的投资组合。在实际应用中,我们可能需要根据市场情况调整参数,如预期收益率和协方差矩阵。

五、总结
本文介绍了如何使用Python语言和Scipy库实现马科维茨均值-方差投资组合优化模型。通过代码实现,我们可以得到最优的投资组合权重,从而在风险和收益之间找到平衡。在实际应用中,我们需要不断调整模型参数,以适应市场变化。

(注:本文代码仅为示例,实际应用中可能需要根据具体情况进行调整。)