portfolio

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Portfolio — Optimización Cuantitativa de Portafolios

Portfolio — 量化投资组合优化

Este skill implementa 3 enfoques de optimización de portafolios desde el material del curso (notebook
Clase_08_teoria_2025_portafolio.ipynb
y PDF
Portafolios 2025 Ucema.pdf
):
  1. Markowitz / Media-Varianza — Optimización convexa vía
    scipy.optimize
    • simulación Monte Carlo + frontera eficiente + CML.
  2. Black-Litterman — Combinación bayesiana de retornos de equilibrio de mercado (CAPM inverso) con views del inversor, incluyendo matriz de incertidumbre Ω (método Idzorek).
  3. HRP / HERC / NCO — Construcción jerárquica de portafolios mediante clustering (single/complete/average/ward), risk parity y NCO con restricciones.
Todos los scripts usan solo
numpy
,
pandas
y
scipy
. Sin dependencias pesadas. Este skill es autónomo: funciona sin
skills/backtesting
.
Para ratios de performance post-optimización (Sharpe, Sortino, VaR, drawdowns, etc.) consultar el skill hermana:
skills/backtesting
.

本Skill实现了课程资料中的3种投资组合优化方法(参考笔记本
Clase_08_teoria_2025_portafolio.ipynb
和PDF
Portafolios 2025 Ucema.pdf
):
  1. Markowitz / 均值-方差 — 通过
    scipy.optimize
    实现凸优化
    • 蒙特卡洛模拟 + 有效前沿 + CML(资本市场线)。
  2. Black-Litterman — 市场均衡收益(逆CAPM)与投资者观点的贝叶斯组合,包含不确定性矩阵Ω(Idzorek方法)。
  3. HRP / HERC / NCO — 通过聚类(单链接/完全链接/平均链接/Ward方法)、风险平价和带约束的NCO实现分层投资组合构建。
所有脚本仅使用
numpy
、
pandas
和
scipy
,无重型依赖。本Skill是独立模块:无需依赖
skills/backtesting
即可运行。
如需优化后的绩效指标(Sharpe、Sortino、VaR、回撤等),请参考姊妹Skill:
skills/backtesting
。
本项目属于Gauss314 Skills Repository。

File Map

文件结构

skills/portfolio/
├── SKILL.md                           ← Este archivo
├── references/
│   ├── PORTFOLIO_THEORY.md            ← MPT, Markowitz, frontera eficiente (ES)
│   ├── BLACK_LITTERMAN.md             ← BL: prior, views, posterior, omega (ES)
│   ├── HIERARCHICAL.md                ← HRP, HERC, NCO, clustering (ES)
│   └── RISK_MEASURES.md               ← VaR, CVaR, MAD, MSV, DR, MDD (ES)
├── assets/
│   ├── sample_prices.csv              ← Precios multi-activo para ejemplos
│   ├── sample_returns.csv             ← Retornos multi-activo
│   ├── sample_mcaps.json              ← Market caps para Black-Litterman
│   └── defaults.json                  ← Parámetros default
├── scripts/
│   ├── __init__.py
│   ├── portfolio.py                   ← Core: Markowitz, Sharpe, Monte Carlo, frontera
│   ├── black_litterman.py             ← BL: prior, posterior, omega, views
│   ├── hierarchical.py                ← HRP/HERC/NCO: clustering, risk parity, constraints
│   ├── risk_measures.py               ← VaR, CVaR, MAD, MSV, MDD, DR
│   ├── covariance.py                  ← Covarianza: hist, ledoit-wolf, oas, ewma
│   └── cli.py                         ← CLI unificada (12 modos)
└── tests/
    ├── __init__.py
    └── test_portfolio.py              ← Tests + validación contra notebook
