专栏名称: Python中文社区
致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。 官方网站:www.python-cn.com
目录
相关文章推荐
Python开发者  ·  o3-mini 碾压 DeepSeek ... ·  3 天前  
Python开发者  ·  请立即拿下软考证书(政策风口) ·  2 天前  
Python爱好者社区  ·  推荐我的抖音变现俱乐部! ·  2 天前  
Python爱好者社区  ·  吴恩达,yyds ·  3 天前  
Python爱好者社区  ·  DeepSeek薪资曝光! ·  3 天前  
51好读  ›  专栏  ›  Python中文社区

均衡风险与收益?用 Python 进行投资组合优化

Python中文社区  · 公众号  · Python  · 2024-12-06 09:55

正文

大家好,我是橙哥!在风云变幻的交易市场中,做出明智的投资决策对于最大化回报同时最小化风险至关重要。投资者手中的一个关键工具是投资组合优化,它有助于选择最佳的资产分配以实现预期的投资目标。无论你是经验丰富的投资者还是新手,理解和应用投资组合优化技术都能显著增强投资策略。
在本文中,我们将深入了解使用 Python 进行投资组合优化的基础知识。我们将利用 skfolio 库,这是一个专为金融投资组合优化设计的综合工具包,来演示如何加载金融数据、预处理数据并将其分为训练集和测试集来进行投资组合优化。通过本文的学习,你将掌握优化投资组合的基础知识,具备做出更明智投资决策的技能。
什么是投资组合优化?
投资组合优化是选择各种资产在投资组合中的比例,以使投资组合根据某些标准变得更好的过程。通常,这涉及平衡风险与回报之间的权衡,以实现最佳的投资结果。这一过程基于现代投资组合理论(MPT),该理论由 Harry Markowitz 在 1950 年代引入。MPT 建议投资者可以通过构建包含多种资产的投资组合,在给定风险水平下最大化回报或在给定预期回报水平下最小化风险
为什么用 Python 进行投资组合优化?

Python 已成为金融分析和量化金融的首选编程语言,因为它拥有强大的库和工具生态系统。像 pandas、numpy 和 scikit-learn 这样的库提供了强大的数据操作和分析能力,而像 skfolio 这样的专用库则为投资组合优化提供了量身定制的解决方案。Python 的多功能性和易用性使其成为实施和测试各种金融模型和策略的理想选择,帮助我们选择使用最有效和高效的工具。

导入必要的库
在深入实际代码之前,让我们了解将使用的库以及它们对我们的任务为何至关重要。

Population:skfolio中用于表示投资组合候选集的类。

RiskMeasure:用于衡量投资组合风险的类。

load_sp500_dataset:加载S&P 500指数历史价格数据的函数。

EqualWeighted:一种将所有资产在投资组合中分配相等的权重的策略。

MeanRisk:一种基于均值-方差优化的投资组合优化策略。

ObjectiveFunction:表示要优化的目标函数。

prices_to_returns:将历史价格数据转换为回报的函数,这是投资组合优化所必需的。
这些库组成了一个强大的工具包,用于实现和分析投资组合优化技术。
开始数据准备工作
既然我们已经导入了必要的库,让我们继续加载和准备数据。

加载数据集:load_sp500_dataset 函数加载了 S&P 500 指数的历史价格数据。

将价格转换为回报:prices_to_returns 函数将价格数据转换为回报,这对于投资组合优化至关重要。它计算百分比变化并删除任何缺失值。

拆分数据:我们使用 sklearn 中的 train_test_split 函数将数据拆分为训练集和测试集。这有助于我们评估模型在数据上的表现。

构建投资组合优化模型

接下来,我们构建并拟合一个投资组合优化模型。我们将使用 skfolio 库中的 MeanRisk 类来最小化条件风险价值(CVaR),这是一种衡量投资风险的指标。

模型初始化:我们使用最小化条件风险价值(CVaR)的目标初始化均值-风险模型,并通过portfolio_params为投资组合赋予了一个名称。
模型拟合:我们利用训练数据X_train拟合模型。
获取权重:拟合模型后,我们使用model.weights_attribute获取优化的投资组合权重。
优化后的投资组合权重的输出是一个数组,数组中的每个元素对应于投资组合中的一项资产。以下是优化后的权重数组:

非零权重:资产权重主要集中在少数关键资产上。例如,第8、4和14个资产的权重相对较高(例如,2.16562529e-02、1.47358386e-02、1.35927671e-01)。
近零权重:一些权重非常接近于零(例如,1.41742527e-10、3.64888981e-11),表明这些资产对优化投资组合的贡献几乎可以忽略不计。这表明由于这些资产的较高相关风险或较低预期回报,模型已将它们排除在投资组合之外。
高权重:权重最高的资产(例如,2.10319630e-01、1.52708811e-01)被模型认为在CVaR优化标准下具有更好的风险调整回报。

基准投资组合:等权重

为了给我们的投资组合优化提供基准,我们将创建一个等权重投资组合。这种投资组合对每个资产分配相同权重,不考虑其风险或预期回报。这种方法可以作为基准与更复杂的优化策略进行简单而有效的比较。

以下是实施和评估等权重投资组合的步骤:

