第 16 課:ポートフォリオ構築とリスク・エクスポージャー管理
複数戦略の組み合わせがリスク低減を意味するわけではない。相関がリスクの本質である。
典型的なシナリオ(例示)
注:以下は一般的な現象を説明するための合成例です。数字は例示的なものであり、特定の個人やアカウントには対応していません。
2022年初頭、ある投資家が「分散ポートフォリオ」を見せてくれました:
| Strategy | Type | Historical Sharpe | Historical Max DD | Allocation |
|---|---|---|---|---|
| Strategy A | US Stock Momentum | 1.5 | 18% | 30% |
| Strategy B | Tech Stock Trend | 1.8 | 22% | 25% |
| Strategy C | Growth Factor | 1.3 | 15% | 25% |
| Strategy D | Long Rotation | 1.4 | 20% | 20% |
彼は私に尋ねました:「これら4つの戦略はすべて優れており、組み合わせればより安定するはずですよね?」
私は簡単な相関分析を行いました:
| Strategy A | Strategy B | Strategy C | Strategy D | |
|---|---|---|---|---|
| Strategy A | 1.00 | 0.85 | 0.78 | 0.82 |
| Strategy B | 0.85 | 1.00 | 0.88 | 0.80 |
| Strategy C | 0.78 | 0.88 | 1.00 | 0.75 |
| Strategy D | 0.82 | 0.80 | 0.75 | 1.00 |
発見: すべての戦略相関が0.75以上。
結果: 2022年、この「分散ポートフォリオ」は35%のドローダウンを記録 - 単一戦略よりも悪化。
なぜ?
これら4つの戦略は異なって見えますが、実際には同じことをしています:米国テクノロジー株のロング。テクノロジー株がグループとして下落したとき、すべてが同時に損失を出し、相関は1に近づき、分散効果は消失しました。
これがPortfolioレイヤー欠如のコスト - リスクを分散していると思っているが、実際には同じベットを積み重ねている。
16.1 Portfolioレイヤーの必要性
16.1.1 標準的なQuantフロー
完全なQuantシステムは以下のようになります:
Signals -> Portfolio Optimization -> Risk Control -> Execution
| | | |
+-- 各 +-- 統一 +-- 二次 +-- 実際の
Strategy Allocation Review Trading
Signal
多くのシステムは「Portfolio Optimization」レイヤーが欠けています:
Signals -> [欠落] -> Risk Control -> Execution
| | |
+-- シグナルから +-- パッシブ +-- 爆発する
直接取引 チェック 可能性
16.1.2 Portfolioレイヤーが解決する問題
| Problem | Portfolioレイヤーなし | Portfolioレイヤーあり |
|---|---|---|
| ウェイト配分 | 直感、均等配分 | リスク寄与、最適化目標に基づく |
| 相関 | 戦略の関係がわからない | 明示的にモデル化され制御される |
| Factor露出 | 隠れた露出が見えない | 監視され制約される |
| レバレッジ制御 | 隠れたレバレッジの可能性 | 真のレバレッジを明示的に計算 |
| リバランス | ランダム、パッシブ | ルールベース、プロアクティブ |
16.1.3 シグナル品質はPortfolio品質と等しくない
これは多くの人が見落とす重要な区別です:
単一Strategy視点:
強いシグナル -> 大きなポジション -> 高リターン
Portfolio視点:
強いシグナル + 高相関 -> 大きなポジション -> 集中リスク -> 大損の可能性
強いシグナル + 低相関 -> 大きなポジション -> 分散リスク -> より頑健
16.2 ポジションサイジング手法
16.2.1 4つの一般的な手法の比較
| Method | Formula | Pros | Cons | Use Case |
|---|---|---|---|---|
| Equal Weight | w_i = 1/N | シンプル | リスクの違いを無視 | 類似したStrategy risks |
| Equal Volatility | w_i は 1/sigma_i に比例 | ボラティリティを考慮 | 相関を無視 | 独立したStrategies |
| Equal Risk Contribution | RC_i = RC_j | リスク均衡 | 計算が複雑 | 長期配分 |
| Mean-Variance | max(return/risk) | 理論的に最適 | 推定誤差が大きい | 期待値が信頼できる場合 |
16.2.2 Equal Weight vs Equal Risk Contribution
紙上演習:
2つの戦略があります:
- Strategy A: 年率10%ボラティリティ
- Strategy B: 年率30%ボラティリティ
| Method | Strategy A Weight | Strategy B Weight | Portfolio Volatility |
|---|---|---|---|
| Equal Weight | 50% | 50% | ? |
| Equal Volatility | 75% | 25% | ? |
クリックして解答を表示
相関 = 0 (独立) と仮定
Equal Weight Allocation:
- A ボラティリティ寄与 = 50% x 10% = 5%
- B ボラティリティ寄与 = 50% x 30% = 15%
- Portfolio ボラティリティ = sqrt(5%^2 + 15%^2) = sqrt(0.25% + 2.25%) = 15.8%
- Bがリスクの90%を寄与
Equal Volatility Allocation:
- w_A = (1/10%) / (1/10% + 1/30%) = 0.1 / 0.133 = 75%
- w_B = (1/30%) / (1/10% + 1/30%) = 0.033 / 0.133 = 25%
- A ボラティリティ寄与 = 75% x 10% = 7.5%
- B ボラティリティ寄与 = 25% x 30% = 7.5%
- Portfolio ボラティリティ = sqrt(7.5%^2 + 7.5%^2) = 10.6%
- 両方が等しいリスクを寄与
結論: Equal weight配分は高ボラティリティ戦略がPortfolioリスクを支配することを許す。
16.2.3 PortfolioレベルでのKelly
単一Strategy Kelly:
f* = (p x b - q) / b
複数Strategy Kelly (相関を考慮):
f* = Sigma^(-1) x mu
Where:
- f* = 最適ウェイトベクトル
- Sigma = 共分散行列
- mu = 期待リターンベクトル
Key:
- 高相関戦略は重みを下げる
- 負相関戦略は重みを上げる
実用的な推奨:
- 1/2 Kelly または 1/4 Kelly を使用
- 共分散行列にはロバストな推定を使用(次セクション参照)
- 単一戦略のウェイト上限を設定
16.3 共分散推定とShrinkage
16.3.1 サンプル共分散の問題
Mean-variance最適化には共分散行列Sigmaが必要です。自然なアプローチは履歴データから推定することです:
サンプル共分散行列:
Sigma_hat = (1/T) x Sum((r_t - mu_hat)(r_t - mu_hat)')
Where:
r_t = 時刻tのリターンベクトル
mu_hat = サンプル平均ベクトル
T = サンプル数
問題: 資産数Nがサンプル数Tに近づくと、サンプル共分散行列は極めて不安定になります。
紙上演習:
| Scenario | Assets N | Samples T | Problem |
|---|---|---|---|
| 30銘柄、1年間日次 | 30 | 252 | OK、T/N ~ 8 |
| 100銘柄、1年間日次 | 100 | 252 | 危険、T/N ~ 2.5 |
| 500銘柄、1年間日次 | 500 | 252 | 災害、T/N < 1 |
なぜ小さいT/Nが問題を引き起こすか:
1. 推定ノイズが高い
- 共分散行列はN x (N+1)/2 パラメータを持つ
- 100銘柄 = 5,050 パラメータ
- 252サンプルで5,050パラメータを推定 -> 極めて信頼性が低い
2. 行列が特異になる可能性
- N > T の場合、Sigma_hat は特異 (行列式 = 0)
- 逆行列が取れない -> Portfolio最適化ができない
3. 極端なウェイト
- 推定誤差がオプティマイザーによって増幅される
- 不合理な大きなウェイトやショートポジションを生成
16.3.2 Ledoit-Wolf Shrinkage推定
コアアイデア: 不安定なサンプル共分散行列を安定したターゲット行列に向けて「収縮」させる。
Shrinkage推定:
Sigma_shrunk = delta x F + (1-delta) x Sigma_hat
Where:
F = ターゲット行列 (構造化され安定)
Sigma_hat = サンプル共分散行列 (不偏だがノイジー)
delta = Shrinkage強度 (0 <= delta <=1)
delta -> 1の場合: ターゲット行列に近づく (安定だが偏りあり)
delta -> 0の場合: サンプル行列に近づく (不偏だがノイジー)
一般的なターゲット行列:
| Target Type | Definition | Use Case |
|---|---|---|
| Single factor model | F = beta x beta' x sigma_m^2 + D | 株式Portfolio |
| Constant correlation | すべての資産が同じ相関を持つ | 同じ資産クラス |
| Diagonal matrix | 分散のみを保持、相関 = 0 | 弱い相関の資産 |
16.3.3 コード実装
import numpy as np
from sklearn.covariance import LedoitWolf, OAS
def get_shrunk_covariance(returns: np.ndarray, method: str = 'ledoit_wolf') -> dict:
"""
Shrinkage共分散行列を計算
Parameters:
-----------
returns : リターン行列 (T x N)、各行は期間、各列は資産
method : 'ledoit_wolf' または 'oas' (Oracle Approximating Shrinkage)
Returns:
--------
dict : Shrinkage共分散行列とShrinkage強度を含む
"""
if method == 'ledoit_wolf':
estimator = LedoitWolf()
elif method == 'oas':
estimator = OAS()
else:
raise ValueError(f"Unknown method: {method}")
estimator.fit(returns)
return {
'covariance': estimator.covariance_,
'shrinkage': estimator.shrinkage_,
'sample_cov': np.cov(returns, rowvar=False)
}
def compare_covariance_stability(returns: np.ndarray, n_splits: int = 5) -> dict:
"""
サンプル共分散とShrinkage共分散の安定性を比較
データを分割して、両方の手法のサブサンプル間の一貫性を比較
"""
T, N = returns.shape
split_size = T // n_splits
sample_covs = []
shrunk_covs = []
for i in range(n_splits):
start = i * split_size
end = start + split_size
subset = returns[start:end]
sample_covs.append(np.cov(subset, rowvar=False))
lw = LedoitWolf()
lw.fit(subset)
shrunk_covs.append(lw.covariance_)
# サブサンプル間の差を計算 (Frobenius norm)
sample_diffs = []
shrunk_diffs = []
for i in range(n_splits):
for j in range(i+1, n_splits):
sample_diffs.append(np.linalg.norm(sample_covs[i] - sample_covs[j], 'fro'))
shrunk_diffs.append(np.linalg.norm(shrunk_covs[i] - shrunk_covs[j], 'fro'))
return {
'sample_cov_variation': np.mean(sample_diffs),
'shrunk_cov_variation': np.mean(shrunk_diffs),
'stability_improvement': np.mean(sample_diffs) / np.mean(shrunk_diffs)
}
16.3.4 使用例
import numpy as np
from sklearn.covariance import LedoitWolf
# 50銘柄、1年間日次データをシミュレート
np.random.seed(42)
n_assets = 50
n_days = 252
# Factor構造を持つリターンを生成 (より現実的)
factor_returns = np.random.normal(0.0005, 0.015, n_days)
betas = np.random.uniform(0.5, 1.5, n_assets)
idio_returns = np.random.normal(0, 0.02, (n_days, n_assets))
returns = np.outer(factor_returns, betas) + idio_returns
# サンプル共分散
sample_cov = np.cov(returns, rowvar=False)
# Ledoit-Wolf Shrinkage共分散
lw = LedoitWolf()
lw.fit(returns)
shrunk_cov = lw.covariance_
print(f"資産数: {n_assets}")
print(f"サンプル数: {n_days}")
print(f"T/N比: {n_days/n_assets:.2f}")
print(f"Shrinkage強度 delta: {lw.shrinkage_:.3f}")
print(f"サンプル共分散の条件数: {np.linalg.cond(sample_cov):.0f}")
print(f"Shrunk共分散の条件数: {np.linalg.cond(shrunk_cov):.0f}")
# 出力例:
# 資産数: 50
# サンプル数: 252
# T/N比: 5.04
# Shrinkage強度 delta: 0.234
# サンプル共分散の条件数: 847
# Shrunk共分散の条件数: 142
解釈:
- Shrinkage強度 delta = 0.234 は、23.4%がターゲット行列から、76.6%がサンプル行列からであることを意味
- 条件数が847から142に低下、より安定した行列、より信頼性の高い逆行列
16.3.5 Shrinkage推定を使用すべき時
| Scenario | T/N比 | 推奨 |
|---|---|---|
| T/N > 10 | 快適 | サンプル共分散で許容可能、Shrinkage改善は限定的 |
| 5 < T/N <=10 | 境界線 | Shrinkage推奨、顕著な改善 |
| 2 < T/N <=5 | 危険 | Shrinkage必須 |
| T/N <=2 | 災害 | Shrinkage + 次元削減 (Factorモデル) |
実用的な推奨:
1. デフォルトでShrinkage推定を使用
- 高いT/Nでも、Shrinkageは害にならない
- sklearnが自動的に最適なShrinkage強度を計算
2. ローリングウィンドウではさらにShrinkageが必要
- ローリングウィンドウ = サンプル数が少ない
- Shrinkageは共分散の変化を滑らかにする
3. Factorモデルと組み合わせる
- 大規模Portfolio (>100資産) はFactorモデルで次元削減
- 残差共分散にShrinkageを適用
16.4 Factor Exposure Management
16.4.1 Factor Exposureとは何か?
Factorsは資産リターンを駆動する共通のソースです。一般的なFactors:
| Factor Type | Factor Name | Meaning |
|---|---|---|
| Market Factor | Beta | 全体市場への感応度 |
| Style Factors | Size | 大型株 vs 小型株 |
| Value | バリュー株 vs グロース株 | |
| Momentum | 過去の勝者 vs 敗者 | |
| Quality | 高品質 vs 低品質 | |
| Volatility | 低ボラティリティ vs 高ボラティリティ | |
| Industry Factors | Sector | 産業露出 |
16.4.2 隠れたFactor Exposure
問題: 自分がどのFactorに賭けているかわからない可能性があります。
ケース: 4つの「異なる」Strategies
Strategy A: 高ROE銘柄を買う
Strategy B: 低PE銘柄を買う
Strategy C: 財務健全な銘柄を買う
Strategy D: 高配当銘柄を買う
見た目: 4つの異なる銘柄選択方法
実際: すべて「Quality + Value」Factorをロング
結果: Value Factorが失敗したとき (例: 2019-2020)、4つすべての戦略が同時に損失
16.4.3 Factor Exposure計算
紙上演習:
あなたのPortfolioは以下を保有しています:
| Stock | Weight | Size Beta | Value Beta | Momentum Beta |
|---|---|---|---|---|
| AAPL | 30% | 0.8 (large) | -0.5 (growth) | 0.6 |
| MSFT | 25% | 0.7 (large) | -0.3 (growth) | 0.4 |
| JPM | 25% | 0.9 (large) | 0.8 (value) | -0.2 |
| XOM | 20% | 1.0 (large) | 1.2 (value) | -0.5 |
Portfolio Factor露出を計算:
クリックして解答を表示
Size Exposure: = 30% x 0.8 + 25% x 0.7 + 25% x 0.9 + 20% x 1.0 = 0.24 + 0.175 + 0.225 + 0.2 = 0.84 (大型株に傾斜)
Value Exposure: = 30% x (-0.5) + 25% x (-0.3) + 25% x 0.8 + 20% x 1.2 = -0.15 - 0.075 + 0.2 + 0.24 = 0.215 (わずかにValue傾斜)
Momentum Exposure: = 30% x 0.6 + 25% x 0.4 + 25% x (-0.2) + 20% x (-0.5) = 0.18 + 0.1 - 0.05 - 0.1 = 0.13 (わずかにMomentum傾斜)
解釈:
- Portfolioは大型株に傾斜 (パッシブに市場を追従する可能性)
- Portfolioはわずかに Value Factorに傾斜 (ただし強くない)
- Portfolioはわずかに Momentum露出がある
16.4.4 Factor Neutralization
Factor中立Portfolioが必要な場合:
目標: Factor露出 ~ 0
方法1: 制約付き最適化
max 期待リターン
s.t. Factor露出 = 0
ウェイトの合計 = 1
ウェイト >= 0
方法2: ヘッジング
Portfolioが0.5のValue露出を持つ場合
0.5単位のValue Factor ETFをショート
方法3: Pair Trading
各Value株を買うごとに
グロース株も買う (等しいValue Betaで)
16.5 隠れたレバレッジ
16.5.1 隠れたレバレッジとは何か?
明示的なレバレッジ: お金を借りて株を買う、$1M資本 + $1M借入 = 2倍レバレッジ
隠れたレバレッジ: 借入はないが、Portfolioリスク露出が資本を超える
ケース: Futures Portfolio
資本: $1M
保有:
- 株価指数先物ロング: $2Mのノーショナル (20%証拠金)
- 債券先物ロング: $3Mのノーショナル (15%証拠金)
- 商品先物ロング: $1.5Mのノーショナル (15%証拠金)
使用証拠金: $500K
遊休現金: $500K
見た目: 資本の50%のみ使用
実際: $6.5Mのノーショナル露出 = 6.5倍レバレッジ!
16.5.2 真のレバレッジの計算
真のレバレッジ = Sum(|ノーショナル露出|) / 資本
またはリスク観点から:
リスクレバレッジ = Portfolioボラティリティ / ベンチマークボラティリティ
例:
Portfolio年率ボラティリティ: 30%
S&P 500ボラティリティ: 15%
リスクレバレッジ = 30% / 15% = 2倍
16.5.3 レバレッジの罠
| Trap | Manifestation | Consequence |
|---|---|---|
| 低証拠金の錯覚 | 「20%証拠金のみ使用」 | 実際のレバレッジは5倍の可能性 |
| クロスアセット積み重ね | 複数資産クラスのFutures | 隠れたレバレッジの積み重ね |
| 相関過小評価 | 「異なる資産、分散リスク」 | 危機時に相関が急上昇 |
| ボラティリティ過小評価 | 通常のボラティリティでレバレッジ計算 | 危機時にボラティリティが2倍 |
16.5.4 レバレッジ制御フレームワーク
16.6 Multi-Strategy Portfolioの落とし穴
16.6.1 相関の2つの顔
通常期: Strategy相関 = 0.3 (分散が機能)
危機期: Strategy相関 -> 0.9 (分散が失敗)
なぜ危機時に相関が急上昇するのか?
1. 流動性逼迫
みんなが売る -> すべての資産が下落
2. リスク選好の反転
「リスクオフ」 -> 国債のみ買い、他はすべて売り
3. レバレッジ清算
証拠金請求 -> 強制売却 -> 価格下落 -> さらに証拠金請求
4. パニック伝染
1つの市場が暴落 -> 投資家がパニック -> すべてのリスク資産を売却
16.6.2 Drawdown同期問題
紙上演習:
3つの戦略があり、それぞれ15%の過去最大Drawdownを持っています。
| Assumption | Portfolio Max Drawdown | Calculation |
|---|---|---|
| 完全に独立 (相関 = 0) | ? | 同時にDrawdownしない |
| 部分的に相関 (相関 = 0.5) | ? | 部分的に同期する可能性 |
| 高相関 (相関 = 0.9) | ? | ほぼ完全に同期 |
クリックして解答を表示
簡略化された推定 (均等ウェイト):
-
完全に独立:
- 同時最大Drawdownの確率は非常に低い
- Portfolio最大Drawdown ~ 8-10% (単一戦略が~15%/3 = 5%を寄与、プラス多少の同期)
-
部分的に相関:
- いくらか同期したDrawdownがある
- Portfolio最大Drawdown ~ 12-13%
-
高相関:
- ほぼ完全に同期
- Portfolio最大Drawdown ~ 14-15% (単一戦略に近づく)
重要な洞察: 高相関では、「分散」は幻想である。
16.6.3 Strategy容量制約
| Strategy Type | 典型的な容量 | 理由 |
|---|---|---|
| HFTマーケットメイキング | $10-100M | 流動性制約 |
| Statistical arbitrage | $100M-1B | Alpha減衰 |
| Momentum戦略 | $1-10B | Market impact |
| パッシブインデックス | 無制限 | トラッキングエラー許容 |
問題: Strategy容量が不十分な場合、資本を追加し続けると:
- スリッページ増加
- Alpha減衰
- 限界収益の減少
16.7 Multi-Agent視点
16.7.1 Portfolio Agentの責任
16.7.2 Risk Agentとの分業
| Dimension | Portfolio Agent | Risk Agent |
|---|---|---|
| 焦点 | 最適な配分方法 | 制限超過の有無 |
| タイミング | トレード前 (計画段階) | トレード中・後 (実行と監視) |
| 権限 | ウェイトを推奨 | 拒否権 |
| ツール | Optimizer、Factorモデル | 閾値、サーキットブレーカー |
協力フロー:
Signal Agents --> Portfolio Agent --> Risk Agent --> Execution Agent
| |
v v
最適ウェイト レビュー/削減/拒否
Factor露出 レバレッジチェック
相関 Drawdownチェック
16.7.3 Portfolio最適化頻度
| Frequency | Use Case | Cost |
|---|---|---|
| Intraday | HFT戦略 | 取引コスト高 |
| Daily | アクティブ戦略 | 中程度のコスト |
| Weekly | 戦術的配分 | 低コスト |
| Monthly | 戦略的配分 | 最低コスト |
推奨:
- ウェイト変更が閾値を超えた場合のみリバランス (例: 5%)
- 過度な取引コストを避ける
合格基準
このレッスンを完了した後、以下の基準で学習を検証してください:
| Checkpoint | Standard | Self-Test Method |
|---|---|---|
| Portfolioレイヤーの必要性を理解 | シグナル品質 != Portfolio品質を説明できる | 反例を挙げる |
| ウェイト配分を計算 | Equal weightとEqual risk手法でウェイトを計算できる | 紙上演習を完了 |
| Factor露出を分析 | Portfolio Factor betaを計算できる | Factor演習を完了 |
| 隠れたレバレッジを特定 | Futures portfolioの真のレバレッジを計算できる | 例を挙げる |
| 相関の罠を理解 | なぜ危機時相関が急上昇するか説明できる | ケースを分析 |
レッスン成果物
このレッスンを完了すると、以下が得られます:
- ポジションサイジング手法の比較 - Equal weight、Equal volatility、Equal risk contribution
- Factor露出計算フレームワーク - Portfolioの隠れたリスク露出を特定
- レバレッジ制御ルール - ノーショナルおよびリスクレバレッジ制約
- Portfolio Agent設計テンプレート - Portfolio最適化の責任とワークフロー
レッスンまとめ
- 複数戦略は分散を意味しない、相関が分散効果を決定
- Equal weight配分は高ボラティリティ戦略がPortfolioリスクを支配することを許す
- Factor露出は隠れている可能性があり、明示的な監視が必要
- 隠れたレバレッジはノーショナル露出が資本を超えることから生じる
- 危機時相関が急上昇、分散効果が失敗
さらなる読書
- Lesson 08: Beta, Hedging, and Market Neutrality - BetaとFactorsの基礎
- Lesson 15: Risk Control and Money Management - Risk controlとPortfolioレイヤーの協力
- Background: Statistical Traps of Sharpe Ratio - Portfolio評価の統計的問題
- Background: Famous Quant Disasters - レバレッジが制御不能になったケース
次のレッスンプレビュー
Lesson 17: Online Learning and Strategy Evolution
Portfolioが構築された後、市場は変化し、戦略は進化しなければなりません。大きな損失の後に問題を発見するのを待つのではなく、システムが継続的に学習し自己更新できるようにする方法は?次のレッスンではOnline learning手法を探ります。