skills/portfolio/
├── SKILL.md                           ← 本文件
├── references/
│   ├── PORTFOLIO_THEORY.md            ← MPT、Markowitz、有效前沿(西班牙语)
│   ├── BLACK_LITTERMAN.md             ← BL:先验、观点、后验、omega(西班牙语)
│   ├── HIERARCHICAL.md                ← HRP、HERC、NCO、聚类(西班牙语)
│   └── RISK_MEASURES.md               ← VaR、CVaR、MAD、MSV、DR、MDD(西班牙语)
├── assets/
│   ├── sample_prices.csv              ← 示例多资产价格数据
│   ├── sample_returns.csv             ← 示例多资产收益数据
│   ├── sample_mcaps.json              ← Black-Litterman用市值数据
│   └── defaults.json                  ← 默认参数
├── scripts/
│   ├── __init__.py
│   ├── portfolio.py                   ← 核心模块:Markowitz、Sharpe、蒙特卡洛、有效前沿
│   ├── black_litterman.py             ← Black-Litterman完整实现:先验、后验、omega、观点
│   ├── hierarchical.py                ← HRP/HERC/NCO:聚类、风险平价、约束
│   ├── risk_measures.py               ← 风险指标:VaR、CVaR、MAD、MSV、MDD、DR
│   ├── covariance.py                  ← 协方差估计:历史法、Ledoit-Wolf、OAS、EWMA
│   └── cli.py                         ← 统一CLI(12种模式)
└── tests/
    ├── __init__.py
    └── test_portfolio.py              ← 测试 + 与参考笔记本结果校验

Qué hace cada script

各脚本功能说明

ScriptRolFunciones clave
portfolio.py
Core de optimización Markowitz
max_sharpe_optim
,
min_variance_optim
,
random_portfolios
,
efficient_frontier
,
asset_stats
black_litterman.py
Black-Litterman completo
market_implied_risk_aversion
,
market_implied_prior_returns
,
bl_posterior_returns
,
omega_idzorek
hierarchical.py
HRP / HERC / NCO
hrp_portfolio
,
herc_portfolio
,
nco_portfolio
,
nco_with_constraints
,
hrp_constraints
risk_measures.py
Medidas de riesgo
var_historic
,
cvar
,
max_drawdown
,
cdar
,
diversification_ratio
,
risk_contribution
covariance.py
Estimación de covarianza
cov_hist
,
cov_ledoit_wolf
,
cov_oas
,
cov_ewma

脚本角色核心函数
portfolio.py
Markowitz优化核心
max_sharpe_optim
,
min_variance_optim
,
random_portfolios
,
efficient_frontier
,
asset_stats
black_litterman.py
完整Black-Litterman实现
market_implied_risk_aversion
,
market_implied_prior_returns
,
bl_posterior_returns
,
omega_idzorek
hierarchical.py
HRP / HERC / NCO实现
hrp_portfolio
,
herc_portfolio
,
nco_portfolio
,
nco_with_constraints
,
hrp_constraints
risk_measures.py
风险指标计算
var_historic
,
cvar
,
max_drawdown
,
cdar
,
diversification_ratio
,
risk_contribution
covariance.py
协方差估计
cov_hist
,
cov_ledoit_wolf
,
cov_oas
,
cov_ewma

Quick Start

快速开始

Markowitz (scipy.optimize)

Markowitz(scipy.optimize)

bash
undefined
bash
undefined

Max Sharpe con 3 activos

3资产最大化Sharpe比率

py scripts/cli.py markowitz --assets assets/sample_returns.csv
py scripts/cli.py markowitz --assets assets/sample_returns.csv

Con tasa libre de riesgo personalizada

自定义无风险利率

py scripts/cli.py markowitz --assets assets/sample_returns.csv --rf 0.05
py scripts/cli.py markowitz --assets assets/sample_returns.csv --rf 0.05

Estadísticas individuales

单个资产统计

py scripts/cli.py stats --assets assets/sample_returns.csv
undefined
py scripts/cli.py stats --assets assets/sample_returns.csv
undefined

Monte Carlo

蒙特卡洛模拟

bash
undefined
bash
undefined

Simular 10.000 carteras aleatorias

模拟10000个随机投资组合

py scripts/cli.py montecarlo --assets assets/sample_returns.csv
py scripts/cli.py montecarlo --assets assets/sample_returns.csv

Guardar frontera a CSV

将有效前沿保存为CSV

py scripts/cli.py montecarlo --assets assets/sample_returns.csv --save frontier.csv
undefined
py scripts/cli.py montecarlo --assets assets/sample_returns.csv --save frontier.csv
undefined

Frontera Eficiente

有效前沿

bash
py scripts/cli.py frontier --assets assets/sample_returns.csv --n 50
bash
py scripts/cli.py frontier --assets assets/sample_returns.csv --n 50

Black-Litterman

Black-Litterman

bash
undefined
bash
undefined

Prior: retornos implícitos de mercado (CAPM inverso)

先验:市场隐含收益(逆CAPM)

