使用Python进行投资组合优化

2025年3月13日 | 7 分钟阅读

投资组合优化导论

Python 投资组合优化本质上是利用数学和计算方法来构建一个投资组合,该组合将围绕以下优化目标之一做出决策:在给定风险水平下最大化收益,或在给定收益水平下最小化风险。Python 在这方面尤其有用,因为有许多库可以帮助进行数据分析、可视化和优化。

Python - 结合了金融理论、量化分析和计算技术,它有助于设计出根据风险和收益等特定投资目标进行平衡的投资组合。该语言提供的强大库和灵活性使其在学者、分析师和投资组合经理中广受欢迎。

通过使用 yfinance 库,本文的分析数据从雅虎财经检索了包括中国石油、百威英博、埃克森美孚、波音等公司股票的数据。此外,还使用了 Python 中的重要 ,包括 NumPyMatplotlibSeabornPandas 来进行管理和可视化。

处理后,在股票数据中增加了相关的要素,如星期几、滚动波动率、年份和月份。为了检验投资组合中股票之间的关联性,创建了相关矩阵,并计算了历史收益率和未来增长指标。

在 Python 中实现投资组合优化

现在,我们将按照分步方法,在 Python 编程语言中实现投资组合优化。

第一步:导入所需的库

第二步:定义投资参数

第三步:获取股票数据

第四步:分析股票数据

第五步:计算预期收益和协方差矩阵

第六步:实现投资组合优化:最小波动率

第七步:实现投资组合优化:最大夏普比率

第八步:分析投资组合绩效

第九步:创建投资组合收益直方图

第十步:评估 VaR 和 CvaR

第十一步:优化 CVar

第十二步:通过蒙特卡洛模拟绘制有效前沿

第十三步:执行离散分配

现在让我们详细讨论这些步骤。

导入所需库

首先,我们导入用于数据处理、金融计算和可视化的必要库。

定义投资参数

接下来,我们定义投资金额以及要分析的股票的股票代码(ticker symbols)。

获取股票数据

在本节中,我们将从雅虎财经获取历史股票数据,并生成相关特征,例如每日增长率和滚动波动率。

说明

指定的代码初始化了一个空 DataFrame,用于存放给定股票代码列表的历史股票价格和相关数据。使用 yfinance 库,它检索每个股票代码的历史价格数据,并计算一些特征,例如不同时间范围(1、3、7、30、90 和 365 天)的历史收益率、3 天内的未来增长率以及 30 天滚动波动率。每个股票代码的处理数据被合并到一个名为 stocks_prices 的 DataFrame 中,该 DataFrame 包含所有可供检查的历史数据。

输出

 
0 PTR
1 BUD
2 XOM
3 BA
4 CHTR
5 SHOP
6 NVDA
7 NKE   

分析股票数据

在获取和处理股票数据后,我们创建一个数据透视表进行分析,并可视化股票之间的相关性。

说明

该代码从 stocks_prices DataFrame 生成一个数据透视表 (df_pivot),该表将股票收盘价按日期作为行,按股票代码作为列进行排列。然后使用 corr() 方法计算相关矩阵,该矩阵显示投资组合中不同股票收益之间的关联性。

输出

Portfolio Optimization Using Python

说明

为了避免重复,在此热力图可视化代码中隐藏了股票收益相关矩阵的上三角部分。热力图使用从红色到绿色的颜色渐变显示了相关性的方向和强度,并带有每个相关性值的注释。

输出

Portfolio Optimization Using Python

预期收益和协方差矩阵计算

我们使用 PyPortfolioOpt 库来计算基于不同标准(例如最小波动率和最大夏普比率)的最优投资组合。

说明

为了最小化估计误差,此方法使用 Ledoit-Wolf 收缩来计算股票收益的协方差矩阵,并使用资本资产定价模型 (CAPM) 来确定股票的预期收益。在金融领域,协方差矩阵 (S) 和预期收益 (mu) 是投资组合优化的关键输入。

输出

 
Expected returns for each stock: 
Ticker
BA      0.213434
BUD     0.139353
CHTR    0.127584
NKE     0.197153
NVDA    0.393164
PTR     0.219011
SHOP    0.289967
XOM     0.129002
Name: mkt, dtype: float64   

投资组合优化:最小波动率

说明

