第 1 章 · 01 是什么 本节摘要:本节是全教程的开篇,回答「PyPortfolioOpt 到底是什么」。它是一个由 Robert Andrew Martin 维护、发表在 JOSS(开源软件学报)上的 Python 投资组合优化库,把马科维茨 1952 年提出的均值-方差模型、Black-Litterman、层次风险平价(HRP)、CLA 等经典方法封装成一套模块化、可替换的 API,设计灵感来自 scikit-learn。它面向「想把若干资产以风险高效的方式组合起来」的人——无论你是基本面投资者挑了几只低估值股票,还是量化交易者持有一篮子策略。本节讲清它的定位、要解决的问题、能力清单、与同类实现的差异,以及许可证与学术引用方式,为后续安装与上手打地基。
本节摘要:本节是全教程的开篇,回答「PyPortfolioOpt 到底是什么」。它是一个由 Robert Andrew Martin 维护、发表在 JOSS(开源软件学报)上的 Python 投资组合优化库,把马科维茨 1952 年提出的均值-方差模型、Black-Litterman、层次风险平价(HRP)、CLA 等经典方法封装成一套模块化、可替换的 API,设计灵感来自 scikit-learn。它面向「想把若干资产以风险高效的方式组合起来」的人——无论你是基本面投资者挑了几只低估值股票,还是量化交易者持有一篮子策略。本节讲清它的定位、要解决的问题、能力清单、与同类实现的差异,以及许可证与学术引用方式,为后续安装与上手打地基。
内容来源:原项目源码
README.md、文档docs/index.rst、JOSS 论文10.21105/joss.03066,汉化并套用体系化模板。
阅读完本节,你应当能够:
投资组合优化的祖宗是马科维茨 1952 年那篇论文——它把「该买什么、各买多少」从一门艺术变成了一个数学问题。核心直觉是:把相关性不同的资产组合在一起,可以在不牺牲收益的前提下降低风险。所有满足「给定风险下收益最高」或「给定收益下风险最低」的组合,在「收益-风险」二维平面上连成一条曲线,叫有效前沿(efficient frontier)。
💡 核心心法:理论很美,但落地要两个未来量——期望收益向量 μ 与协方差矩阵 Σ。未来不可知,只能用历史数据估计;估计得越准,优化越靠谱。这就是 PyPortfolioOpt 全部功能围绕的两件事:估输入 + 求最优。
数学上,最朴素的马科维茨问题写成:
minimize wᵀ Σ w (组合方差,即波动率的平方) subject to wᵀ μ ≥ μ* (收益不低于目标) wᵀ 1 = 1 (权重和为 1) w_i ≥ 0 (只做多)
把目标收益 μ* 从低到高扫一遍,每个 μ* 都解出一个最优 w,这些点连起来就是有效前沿。PyPortfolioOpt 把这套求解以及围绕它的「估 μ、估 Σ、加约束、换风险度量」封装成了几行可调用的 Python 代码。
PyPortfolioOpt 的自我定位有三个关键词,缺一不可:
10.21105/joss.03066。这意味着代码与文档经受了同行评议,可被学术工作正式引用。按官方 README 的分类,PyPortfolioOpt 提供四大块功能:
| 层 | 模块 | 主要能力 |
|---|---|---|
| 期望收益 | expected_returns |
均值历史收益、指数加权 EMA、CAPM |
| 风险模型 | risk_models |
样本协方差、半协方差、指数协方差、收缩估计(Ledoit-Wolf/OAS)、MCD |
| 目标函数 | objective_functions |
方差、收益、夏普、二次效用、L2 正则、交易成本、跟踪误差 |
| 优化器 | efficient_frontier 等 |
EfficientFrontier(均值-方差)、EfficientSemivariance、EfficientCVaR、EfficientCDaR、HRP、CLA |
此外还有 Black-Litterman 模型(BlackLitterman)把先验与主观观点融合成更稳的收益估计,以及离散分配(discrete_allocation)把连续权重换算成「买几股」的整数分配。这两块会在后续章节专讲。
💡 默认推荐:作者在文档里反复强调,生产环境不要用样本协方差,而应使用 Ledoit-Wolf 收缩估计;收益估计若没有自研模型,可直接放弃(只跑
min_volatility)或用 CAPM。这与你看到的多数「教程默认值」不同,是经验之谈。
README 单列「相对现有实现的优势」一节,要点提炼如下:
tests/resources/stock_prices.csv),每个方法都跑过真实样本。EfficientFrontier。与「自己拿 cvxopt/cvxpy 手写」相比,PyPortfolioOpt 帮你处理了变量替换(如 max_sharpe 的凸化技巧)、PSD 修正(非半正定矩阵自动修复)、整数分配、可视化等「脏活」;与 PyALGO、Riskfolio-Lib 等同类库相比,它更轻、API 更接近 scikit-learn 风格、文档更教学化。
作者在 README 列出六条项目原则,理解它们能帮你预判 API 行为:
⚠️ 免责声明:README 明确写明——本项目内容不构成投资建议,作者不对读者后续的投资决策负责。优化结果只是「在给定输入下的数学最优」,真实市场远比历史数据复杂,请务必回测 + 谨慎决策。
PyPortfolioOpt 采用 MIT 许可证,允许商用、修改、分发,只需保留版权声明。这对个人与机构都很友好。
若你在公开发表的研究或产品中用到它,作者请求按以下格式引用:
Martin, R. A., (2021). PyPortfolioOpt: portfolio optimization in Python. Journal of Open Source Software, 6(61), 3066, https://doi.org/10.21105/joss.03066
或在 BibTeX 中:
@article{Martin2021, doi = {10.21105/joss.03066}, url = {https://doi.org/10.21105/joss.03066}, year = {2021}, publisher = {The Open Journal}, volume = {6}, number = {61}, pages = {3066}, author = {Robert Andrew Martin}, title = {PyPortfolioOpt: portfolio optimization in Python}, journal = {Journal of Open Source Software} }
下一节,我们用 pip 装好它,读入真实股价数据,跑出第一个最大夏普组合——三行代码就能输出权重。