PyPortfolioOpt

python   python   MIT license   MIT license   DOI badge  

PyPortfolioOpt

PyPortfolioOpt是一个投资组合优化的库,方法包括经典的有效前沿技术和 Black-Litterman 模型,以及该领域的最新发展技术如收缩和分级风险平价。 以及一些新的实验特性,如指数加权协方差。

PyPortfolioOpt 的适用范围很广并且很容易扩展,对业余投资者和专业从业者都适用。 无论你是一个基本面投资者,发现了一些被低估的股票,还是一个拥有一篮子策略的算法交易员,PyPortfolioOpt 都可以帮你以一种风险可控的方式使用 alpha。

译者说

由于文档中很多方法我没有实践过,所以翻译可能会有一些错误。 如果发现翻译错误的地方,请联系我告知,我会尽快修改。 联系方式在”无噪量化”首页的下方,感谢!

我会定期检查 PyPortfolioOpt Git 库的更新,保证翻译的及时性。

如果您对投资组合感兴趣,也可以参考另一个库 Riskfolio-Lib。 我也翻译了它的文档,地址是:https://www.wuzao.com/document/riskfolio-lib/

安装

如果想在浏览器中直接运行 PyPortfolioOpt,你可以 在这里 启动 Binder。 它需要一段时间初始化,然后就可以在不安装任何东西情况下尝试 cookbook 里的例子了。

在安装 PyPortfolioOpt 之前,你需要先安装 C++。在 macOS 上,这意味着你需要安装 XCode 命令行工具( 参阅 这里 )。

对于 Windows 用户,需要 在这里 下载 Visual Studio, 更多的说明可以参阅 这里

可以通过 pip 安装 PyPortfolioOpt:

pip install PyPortfolioOpt

(对于 cvxoptcvxpy 的安装,请参考各自的文档。)

出于最佳实践的考虑,最好是用一个依赖性管理程序来做这件事。我建议使用 poetry 来设置,在一个新的 poetry 项目中运行:

poetry add PyPortfolioOpt

另一种方法是克隆或下载项目源代码,然后在项目目录下运行

python setup.py install

感谢 Thomas Schmelzer 的工作,PyPortfolioOpt 现在支持 Docker 运行(需要 make, docker, docker-compose)。使用 make build 来构建第一个容器,用 make test 来运行测试。更多信息请阅读 指南

备注

如果上述安装过程有问题,请在GitHub上 提 issue ,并贴上“packaging”标签。

对于开发者

如果打算对 PyPortfolioOpt 进行重大的修改,请克隆源代码库并直接使用

git clone https://github.com/robertmartin8/PyPortfolioOpt

另外,如果仍然想要方便的全局 import from pypfopt import x ,应该尝试

pip install -e git+https://github.com/robertmartin8/PyPortfolioOpt.git

快速例子

本节仅包含对 PyPortfolioOpt 功能的快速了解,请进入 用户指南 查看更完整的指南。 更多的例子,请查看 Jupyter notebook cookbook

现在考虑某资产集已经有了期望收益 mu 和风险模型 S ,很容易生成一个最佳投资组合:

from pypfopt.efficient_frontier import EfficientFrontier

ef = EfficientFrontier(mu, S)
weights = ef.max_sharpe()

如果想要用 PyPortfolioOpt 自带的计算收益率和协方差矩阵的方法,也可以这样做:

import pandas as pd
from pypfopt.efficient_frontier import EfficientFrontier
from pypfopt import risk_models
from pypfopt import expected_returns

# Read in price data
df = pd.read_csv("tests/resources/stock_prices.csv", parse_dates=True, index_col="date")

# Calculate expected returns and sample covariance
mu = expected_returns.mean_historical_return(df)
S = risk_models.sample_cov(df)

# Optimize for maximal Sharpe ratio
ef = EfficientFrontier(mu, S)
weights = ef.max_sharpe()
ef.portfolio_performance(verbose=True)

将会输出:

Expected annual return: 33.0%
Annual volatility: 21.7%
Sharpe Ratio: 1.43

目录

项目原则和设计决定

  • 很容易将用户专有的改进引入到优化过程中的各个部分。

  • 可用性是一切:不言自明比一致更好。

  • 证券组合优化没有任何意义,除非它能实际应用于真实的资产价格。

  • 所有已经实施的东西都应进行测试。

  • 类和函数的注释文档不错,独立专用的文档更好,两者并不互斥。

  • 代码格式化不能对代码影响过大,我用 Black 格式化代码。

相对于现有项目的优势

  • 包括经典方法(Markowitz 1952 和 Black-Litterman),最佳实践(如协方差收缩),以及最近发展出新的方法 ,如 L2 正则化、指数协方差、分层风险平价。

  • 对 pandas 数据框架的本地支持:轻松输入每日价格数据。

  • 广泛的实践测试,使用真实的数据。

  • 易于与您的现有策略和模型相结合。

  • 对缺失的数据和不同长度的价格序列有很好的适应性(例如,FB 数据 只追溯到2012年,而 AAPL 的数据则追溯到1980年)。

贡献

下面是一个非详尽的贡献者名单(排名不分先后)。真诚感谢你们所有努力!

  • Philipp Schiele

  • Carl Peasnell

  • Felipe Schneider

  • Dingyuan Wang

  • Pat Newell

  • Aditya Bhutra

  • Thomas Schmelzer

  • Rich Caputo

  • Nicolas Knudde

索引和表格