asset-allocation について
ポートフォリオ構築やウェルスマネジメントのワークフロー向けの資産配分スキルです。戦略・戦術的な配分と各種最適化モデルを解説し、実行可能な計算例も含みます。
主な機能
- 01戦略的・戦術的な資産配分
- 02平均分散最適化とBlack-Litterman
- 03リスクパリティとグライドパス
- 04コア・サテライトと資産負債マッチング
- 05配分計算例の実行と検証
活用シーン
- 01長期ポートフォリオの目標比率設定
- 02市場見通しに応じた短期配分の調整
- 03リスクパリティと最適化ポートフォリオの比較
- 04年金資産と負債キャッシュフローの対応
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ joellewis/ finance_skills --skill asset-allocationインストール後、Claude Code で/asset-allocationを入力して読み込まれたか確認します。
同梱ファイルscripts/asset_allocation.py
詳細
資産配分
基本概念
戦略的資産配分(SAA)
投資家のリスク許容度、リターン目標、投資期間、制約に基づく長期的な基本ポートフォリオです。SAA は基準となる目標ウェイト(例:株式 60%/債券 30%/オルタナティブ 10%)を定め、長期的なポートフォリオリターンを左右する主要な要因となります。SAA は市場の動きに反応してではなく、投資家の状況が変化したときに見直す必要があります。
戦術的資産配分(TAA)
市場見通し、バリュエーション、モメンタムシグナルに基づき、SAA から短期から中期にわたって配分を変更します。場当たり的なマーケットタイミングに陥らないよう、規律あるプロセスが必要です。主な検討事項:
- 許容する乖離幅を定めます(例:SAA から +/- 10%)
- 明確なシグナルの枠組みを用意します(バリュエーション、モメンタム、マクロ)
- 回帰ルールを設定します:SAA のウェイトに戻すタイミング
平均分散最適化(MVO)
リスク調整後リターンを最大化する最適なポートフォリオウェイトを求める、Markowitz の枠組みです:
max w'*mu - (lambda/2) * w'Sigmaw
subject to: sum(w_i) = 1, w_i >= 0 (if long-only), and any additional constraints.
ここで:
- w = ウェイトベクトル
- mu = 期待リターンベクトル
- Sigma = 共分散行列
- lambda = リスク回避度パラメーター
MVO には、期待リターン、共分散行列、リスク回避度の 3 つの入力が必要です。解は期待リターンの入力値に大きく左右されます。
Black-Litterman モデル
市場均衡リターンと投資家の見通しを組み合わせ、より安定した直感的なポートフォリオウェイトを算出します。2 段階のプロセスです:
ステップ 1 — 含意された均衡リターン: Pi = lambda * Sigma * w_mkt
ここで、w_mkt は時価総額加重ベクトル、lambda はリスク回避度パラメーター、Sigma は共分散行列です。これは現在の価格を前提として、市場が暗黙に予想しているリターンです。
ステップ 2 — 見通しとのブレンド: E(R) = [(tau*Sigma)^(-1) + P'*Omega^(-1)P]^(-1) * [(tauSigma)^(-1)*Pi + P'*Omega^(-1)*Q]
ここで:
- tau = スカラー(均衡に対する不確実性。通常 0.025~0.05)
- P = ピック行列(各見通しの対象資産を特定します)
- Q = 見通しベクトル(見通しに基づく期待リターン)
- Omega = 見通しの不確実性を表す対角行列
結果として得られる事後期待リターンベクトルは、投資家の確信度に応じて、均衡から投資家の見通しの方向へ傾きます。
リスクパリティ
資本配分を均等にするのではなく、各資産(またはファクター)のリスク寄与を均等にします:
RC_i = w_i * (Sigma*w)_i / sigma_p
すべての i、j について RC_i = RC_j とします。
相関がない単純な 2 資産の場合: w_i は 1/sigma_i に比例します
リスクパリティポートフォリオでは、ボラティリティの低い資産(通常は債券)により多くの資本を配分します。また、競争力のあるリターン目標を達成するため、レバレッジが必要になることもよくあります。
グライドパス
投資家の年齢が上がる、または目標日が近づくにつれて、成長資産からディフェンシブ資産へ体系的に移行する、年齢または時間に基づく配分です:
一般的な経験則:株式比率 % = 110 - 年齢
ターゲットデートファンドのグライドパスでは通常、次のように設定します:
- 若い投資家の場合、株式比率を 90%から開始します
- 年ごとに約 1~2%引き下げます
- 退職時には株式比率を 30~40%にします
- 退職後も「スルー」型の配分を継続します
コア・サテライト
次を組み合わせるハイブリッド型のアプローチです:
- コア(60~80%): 低コストで幅広く分散されたインデックスファンドまたは ETF
- サテライト(20~40%): アクティブ戦略、ファクターへの傾斜、オルタナティブ、または集中投資
この構造では、コアで市場リターンを効率的に取り込みながら、サテライトでアルファの獲得や特定のエクスポージャーを狙えます。
資産・負債のマッチング
確定給付年金、保険、支出ルールのある基金など、負債が定められている投資家の場合:
- 資産のデュレーションとキャッシュフローを、負債のデュレーションおよび発生時期に合わせます
- サープラス最適化:絶対リターンではなく、負債との関係でポートフォリオを最適化します
- 負債主導型投資(LDI):デュレーションを一致させた債券で負債リスクをヘッジし、サープラスをリターン追求型資産に投資します
主な数式
| 数式 | 式 | 用途 |
|---|---|---|
| MVO 目的関数 | max w'*mu - (lambda/2)*w'Sigmaw | 最適なポートフォリオのウェイト |
| 均衡リターン | Pi = lambda * Sigma * w_mkt | Black-Litterman の出発点 |
| BL 事後リターン | E(R) = [(tau*Sigma)^(-1) + P'*Omega^(-1)P]^(-1) * [(tauSigma)^(-1)*Pi + P'*Omega^(-1)*Q] | ブレンド後の期待リターン |
| リスク寄与度 | RC_i = w_i * (Sigma*w)_i / sigma_p | リスクパリティの目標 |
| リスクパリティ条件 | RC_i = RC_j for all i, j | リスク寄与度を均等化 |
| グライドパスのルール | 株式比率 = 110 - 年齢 | 年齢に応じた配分 |
計算例
例 1:3 資産の平均分散最適化
与件:
- 資産:米国株式(mu=8%、sigma=16%)、国際株式(mu=7%、sigma=18%)、米国債券(mu=3%、sigma=4%)
- 相関:米国株式/国際株式 = 0.75、米国株式/債券 = 0.10、国際株式/債券 = 0.05
- リスク回避度:lambda = 4
- 制約:ロングのみ、投資比率合計 100%
計算対象: 最適ウェイト
解答:
共分散行列:
- Cov(US,US) = 0.16^2 = 0.0256
- Cov(Intl,Intl) = 0.18^2 = 0.0324
- Cov(Bond,Bond) = 0.04^2 = 0.0016
- Cov(US,Intl) = 0.75 * 0.16 * 0.18 = 0.0216
- Cov(US,Bond) = 0.10 * 0.16 * 0.04 = 0.00064
- Cov(Intl,Bond) = 0.05 * 0.18 * 0.04 = 0.00036
lambda=4 の MVO(数値的に、または二次計画法で解く):
最適ウェイト(ロングのみ):
- 米国株式:51.9%
- 国際株式:0%
- 米国債券:48.1%
ポートフォリオ:期待リターン = 5.60%、ボラティリティ = 8.71%
注:国際株式の比率はゼロになります。米国株式との相関が高い(0.75)一方で期待リターンが低いため、最適化では保有する理由がないと判断されます。これは典型的な MVO の挙動です。入力値のわずかな違いが、極端な解につながります。最大ウェイトや最低配分の制約を加えると、分散投資を強制できます。債券の配分が高いのは、分散に対するペナルティが大きいためです(lambda=4)。lambda を下げると、株式の比率が高まります。
例 2:相対ビューを用いた Black-Litterman
与件: 例 1 と同じ 3 資産および共分散行列。
- 時価総額ウェイト:米国株式 55%、国際株式 30%、米国債券 15%
- リスク回避度 lambda = 2.5、tau = 0.05
- 投資家の見解:国際株式は米国債券を 3% 上回る(見解の不確実性 Omega = [0.001]。値が小さいほど確信度が高い)
計算対象: 均衡期待リターンと事後期待リターン
解答:
ステップ 1 — 均衡リターン、Pi = lambda × Sigma × w_mkt:
- 米国株式:5.16%
- 国際株式:5.41%
- 米国債券:0.18%
ステップ 2 — 見解の指定:P = [0, 1, -1]、Q = [3%]。
均衡リターンでは、国際株式はすでに債券を 5.23% 上回ると示されています。そのため、3% という見解は均衡に比べて弱気です。Black-Litterman の事後分布の公式を適用すると:
- 米国株式:4.28%(国際株式との 0.75 の相関を通じて低下)
- 国際株式:4.07%(5.41% から低下)
- 米国債券:0.23%(わずかに上昇)
事後リターンは、確信度に応じてリターンを見解の方向へ調整します。これらのリターンを MVO に入力すると、時価総額ウェイトと比べて、株式から債券へウェイトが移ります。その変化は緩やかで、生の MVO が生み出す極端な解を避けます(例 1 と比較してください)。なお、見解は単独で評価するのではなく、常に均衡がすでに示唆している内容と照らし合わせて評価します。
よくある落とし穴
- MVOは期待リターンの入力値に非常に敏感で、「誤差を増幅するもの」と呼ばれることがあります。リターンがわずかに変わるだけで、ウェイトが大きく変化します
- 制約のないMVOでは、極端に偏った集中ポジションが生じることがよくあります。必ず制約(ロングオンリー、最大ウェイト、売買回転率の上限など)を追加してください
- Black-Littermanでは、アナリストがビューへの確信度(Omega)を指定する必要がありますが、その確信度自体も不確実です
- リスクパリティポートフォリオで株式と同程度のリターンを実現するにはレバレッジが必要となり、借入コストとレバレッジリスクが生じます
- 運用コストを無視すると、理論上の最適リターンが大幅に損なわれる可能性があります。取引コスト、ビッド・アスク・スプレッド、税金を考慮してください
- 流動性制約を無視すると、問題が生じる可能性があります。一部の資産クラス(プライベートエクイティ、不動産)は迅速にリバランスできません
- グライドパスは一般的な投資家を想定しています。個々の状況に合わせて調整が必要な場合があります
- 将来の関係性を反映していない可能性がある、過去の共分散行列に過度に依存すること
関連項目
- historical-risk(wealth-management プラグイン):平均分散最適化に用いるボラティリティと相関の入力値
- forward-risk(wealth-management プラグイン):ポートフォリオ最適化に用いる期待リターン予測とシナリオ分析
- diversification(wealth-management プラグイン):分散投資の原則は、あらゆる資産配分フレームワークの基盤です
- bet-sizing(wealth-management プラグイン):配分された資産クラス内でのポジションサイジング
- rebalancing(wealth-management プラグイン):時間の経過に伴う配分目標の維持
- quantitative-valuation(wealth-management プラグイン):評価シグナルはTAAの判断に役立ちます
- retirement-decumulation(wealth-management プラグイン):取り崩し期のグライドパスと、資産配分の選択によって管理すべきリターン順序リスク
- factor-investing(wealth-management プラグイン):政策ポートフォリオから意図的に逸脱しつつ、許容可能な範囲に収めるファクター傾斜の設定
スクリプトの実行
uv run scripts/asset_allocation.py # run the demo (uses PEP 723 inline deps)
uv run scripts/asset_allocation.py --verify # check demo outputs against the worked examples (exit 1 on mismatch)
python3 scripts/asset_allocation.py # alternative (requires: pip install numpy scipy)
デモでは、上記の計算を出力します。値はこのスキルの計算例と一致します。クラスと関数の一覧を表示するには、--help を実行してください。プログラムから使用する場合は、スクリプトを実行するのではなく、モジュールをインポートしてください。デモは python asset_allocation.py の場合にのみ実行されます。