py scripts/cli.py bl-prior --assets assets/sample_returns.csv --market-prices assets/sample_prices.csv --mcaps assets/sample_mcaps.json
py scripts/cli.py bl-prior --assets assets/sample_returns.csv --market-prices assets/sample_prices.csv --mcaps assets/sample_mcaps.json

BL completo con views + optimización

完整BL模型(含观点+优化)

py scripts/cli.py bl --assets assets/sample_returns.csv --market-prices assets/sample_prices.csv --mcaps assets/sample_mcaps.json --views '{"BMA": 0.25, "LOMA": 0.4, "MELI": -0.1}' --confidences "0.3,0.5,0.8" --optimize
undefined
py scripts/cli.py bl --assets assets/sample_returns.csv --market-prices assets/sample_prices.csv --mcaps assets/sample_mcaps.json --views '{"BMA": 0.25, "LOMA": 0.4, "MELI": -0.1}' --confidences "0.3,0.5,0.8" --optimize
undefined

HRP / HERC / NCO

HRP / HERC / NCO

bash
undefined
bash
undefined

Hierarchical Risk Parity

层次风险平价(HRP)

py scripts/cli.py hrp --assets assets/sample_returns.csv
py scripts/cli.py hrp --assets assets/sample_returns.csv

Nested Clustered Optimization

嵌套聚类优化(NCO)

py scripts/cli.py nco --assets assets/sample_returns.csv --clusters 3
py scripts/cli.py nco --assets assets/sample_returns.csv --clusters 3

NCO con restricciones

带约束的NCO

py scripts/cli.py nco-con --assets assets/sample_returns.csv --constraints assets/sample_constraints.csv --classes assets/sample_classes.csv
undefined
py scripts/cli.py nco-con --assets assets/sample_returns.csv --constraints assets/sample_constraints.csv --classes assets/sample_classes.csv
undefined

Riesgo

风险指标

bash
undefined
bash
undefined

Todas las medidas de riesgo

计算所有风险指标

py scripts/cli.py risk --prices assets/sample_prices.csv
py scripts/cli.py risk --prices assets/sample_prices.csv

Medida específica

计算特定风险指标

py scripts/cli.py risk --prices assets/sample_prices.csv --measure var

---
py scripts/cli.py risk --prices assets/sample_prices.csv --measure var

---

Usar como Librería

作为库使用

python
from scripts.portfolio import *
from scripts.black_litterman import *
from scripts.hierarchical import *

import numpy as np
python
from scripts.portfolio import *
from scripts.black_litterman import *
from scripts.hierarchical import *

import numpy as np

--- Markowitz ---

--- Markowitz ---

rets = pd.read_csv('assets/sample_returns.csv', index_col=0) result = max_sharpe_optim(rets, rf=0.045) print(result['weights'], result['sharpe']) # pesos óptimos, Sharpe
rets = pd.read_csv('assets/sample_returns.csv', index_col=0) result = max_sharpe_optim(rets, rf=0.045) print(result['weights'], result['sharpe']) # 最优权重、Sharpe比率

--- Monte Carlo ---

--- 蒙特卡洛模拟 ---

port_df = random_portfolios(rets, n_portfolios=10000, rf=0.045) best = port_df.loc[port_df['sharpe'].idxmax()] print(best['weights']) # mejor combinación Monte Carlo
port_df = random_portfolios(rets, n_portfolios=10000, rf=0.045) best = port_df.loc[port_df['sharpe'].idxmax()] print(best['weights']) # 蒙特卡洛最优组合

--- Black-Litterman ---

--- Black-Litterman ---

import json with open('assets/sample_mcaps.json') as f: mcaps = json.load(f) spy = pd.read_csv('assets/sample_prices.csv')['SPY'].pct_change().dropna() bl_result = bl_pipeline(rets, spy.values, mcaps, view_dict={'BMA': 0.25, 'LOMA': 0.4}, view_confidences=[0.3, 0.5], rf=0.045) print(bl_result['posterior']) # retornos a posteriori
import json with open('assets/sample_mcaps.json') as f: mcaps = json.load(f) spy = pd.read_csv('assets/sample_prices.csv')['SPY'].pct_change().dropna() bl_result = bl_pipeline(rets, spy.values, mcaps, view_dict={'BMA': 0.25, 'LOMA': 0.4}, view_confidences=[0.3, 0.5], rf=0.045) print(bl_result['posterior']) # 后验收益

--- HRP ---

