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实现复制了上述笔记本的结果,且不依赖上述提及的第三方库。