为了降低投资组合波动率,此代码计算理想的资产权重,同时确保它们保持在 0 到 1 之间(不允许卖空)。它是通过使用有效前沿方法来实现的。然后打印投资组合权重和绩效指标(收益率、波动率和夏普比率),并使用水平条形图显示权重。

输出

 
Portfolio weights for min volatility optimisation (lowest level of risk): 
{
    "BA": 0.0,
    "BUD": 0.37202,
    "CHTR": 0.35686,
    "NKE": 0.03076,
    "NVDA": 0.0,
    "PTR": 0.04408,
    "SHOP": 0.14438,
    "XOM": 0.0519
}
Expected annual return: 16.2%
Annual volatility: 8.9%
Sharpe Ratio: 1.67   

投资组合优化:最大夏普比率

说明

该方法在优化投资组合以获得最大夏普比率(该比率表示每单位风险的最大回报)后,提取相应的投资组合权重。它分析投资组合的绩效,考虑夏普比率、预期收益和波动率,并将这些权重以结构化的 JSON 格式输出。

输出

 
Portfolio weights for max Sharpe optimisation (highest return-per-risk): 
{
    "BA": 0.01337,
    "BUD": 0.23976,
    "CHTR": 0.15556,
    "NKE": 0.04143,
    "NVDA": 0.07875,
    "PTR": 0.11127,
    "SHOP": 0.35987,
    "XOM": 0.0
}
Expected annual return: 22.4%
Annual volatility: 10.7%
Sharpe Ratio: 1.91   

投资组合绩效

说明

该投资组合预计将有 10.7% 的预期波动率和 22.4% 的年化收益,夏普比率为 1.91,表明风险调整后收益为正。

输出

 
Expected annual return: 22.4%
Annual volatility: 10.7%
Sharpe Ratio: 1.91   

投资组合收益直方图

说明

此代码生成一个具有 50 个 bin 的直方图,以表示个体股票收益的分布,然后将其乘以每只股票的权重以确定投资组合的总收益。

输出

Portfolio Optimization Using Python

VaR 和 CvaR

  • VaR(风险价值):在给定置信水平下的最大预期损失。
  • CVaR(条件风险价值):在 VaR 阈值之外最坏情况下的平均损失。

说明

风险价值 (VaR) 通过计算给定时间段内的最大预期损失(5% 分位数)来确定正常市场条件下的最坏情况损失。条件风险价值 (CVaR) 是指 VaR 阈值之上的平均损失,因为它提供了有关极端情况下损失可能严重程度的信息。

输出

 
VaR: -2.56%
CVaR: -4.01%   

CVar 优化

说明

为了通过最小化条件风险价值 (CVaR) 来优化投资组合(CVaR 衡量极端情况下的可能损失),代码从 PyPortfolioOpt 包中导入了 EfficientCVaR 类。它确定投资组合的理想权重并评估其绩效,展示 CVaR 和预期收益等相关统计数据。

输出

 
Expected annual return: 15.8%
Conditional Value at Risk: 2.99%   

通过蒙特卡洛模拟绘制有效前沿

说明

此代码使用蒙特卡洛模拟叠加随机投资组合,并绘制有效前沿。除了使用标题、图例和表示夏普比率的颜色映射来格式化图表外,它还显示了最大夏普比率,即切点组合。

输出

Portfolio Optimization Using Python

离散分配

说明

此函数使用 PyPortfolioOpt 的 DiscreteAllocation,根据最新的股票价格和最优权重 (weights_max_sharpe) 来分配给定的投资金额 (INVESTMENT)。它打印出投资组合中每只股票的股份数量以及分配后剩余的现金金额。

输出

 
Discrete allocation for the initial investment $2000 performed with $137.10 leftover
{'BUD': 8, 'CHTR': 1, 'NKE': 1, 'NVDA': 1, 'PTR': 6}   

结论

通过利用计算工具和数学模型,投资者可以通过 Python 投资组合优化来构建有效的投资组合。Python 为数据分析、金融建模和可视化提供的强大工具使得找到最小化给定回报的风险或最大化给定风险的回报的最优资产配置更加容易。通过使投资组合经理能够根据市场数据、过往业绩和风险承受能力定制策略,这种技术可以改进决策,并产生更智能、更成功的投资策略。