EqualWeighted 初始化:我们初始化 EqualWeighted 等权重投资组合,为其命名以便识别。
拟合模型:尽管等权重投资组合中的权重是预先确定的,不受数据影响,但我们仍然调用 fit 方法以保持与 API 接口的一致性。
获取权重:我们使用 benchmark.weights_ 属性获取基准投资组合的权重。

等权重组合的权重输出是一个数组,其中每个元素代表分配给特定资产的权重。由于这是等权重组合,每个资产的权重相同。

等权重分配:等权重投资组合为投资组合中的每项资产分配5%的相同权重。
简单性和多样化:这种方法通过将投资平均分配到所有可用资产中,确保了最大程度的多样化,从而减少任何单一资产的业绩对整个投资组合的影响。
作为基准的比较:等权重投资组合作为基准,用于比较更复杂的优化策略的表现。它提供了一个基准,以评估诸如均值-风险优化等高级方法是否能提供更优越的风险调整回报。
与基准比较的模型预测
在拟合我们的投资组合优化模型后,评估它们在数据上的表现至关重要。我们将使用测试集进行预测,并将我们优化后的投资组合的表现与等权重基准进行比较。
以下是用于生成和比较预测的代码:

模型预测:我们使用优化模型的预测方法在测试数据(X_test)上生成预测。

基准预测:同样,我们使用等权重基准的预测方法在相同的测试数据上生成预测。

转换为数组格式:我们将优化模型的预测并转换为NumPy数组格式,以便于处理和分析。

模型预测的输出是一个数组,其中每个元素代表测试集中每个时间段的预测回报:

预测值:数组中的每个值代表优化投资组合在测试数据中相应时间段内的预期回报。
正值:表示预期收益。
负值:表示预期损失。
预测范围:预测值随时间变化,反映模型对投资组合在不同市场条件下表现的估计。
使用条件风险价值(CVaR)评估风险
为了评估投资组合优化模型相关的风险,我们可以计算条件风险价值(CVaR)。CVaR是一种风险评估指标,用于估计在超过指定置信水平的极端情况下投资组合的预期损失。CVaR常用于量化投资组合在不利市场条件下的潜在损失
以下是计算并比较优化模型和等权重基准CVaR的过程:
1、确定计算CVaR的置信水平。
2、计算在指定置信水平下的投资组合损失分布。
3、计算CVaR,即在超过置信水平的损失分布中的预期损失。
4、比较优化模型和等权重基准的CVaR值,评估两者的风险水平。

优化模型的CVaR:0.0217

该值表示,在最坏情况下,优化投资组合的预期损失约为2.17%。

基准CVaR:0.0251

该值表示,在最坏情况下,等权重投资组合的预期损失约为2.51%。

比较分析

优化模型的CVaR值较低:优化模型的CVaR(2.17%)低于基准(2.51%)。这表明,在最坏情况下,优化投资组合的预期损失较低,使其相对于等权重投资组合而言风险较低。

风险降低:通过均值-风险优化策略,CVaR的降低展示了其在最小化风险方面的有效性。通过专注于最小化CVaR,优化投资组合在管理潜在极端损失方面比等权重基准更有效。

可视化投资组合的构成

为了更好地理解我们的优化投资组合与等权重基准之间的差异,我们可以可视化每个投资组合的构成。以下代码生成一个图表来比较资产分配:

输出是两个投资组合中资产配置的直观展示。以下是生成图表:

投资组合名称:图表展示了两个投资组合:“最小CVaR”和“等权重”。

资产:每种颜色代表一种不同的资产。

权重:y轴显示了各资产在投资组合中的权重,范围从0%到100%。

最小CVaR投资组合:优化后的投资组合(最小CVaR)具有更集中的分配,少数资产被分配了更高的权重。这表明优化过程已经识别出能够最小化风险的特定资产,从而形成了一个集中度较高但风险可能较低的投资组合。

等权重投资组合:等权重投资组合将权重均匀分配给所有资产,形成一个高度分散的投资组合。每个资产都获得5%的等权重,确保没有任何单一资产主导投资组合。

累计收益图

累计收益图展示了投资组合的收益随时间累积的情况,可以帮助我们理解最小CVaR投资组合与等权重投资组合的长期表现。

绘制累计收益曲线:Population类的plot_cumulative_returns方法生成一个图表,显示投资组合随时间的累计收益曲线。

展示图表:plotly.io模块中的show函数展示生成的图表。

该图表展示了两个投资组合随时间的累计回报。累计回报表示从开始到某一特定时间点的资产或投资组合的总回报。
最小CVaR投资组合(蓝线)

回报趋势:最小CVaR投资组合用蓝线表示。该投资组合随时间呈上升趋势,但其累计回报低于等权重投资组合。





请到「今天看啥」查看全文

推荐文章
Python开发者  ·  请立即拿下软考证书(政策风口)
2 天前
Python爱好者社区  ·  推荐我的抖音变现俱乐部!
2 天前
Python爱好者社区  ·  吴恩达,yyds
3 天前
Python爱好者社区  ·  DeepSeek薪资曝光!
3 天前
BMWsky宝马会  ·  【辣图】排气一响,黄金万两!
8 年前
港剧剧透社  ·  太太随时生得 黎诺懿怕血唔敢剪脐带
7 年前