使用Python进行投资组合优化2025年3月13日 | 7 分钟阅读 投资组合优化导论Python 投资组合优化本质上是利用数学和计算方法来构建一个投资组合,该组合将围绕以下优化目标之一做出决策:在给定风险水平下最大化收益,或在给定收益水平下最小化风险。Python 在这方面尤其有用,因为有许多库可以帮助进行数据分析、可视化和优化。 Python - 结合了金融理论、量化分析和计算技术,它有助于设计出根据风险和收益等特定投资目标进行平衡的投资组合。该语言提供的强大库和灵活性使其在学者、分析师和投资组合经理中广受欢迎。 通过使用 yfinance 库,本文的分析数据从雅虎财经检索了包括中国石油、百威英博、埃克森美孚、波音等公司股票的数据。此外,还使用了 Python 中的重要 库,包括 NumPy、Matplotlib、Seaborn 和 Pandas 来进行管理和可视化。 处理后,在股票数据中增加了相关的要素,如星期几、滚动波动率、年份和月份。为了检验投资组合中股票之间的关联性,创建了相关矩阵,并计算了历史收益率和未来增长指标。 在 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() 方法计算相关矩阵,该矩阵显示投资组合中不同股票收益之间的关联性。 输出 ![]() 说明 为了避免重复,在此热力图可视化代码中隐藏了股票收益相关矩阵的上三角部分。热力图使用从红色到绿色的颜色渐变显示了相关性的方向和强度,并带有每个相关性值的注释。 输出 ![]() 预期收益和协方差矩阵计算我们使用 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 的直方图,以表示个体股票收益的分布,然后将其乘以每只股票的权重以确定投资组合的总收益。 输出 ![]() VaR 和 CvaR
说明 风险价值 (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% 通过蒙特卡洛模拟绘制有效前沿说明 此代码使用蒙特卡洛模拟叠加随机投资组合,并绘制有效前沿。除了使用标题、图例和表示夏普比率的颜色映射来格式化图表外,它还显示了最大夏普比率,即切点组合。 输出 ![]() 离散分配说明 此函数使用 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 为数据分析、金融建模和可视化提供的强大工具使得找到最小化给定回报的风险或最大化给定风险的回报的最优资产配置更加容易。通过使投资组合经理能够根据市场数据、过往业绩和风险承受能力定制策略,这种技术可以改进决策,并产生更智能、更成功的投资策略。 |
SSL(安全套接字层)是一种数字证书,用于验证网站身份并启用加密连接。它是一种安全协议,有助于在 Web 服务器和 Web 浏览器之间创建加密链接。公司和...
7 分钟阅读
在这个问题中,我们将给定一个有向图。我们的任务是判断有向图是否存在形成循环的路径。让我们看一个有向图的例子 输入:V = 8,E = 9 1 2 ...
阅读9分钟
数据库迁移简介 在快速发展的创新领域,对于希望改进数据管理策略的组织来说,数据库迁移已成为一项关键任务。数据库迁移是指将数据从一个数据库转移到另一个数据库的过程,其中...
阅读9分钟
Python 是一种通用且强大的编程语言,提供了丰富的内置模块和函数来简化开发过程。其中一个模块是 os 模块,它提供了一种与操作系统交互的方式。在 os 模块中,makedirs() 方法 stands...
阅读 3 分钟
? 导入其他Python文件可以实现代码重用和项目组织。您可以使用import语句从当前脚本中访问在其他Python文件中定义的变量、类和函数。Python的导入系统可以实现无缝集成,而不管...
阅读 6 分钟
什么是语音助手?语音助手是基于人工智能和机器学习的软件,用于通过语音命令帮助人类完成日常任务。它能识别人类语音并尝试理解我们的命令并相应地完成任务。语音助手是...
阅读 24 分钟
在本教程中,我们将学习如何在 Python 中实现 GloVe。让我们探讨一下这个主题。本教程包含以下内容:引言 理解 GloVe:概述 设置环境 结论 引言 在不断发展的自然语言处理 (NLP) 领域,词嵌入已成为一种强大的工具...
5 分钟阅读
感知器算法由 Frank Rosenblatt 创建,其灵感来自我们大脑的基本单元(称为神经元)处理信息的方式。该算法建立在 McCulloch-Pitts 神经元概念和 Hebb 研究的基础上。现在,虽然感知器算法有着有趣的历史...
阅读 22 分钟
在 Python 中,Pandas 是一个开源的 Python 库,有助于数据分析和操作、数据预处理和数据清洗。假设您有 JSON 格式、Excel 或 CSV 格式的数据,它是一个组织中员工的列表。现在,您...
5 分钟阅读
在这个问题中,我们将给出 N 本书和 M 名学生。此外,还给出每本书的页数。包含页数的数组是已排序的...
7 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India