
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
(对于 cvxopt 和 cvxpy 的安装,请参考各自的文档。)
出于最佳实践的考虑,最好是用一个依赖性管理程序来做这件事。我建议使用 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