$npx -y skills add gauss314/skills --skill portfolioConstrucción y optimización cuantitativa de portafolios: Markowitz (scipy.optimize + Monte Carlo), Black-Litterman (prior CAPM, views absolutas/relativas, posterior bayesiano), HRP/HERC/NCO (clustering jerárquico, risk parity, NCO con restricciones). Todo flat numpy + scipy, sin
| 1 | # Portfolio — Optimización Cuantitativa de Portafolios |
| 2 | |
| 3 | Este skill implementa **3 enfoques de optimización de portafolios** desde el material del curso |
| 4 | (notebook `Clase_08_teoria_2025_portafolio.ipynb` y PDF `Portafolios 2025 Ucema.pdf`): |
| 5 | |
| 6 | 1. **Markowitz / Media-Varianza** — Optimización convexa vía `scipy.optimize` |
| 7 | + simulación Monte Carlo + frontera eficiente + CML. |
| 8 | 2. **Black-Litterman** — Combinación bayesiana de retornos de equilibrio de mercado |
| 9 | (CAPM inverso) con views del inversor, incluyendo matriz de incertidumbre Ω |
| 10 | (método Idzorek). |
| 11 | 3. **HRP / HERC / NCO** — Construcción jerárquica de portafolios mediante clustering |
| 12 | (single/complete/average/ward), risk parity y NCO con restricciones. |
| 13 | |
| 14 | Todos los scripts usan solo `numpy`, `pandas` y `scipy`. Sin dependencias pesadas. |
| 15 | Este skill es **autónomo**: funciona sin `skills/backtesting`. |
| 16 | |
| 17 | Para ratios de performance post-optimización (Sharpe, Sortino, VaR, drawdowns, etc.) |
| 18 | consultar el skill hermana: |
| 19 | [`skills/backtesting`](https://github.com/gauss314/skills/tree/main/skills/backtesting). |
| 20 | |
| 21 | Part of the [Gauss314 Skills Repository](https://github.com/gauss314/skills). |
| 22 | |
| 23 | --- |
| 24 | |
| 25 | ## File Map |
| 26 | |
| 27 | ``` |
| 28 | skills/portfolio/ |
| 29 | ├── SKILL.md ← Este archivo |
| 30 | ├── references/ |
| 31 | │ ├── PORTFOLIO_THEORY.md ← MPT, Markowitz, frontera eficiente (ES) |
| 32 | │ ├── BLACK_LITTERMAN.md ← BL: prior, views, posterior, omega (ES) |
| 33 | │ ├── HIERARCHICAL.md ← HRP, HERC, NCO, clustering (ES) |
| 34 | │ └── RISK_MEASURES.md ← VaR, CVaR, MAD, MSV, DR, MDD (ES) |
| 35 | ├── assets/ |
| 36 | │ ├── sample_prices.csv ← Precios multi-activo para ejemplos |
| 37 | │ ├── sample_returns.csv ← Retornos multi-activo |
| 38 | │ ├── sample_mcaps.json ← Market caps para Black-Litterman |
| 39 | │ └── defaults.json ← Parámetros default |
| 40 | ├── scripts/ |
| 41 | │ ├── __init__.py |
| 42 | │ ├── portfolio.py ← Core: Markowitz, Sharpe, Monte Carlo, frontera |
| 43 | │ ├── black_litterman.py ← BL: prior, posterior, omega, views |
| 44 | │ ├── hierarchical.py ← HRP/HERC/NCO: clustering, risk parity, constraints |
| 45 | │ ├── risk_measures.py ← VaR, CVaR, MAD, MSV, MDD, DR |
| 46 | │ ├── covariance.py ← Covarianza: hist, ledoit-wolf, oas, ewma |
| 47 | │ └── cli.py ← CLI unificada (12 modos) |
| 48 | └── tests/ |
| 49 | ├── __init__.py |
| 50 | └── test_portfolio.py ← Tests + validación contra notebook |
| 51 | ``` |
| 52 | |
| 53 | ### Qué hace cada script |
| 54 | |
| 55 | | Script | Rol | Funciones clave | |
| 56 | |--------|-----|----------------| |
| 57 | | `portfolio.py` | Core de optimización Markowitz | `max_sharpe_optim`, `min_variance_optim`, `random_portfolios`, `efficient_frontier`, `cml_portfolio`, `asset_stats` | |
| 58 | | `black_litterman.py` | Black-Litterman completo | `market_implied_risk_aversion`, `market_implied_prior_returns`, `bl_posterior_returns`, `omega_idzorek` | |
| 59 | | `hierarchical.py` | HRP / HERC / NCO | `hrp_portfolio`, `herc_portfolio`, `nco_portfolio`, `nco_with_constraints`, `hrp_constraints` | |
| 60 | | `risk_measures.py` | Medidas de riesgo | `var_historic`, `cvar`, `max_drawdown`, `cdar`, `diversification_ratio`, `risk_contribution` | |
| 61 | | `covariance.py` | Estimación de covarianza | `cov_hist`, `cov_ledoit_wolf`, `cov_oas`, `cov_ewma` | |
| 62 | |
| 63 | --- |
| 64 | |
| 65 | ## Quick Start |
| 66 | |
| 67 | ### Markowitz (scipy.optimize) |
| 68 | |
| 69 | ```bash |
| 70 | # Max Sharpe con 3 activos |
| 71 | py scripts/cli.py markowitz --assets assets/sample_returns.csv |
| 72 | |
| 73 | # Con tasa libre de riesgo personalizada |
| 74 | py scripts/cli.py markowitz --assets assets/sample_returns.csv --rf 0.05 |
| 75 | |
| 76 | # Estadísticas individuales |
| 77 | py scripts/cli.py stats --assets assets/sample_returns.csv |
| 78 | ``` |
| 79 | |
| 80 | ### Monte Carlo |
| 81 | |
| 82 | ```bash |
| 83 | # Simular 10.000 carteras aleatorias |
| 84 | py scripts/cli.py montecarlo --assets assets/sample_returns.csv |
| 85 | |
| 86 | # Guardar frontera a CSV |
| 87 | py scripts/cli.py montecarlo --assets assets/sample_returns.csv --save frontier.csv |
| 88 | ``` |
| 89 | |
| 90 | ### Frontera Eficiente |
| 91 | |
| 92 | ```bash |
| 93 | py scripts/cli.py frontier --assets assets/sample_returns.csv --n 50 |
| 94 | ``` |
| 95 | |
| 96 | ### CML — Leverage y Deleverage |
| 97 | |
| 98 | El portafolio tangente (máximo Sharpe) se combina con el activo libre de riesgo |
| 99 | para obtener cualquier punto sobre la Capital Market Line (CML), manteniendo |
| 100 | el mismo Sharpe ratio. |
| 101 | |
| 102 | ```bash |
| 103 | # Portafolio tangente puro (w=1) |
| 104 | py scripts/cli.py cml --assets assets/sample_returns.csv --weight 1.0 |
| 105 | |
| 106 | # Deleverage: 60% en tangencia, 40% en Rf (menos riesgo, mismo Sharpe) |
| 107 | py scripts/cli.py cml --assets assets/sample_returns.csv --weight 0.6 |
| 108 | |
| 109 | # Leverage: pide prestado 50% a Rf, invierte 150% en tangencia (más riesgo, mismo Sharpe) |
| 110 | py scripts/cli.py cml --assets assets/sample_returns.csv --weight 1.5 |
| 111 | ``` |
| 112 | |
| 113 | ### Black-Litterman |
| 114 | |
| 115 | ```b |