--- HRP ---

hrp_result = hrp_portfolio(rets, linkage_method='ward') print(hrp_result['weights']) # pesos HRP

---
hrp_result = hrp_portfolio(rets, linkage_method='ward') print(hrp_result['weights']) # HRP权重

---

Dependencias

依赖项

LibreríaRequeridaUso
numpy
✅Cómputo vectorizado, álgebra lineal
pandas
✅CSV I/O, DataFrames
scipy
✅
optimize
(Markowitz),
cluster.hierarchy
(HRP/NCO),
stats
No requiere Riskfolio-Lib, PyPortfolioOpt, sklearn, cvxpy ni arch.
Para visualización (dendrogramas, frontera eficiente) se puede usar
matplotlib
opcionalmente. Ejemplos de plots están en el notebook de referencia.

库是否必需用途
numpy
✅向量化计算、线性代数
pandas
✅CSV读写、DataFrame处理
scipy
✅
optimize
(Markowitz)、
cluster.hierarchy
(HRP/NCO)、
stats
模块
无需依赖 Riskfolio-Lib、PyPortfolioOpt、sklearn、cvxpy或arch。
如需可视化(树状图、有效前沿),可可选使用
matplotlib
。参考笔记本中包含绘图示例。

Referencias Teóricas

理论参考文献

  • Markowitz (1952): "Portfolio Selection", Journal of Finance.
  • Black & Litterman (1992): "Global Portfolio Optimization", Financial Analysts Journal.
  • Idzorek (2005): "A Step-by-Step Guide to the Black-Litterman Model".
  • Lopez de Prado (2016): "Building Diversified Portfolios that Outperform Out of Sample" (HRP).
  • De Prado (2019): "Nested Clustered Optimization", SSRN 3469961.
  • Pfitzinger & Katzke (2019): "NCO with Constraints", SSRN 4409173.
  • Meucci (2006): "Beyond Black-Litterman: Views on Non-Normal Markets", SSRN 1213325.
  • Avramov (2004): "Bayesian Variable Selection in Portfolio Analysis", SSRN 3326617.
Para profundizar en ratios de performance (30+ métricas: Sharpe, Sortino, VaR, cVaR, Kelly, Rachev, Profit Factor, etc.) y backtesting de estrategias:
skills/backtesting
.

  • Markowitz (1952):"Portfolio Selection", Journal of Finance。
  • Black & Litterman (1992):"Global Portfolio Optimization", Financial Analysts Journal。
  • Idzorek (2005):"A Step-by-Step Guide to the Black-Litterman Model"。
  • Lopez de Prado (2016):"Building Diversified Portfolios that Outperform Out of Sample"(HRP)。
  • De Prado (2019):"Nested Clustered Optimization", SSRN 3469961。
  • Pfitzinger & Katzke (2019):"NCO with Constraints", SSRN 4409173。
  • Meucci (2006):"Beyond Black-Litterman: Views on Non-Normal Markets", SSRN 1213325。
  • Avramov (2004):"Bayesian Variable Selection in Portfolio Analysis", SSRN 3326617。
如需深入了解绩效指标(30+种指标:Sharpe、Sortino、VaR、cVaR、Kelly、Rachev、盈利因子等)和策略回测,请参考:
skills/backtesting
。

Notebook de referencia

参考笔记本

El contenido teórico y ejemplos numéricos de este skill están basados en:
  • temp/Clase_08_teoria_2025_portafolio.ipynb
    — Implementaciones en Python de Markowitz, Monte Carlo, NCO (Riskfolio-Lib), Black-Litterman (PyPortfolioOpt).
  • temp/Portafolios 2025 Ucema.pdf
    — Marco teórico: MPT, CAPM, Fama-French, clustering, NCO, Black-Litterman.
Las implementaciones flat numpy en
scripts/
replican los resultados de esos notebooks sin depender de las librerías mencionadas.
本Skill的理论内容和数值示例基于:
  • temp/Clase_08_teoria_2025_portafolio.ipynb
    — Markowitz、蒙特卡洛、NCO(基于Riskfolio-Lib)、Black-Litterman(基于PyPortfolioOpt)的Python实现。
  • temp/Portafolios 2025 Ucema.pdf
    — 理论框架:MPT、CAPM、Fama-French、聚类、NCO、Black-Litterman。
scripts/
中的纯numpy实现复制了上述笔记本的结果,且不依赖上述提及的第三方库。