portfolio について
portfolioは、資産リターンデータを扱うユーザー向けのPythonによる定量ポートフォリオ構築スキルです。Markowitz、Black-Litterman、階層型手法を実装し、コマンドラインとライブラリの両方から利用できます。
主な機能
- 01Markowitz手法によるポートフォリオ最適化
- 02市場の事前分布と投資家の見解の統合
- 03HRP、HERC、NCOによるポートフォリオ構築
- 04共分散行列の推定
- 05ポートフォリオのリスク指標の計算
活用シーン
- 01最大シャープレシオまたは最小分散配分の算出
- 02市場が示すリターンへの投資見解の反映
- 03階層クラスタリングによるポートフォリオ構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ gauss314/ skills --skill portfolioインストール後、Claude Code で/portfolioを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/defaults.jsonsample_classes.csvsample_constraints.csvsample_mcaps.jsonsample_prices_16.csvsample_prices.csvsample_returns_16.csvsample_returns.csvreferences/BLACK_LITTERMAN.mdHIERARCHICAL.mdPORTFOLIO_THEORY.mdRISK_MEASURES.mdscripts/__init__.pyblack_litterman.pycli.pycovariance.pyhierarchical.pyportfolio.pyrisk_measures.pytests/__init__.pytest_portfolio.py詳細
Portfolio — ポートフォリオの定量的最適化
このスキルでは、コース教材(ノートブック Clase_08_teoria_2025_portafolio.ipynb と PDF Portafolios 2025 Ucema.pdf)に基づく3つのポートフォリオ最適化アプローチを実装しています。
- Markowitz/平均・分散 —
scipy.optimizeによる凸最適化 + モンテカルロシミュレーション + 効率的フロンティア + CML。 - Black-Litterman — 市場均衡リターン(逆算 CAPM)と投資家のビューをベイズ的に組み合わせます。Ω 不確実性行列(Idzorek 法)にも対応しています。
- HRP/HERC/NCO — クラスタリング(single/complete/average/ward)、リスクパリティ、制約付き NCO による階層的なポートフォリオ構築。
すべてのスクリプトで使用するのは numpy、pandas、scipy のみです。重い依存関係はありません。
このスキルは単独で動作し、skills/backtesting は必要ありません。
最適化後のパフォーマンス比率(Sharpe、Sortino、VaR、ドローダウンなど)については、姉妹スキルを参照してください。
skills/backtesting。
Gauss314 Skills Repository の一部です。
ファイル一覧
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
各スクリプトの役割
| スクリプト | 役割 | 主な関数 |
|---|---|---|
portfolio.py | Markowitz 最適化のコア | max_sharpe_optim、min_variance_optim、random_portfolios、efficient_frontier、cml_portfolio、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 |
クイックスタート
Markowitz(scipy.optimize)
# Max Sharpe con 3 activos
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
# Estadísticas individuales
py scripts/cli.py stats --assets assets/sample_returns.csv
モンテカルロ
# Simular 10.000 carteras aleatorias
py scripts/cli.py montecarlo --assets assets/sample_returns.csv
# Guardar frontera a CSV
py scripts/cli.py montecarlo --assets assets/sample_returns.csv --save frontier.csv
効率的フロンティア
py scripts/cli.py frontier --assets assets/sample_returns.csv --n 50
CML — レバレッジとデレバレッジ
接点ポートフォリオ(最大 Sharpe)と無リスク資産を組み合わせることで、同じ Sharpe 比率を維持しながら、資本市場線(CML)上の任意の点を取得できます。
# Portafolio tangente puro (w=1)
py scripts/cli.py cml --assets assets/sample_returns.csv --weight 1.0
# Deleverage: 60% en tangencia, 40% en Rf (menos riesgo, mismo Sharpe)
py scripts/cli.py cml --assets assets/sample_returns.csv --weight 0.6
# Leverage: pide prestado 50% a Rf, invierte 150% en tangencia (más riesgo, mismo Sharpe)
py scripts/cli.py cml --assets assets/sample_returns.csv --weight 1.5
Black-Litterman
# Prior: retornos implícitos de mercado (CAPM inverso)
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
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
HRP/HERC/NCO
# Hierarchical Risk Parity
py scripts/cli.py hrp --assets assets/sample_returns.csv
# Nested Clustered Optimization
py scripts/cli.py nco --assets assets/sample_returns.csv --clusters 3
# NCO con restricciones
py scripts/cli.py nco-con --assets assets/sample_returns.csv --constraints assets/sample_constraints.csv --classes assets/sample_classes.csv
リスク
# Todas las medidas de riesgo
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
ライブラリとして使用
from scripts.portfolio import *
from scripts.black_litterman import *
from scripts.hierarchical import *
import numpy as np
# --- 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
# --- CML: leverage/deleverage ---
# 60% en tangencia, 40% en Rf (deleverage)
cml = cml_portfolio(rets, rf=0.045, weight_tangency=0.6)
print(cml['ret'], cml['vol'], cml['sharpe']) # mismo Sharpe que el tangente
# Leverage: 150% en tangencia (pide prestado 50% a Rf)
cml2 = cml_portfolio(rets, rf=0.045, weight_tangency=1.5)
print(cml2['ret'], cml2['vol'], cml2['sharpe']) # mismo 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
# --- 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
# --- HRP ---
hrp_result = hrp_portfolio(rets, linkage_method='ward')
print(hrp_result['weights']) # pesos HRP
依存関係
| ライブラリ | 必須 | 用途 |
|---|---|---|
numpy | ✅ | ベクトル化計算、線形代数 |
pandas | ✅ | CSV 入出力、DataFrame |
scipy | ✅ | optimize(Markowitz)、cluster.hierarchy(HRP/NCO)、stats |
不要なもの:Riskfolio-Lib、PyPortfolioOpt、sklearn、cvxpy、arch。
可視化(デンドログラム、効率的フロンティア)には、必要に応じて matplotlib を使用できます。プロットの例は参照ノートブックにあります。
理論的参考文献
- 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、Profit Factor など)と戦略のバックテストについて詳しくは、次を参照してください:
skills/backtesting。
参考ノートブック
このスキルの理論的内容と数値例は、以下に基づいています。
temp/Clase_08_teoria_2025_portafolio.ipynb— Markowitz、Monte Carlo、NCO(Riskfolio-Lib)、Black-Litterman(PyPortfolioOpt)の Python 実装。temp/Portafolios 2025 Ucema.pdf— 理論的枠組み:MPT、CAPM、Fama-French、クラスタリング、NCO、Black-Litterman。
/scripts/ の flat numpy 実装は、前述のライブラリに依存せず、これらのノートブックの結果を再現します。