python中的金融投资组合优化
pyportfolioopt的Python项目详细描述
pyportfolioopt是一个实现广泛使用的经典投资组合优化技术的库,具有许多实验特性。它是广泛的,但很容易扩展,对普通投资者和专业人士都很有用。
无论你是一个以基本面为导向的投资者,还是一个有着一篮子有趣信号的算法交易者,Pyportfolioopt都可以帮助你以一种风险有效的方式组合你的阿尔法生成器。
转到"阅读文档"上的文档以深入了解项目,或继续下面的部分示例。
<;居中>; <;/居中>;目录
开始
这个项目在pypi上提供,这意味着您可以:
pip install PyPortfolioOpt
不过,我后来改成了诗歌
,所以我现在的建议是让自己设置诗歌,然后运行
poetry add PyPortfolioOpt
否则,克隆/下载项目并在项目目录中运行:
python setup.py install
用于开发
如果您希望进行重大更改以将其与您的专有系统集成,克隆此存储库并仅使用源代码可能是有意义的。
git clone https://github.com/robertmartin8/PyPortfolioOpt
或者,您可以尝试:
pip install -e git+https://github.com/robertmartin8/PyPortfolioOpt.git
一个简单的例子
这是一个关于真实股票数据的例子,展示了如何轻松地找到最大化夏普比率(一种风险调整回报的衡量指标)的唯一长期投资组合。
importpandasaspdfrompypfopt.efficient_frontierimportEfficientFrontierfrompypfoptimportrisk_modelsfrompypfoptimportexpected_returns# Read in price datadf=pd.read_csv("tests/stock_prices.csv",parse_dates=True,index_col="date")# Calculate expected returns and sample covariancemu=expected_returns.mean_historical_return(df)S=risk_models.sample_cov(df)# Optimise for maximal Sharpe ratioef=EfficientFrontier(mu,S)raw_weights=ef.max_sharpe()cleaned_weights=ef.clean_weights()print(cleaned_weights)ef.portfolio_performance(verbose=True)
这将输出以下权重:
{'GOOG': 0.01269, 'AAPL': 0.09202, 'FB': 0.19856, 'BABA': 0.09642, 'AMZN': 0.07158, 'GE': 0.0, 'AMD': 0.0, 'WMT': 0.0, 'BAC': 0.0, 'GM': 0.0, 'T': 0.0, 'UAA': 0.0, 'SHLD': 0.0, 'XOM': 0.0, 'RRC': 0.0, 'BBY': 0.06129, 'MA': 0.24562, 'PFE': 0.18413, 'JPM': 0.0, 'SBUX': 0.03769} Expected annual return: 33.0% Annual volatility: 21.7% Sharpe Ratio: 1.43
pyportfolioopt提供了一种方法,允许您将上述连续权重转换为可以购买的实际分配,而不只是停留在这里。只需输入最新价格和所需的投资组合大小(本例中为10000美元):
frompypfopt.discrete_allocationimportDiscreteAllocation,get_latest_priceslatest_prices=get_latest_prices(df)da=DiscreteAllocation(weights,latest_prices,total_portfolio_value=10000)allocation,leftover=da.lp_portfolio()print("Discrete allocation:",allocation)print("Funds remaining: ${:.2f}".format(leftover))
11 out of 20 tickers were removed Discrete allocation: {'GOOG': 0, 'AAPL': 5, 'FB': 11, 'BABA': 5, 'AMZN': 1, 'BBY': 7, 'MA': 14, 'PFE': 50, 'SBUX': 5} Funds remaining: $8.42
免责声明:本项目不构成投资建议,作者对您以后的投资决策不负任何责任。有关详细信息,请参阅许可证。
经典投资组合优化方法概述
哈利·马科维茨(harry markowitz)1952年的论文是不可否认的经典,它将投资组合优化从一门艺术变成了一门科学。关键的见解是,通过将具有不同预期回报和波动性的资产组合起来,人们可以决定一个数学上最优的配置,从而将目标回报的风险最小化——所有这些最优投资组合的集合称为"有效前沿"。
尽管在这个问题上已经取得了很大的进展,但半个多世纪后,马科维茨的核心思想仍然具有根本性的重要性,并在许多投资组合管理公司中得到了广泛的应用。均值方差优化的主要缺点是,理论上的处理需要了解资产的预期收益和未来风险特征(协方差)。显然,如果我们知道股票生活的预期回报会容易得多,但整个游戏是,众所周知,股票回报率很难预测。作为替代,我们可以根据历史数据得出预期收益和协方差的估计值——虽然我们确实失去了马科维茨提供的理论保证,但我们的估计值越接近实际值,我们的投资组合就越好。
因此,这个项目提供了四个主要的功能集(当然它们是密切相关的)
- 预计收益
- 资产协方差估计
- 要优化的目标功能
- 有效前沿的参数
功能
在本节中,我们将根据上面的breakdo详细介绍pyportfolioopt的当前可用功能WN。在examples.py
更全面的版本可以在readthedocs上找到,还可以为更高级的用户提供扩展。
预期收益
- 平均历史收益:
- 最简单和最常见的方法,即每项资产的预期收益等于其历史收益的平均值。
- 易于理解且非常直观
- 指数加权平均历史收益:
- 与平均历史收益率类似,只是它对近期价格的权重呈指数增长
- 在估计未来收益时,一项资产最近的收益可能比10年前的收益更为重要。
风险模型(协方差)
协方差矩阵不仅对资产的波动性进行编码,还对其与其他资产的相关性进行编码。这一点很重要,因为为了获得多样化的收益(从而增加单位风险的回报),投资组合中的资产应尽可能不相关。
- 样本协方差矩阵:
- 协方差矩阵的无偏估计
- 相对容易计算
- 多年来的事实标准
- 但是,它有一个很高的估计误差,这在均值方差优化中特别危险,因为优化者可能会对这些错误的估计给予过多的权重。
- 半卵巢:一种关注下行变化的风险度量。
- 指数协方差:对样本协方差的一种改进,它赋予最近的数据更多的权重
- 协方差收缩:将样本协方差矩阵与结构化估计器相结合以减少错误权重影响的技术。pyportfolioopt为
sklearn.covariance
提供的高效矢量化实现提供包装。- 手工收缩
- Ledoit Wolf收缩,选择最佳收缩参数。我们提供三个收缩目标:
恒定方差
,单一因子
,以及恒定相关
- Oracle近似收缩率
- 最小协方差行列式:
- 协方差的稳健估计
- 在
sklearn.covariance中实现
目标函数
- 最大夏普比率:这导致了相切投资组合,因为在收益与风险的关系图上,该投资组合对应于有效边界的切线,其y截距等于无风险利率。这是默认选项,因为它可以找到单位风险的最佳回报。
- 最小波动率。如果你想知道波动率有多低,这可能是有用的,但在实践中,对我来说,使用最大化夏普比率的投资组合更有意义。
- 有效回报,亦称markowitz投资组合,它将给定目标回报的风险最小化–这是markowitz 1952的主要关注点
- 有效风险:给定目标风险的夏普最大化投资组合。
- 风险条件值:尾部损失的度量
可选参数
- 长/短:默认情况下,pyportfolioopt中的所有均值-方差优化方法都是长的,但可以通过更改权重边界来初始化它们,以允许空头头寸:
pip install PyPortfolioOpt0
- 市场中立性:对于
有效的风险
和有效的回报
方法,pyportfolioopt提供了形成市场中立投资组合的选项(即权重和为零)。对于最大夏普投资组合和最小波动率投资组合来说,这是不可能的,因为在这些情况下,它们不是入侵关于杠杆率的争论。市场中立性要求负权重:
pip install PyPortfolioOpt1
- 最小/最大头寸规模:在这种情况下,您可能不希望证券占您投资组合的10%以上。这很容易编码:
pip install PyPortfolioOpt2
- L2正则化:这是一个新的实验特性,可以用来减少任何目标函数的可忽略权重。本质上,它在小权重上增加了一个惩罚(参数化为
gamma
),这个术语看起来就像机器学习中的l2正则化。可能需要尝试一些gamma
值,以获得所需数量的不可忽略的权重。对于20种证券的测试组合而言,gamma~1
就足够了
pip install PyPortfolioOpt3
其他乐观者
上述特点主要涉及通过二次规划的有效边界优化。但是,我们也提供不同的乐观主义者:
- 分层风险平价,使用聚类算法选择不相关资产
- markowitz的临界线算法(cla)
有关详细信息,请参阅文档。
与现有实现相比的优势
- 包括两种经典方法(Markowitz 1952),建议的最佳实践 (例如协方差收缩),以及许多最新的发展和新的 特征,如L2正则化、收缩协方差、层次风险平价。
- 本地支持Pandas数据帧:轻松输入每日价格数据。
- 广泛的实际测试,使用真实数据。
- 易于与您自己的专有策略和模式结合。
- 对缺失数据和不同长度的价格序列(如FB数据)具有鲁棒性 只追溯到2012年,而AAPL数据则追溯到1980年。
项目原则和设计决策
- 优化过程的各个部分应该很容易互换 用户的专有改进。
- 可用性是一切:与其始终如一,不如不言而喻。
- 投资组合优化是没有意义的,除非它实际上可以 适用于实际资产价格。
- 所有已实施的都应进行测试。
- 内联文档很好:专用(独立)文档更好。 两者并非互斥。
- 格式化永远不会妨碍好的代码:正因为如此, 我已将所有格式化决定推迟到黑色
路线图
请随意提出请求任何新功能的问题–以下是我要实现的一些功能:
- 自定义效用函数,包括风险规避
- 绘制有效边界。
- 更多优化目标,包括Calmar比率、Sortino比率等。
- 使用自定义分布进行蒙特卡罗优化
- 黑色垃圾人投资组合选择
- 使用线性规划改进CVAR优化。
测试
测试是用pytest编写的(在我看来,它比unittest和变量更直观),我试图确保接近100%的覆盖率。通过导航到package目录并在命令行上运行pytest
来运行测试。
Pyportfolioopt提供了20个股票的每日回报测试数据集:
pip install PyPortfolioOpt4
这些票务已非正式地选定,以满足许多标准:
- 合理的液体
- 不同的性能和波动性
- 要测试稳健性的不同数据量
目前,测试还没有探索所有的边缘情况和组合 目标函数和参数。但是,每个方法和参数都有 特德按预期工作。
贡献
贡献是最受欢迎的。有关更多信息,请参阅贡献指南。
取得联系
如果您出于任何原因想联系我们,无论是咨询机会还是只是聊天,请通过我的网站上的表格进行联系。