performance-attribution について
ポートフォリオのパフォーマンス帰属を分析するためのリファレンススキルと Python モジュールです。株式、ファクター、債券、通貨、複数期間の手法を例や検証機能とともに扱います。
主な機能
- 01Brinson-Fachler 株式帰属
- 02Carino 複数期間リンク
- 03ファクターリターン分解
- 04債券・通貨の帰属分析
- 05検証付き Python 実行例
活用シーン
- 01アクティブリターンの配分・銘柄選択効果の分解
- 02ポートフォリオリターンとファクターエクスポージャーの比較
- 03債券・通貨リターンの要因分析
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ joellewis/ finance_skills --skill performance-attributionインストール後、Claude Code で/performance-attributionを入力して読み込まれたか確認します。
同梱ファイルscripts/performance_attribution.py
詳細
パフォーマンス・アトリビューション
基本概念
ブリンソン=ファクラー・アトリビューション(単一期間)
従来の株式アトリビューションモデルでは、アクティブリターン(ポートフォリオリターンからベンチマークリターンを差し引いたもの)を次の3つの効果に分解します。
- アロケーション効果: ベンチマークと比べてセクターをオーバーウェイトまたはアンダーウェイトにすることで生じる付加価値です
- A_i = (w_p,i - w_b,i) × (R_b,i - R_b)
- ベンチマーク全体を上回るセクターをオーバーウェイトにするとプラスになります
- セレクション効果: 各セクター内でより優れた証券を選択することで生じる付加価値です
- S_i = w_b,i × (R_p,i - R_b,i)
- ウェイトにかかわらず、セクターのベンチマークを上回るとプラスになります
- インタラクション効果: オーバーウェイトとアウトパフォーム(またはその逆)の両方による複合効果です
- I_i = (w_p,i - w_b,i) × (R_p,i - R_b,i)
- セクターをオーバーウェイトにし、かつそのセクター内でより優れた証券を選択することによる複合的な効果を捉えます
- アクティブリターン合計: R_p - R_b = Σ A_i + Σ S_i + Σ I_i
ここで、w_p,i = セクター i のポートフォリオ・ウェイト、w_b,i = セクター i のベンチマーク・ウェイト、R_p,i = セクター i のポートフォリオリターン、R_b,i = セクター i のベンチマークリターン、R_b = ベンチマーク全体のリターンです。
マルチ期間アトリビューション
単一期間のアトリビューションでは、期間をまたいだ複利運用を反映できません。幾何リンク手法が必要です。
- カリーノ法: 算術効果を複利計算し、幾何合計が正しくなるように平滑化係数を適用します
- メンチェロ法: 寄与をより滑らかに分解するため、対数を用います
- GRAP(幾何リターン・アトリビューション・プログラム): 算術効果を幾何効果に変換します
- 基本原則:リンク後のアトリビューション効果の合計は、全期間の幾何アクティブリターンと等しくなります
ファクターベースのアトリビューション
リターンを、システマティック・リスクファクターへのエクスポージャーに分解します。
- モデル: R_p = Σ β_k × F_k + α
- β_k = ファクター k に対するポートフォリオのエクスポージャー(ローディング)
- F_k = 期間中のファクター k のリターン
- α = ファクターでは説明できない残余リターン(真のアルファ)
- 一般的なファクター: 市場(MKT)、サイズ(SMB)、バリュー(HML)、モメンタム(UMD)、クオリティ(QMJ)、低ボラティリティ(BAB)
- ファクター寄与: 各ファクターの β_k × F_k
- アクティブ・ファクター寄与: (β_p,k - β_b,k) × F_k
- 選択したモデル(ファーマ=フレンチ3ファクター、カーハート4ファクター、ファーマ=フレンチ5ファクター、Barra、Axioma)によって結果が変わります
債券アトリビューション
債券ポートフォリオのリターンを、構成要素となる源泉に分解します。
- 利回りリターン(インカム): 期間中に発生したクーポン収入(利回り × 期間)
- ロールリターン: 債券が満期に向かってイールドカーブを「ロールダウン」することで生じる価格上昇
- カーブ変化リターン: イールドカーブの平行シフトおよび非平行シフトの影響
- デュレーション効果:-D × Δy(平行シフト)
- カーブの形状変化:キー・レート・デュレーションによる寄与
- スプレッド変化リターン: クレジット・スプレッドの変化による影響:-スプレッド・デュレーション × Δスプレッド
- 信用/デフォルトリターン: デフォルトまたは信用イベントによる損失
- 残余: 説明できないリターン(コンベクシティ効果、モデル誤差)
為替アトリビューション
国際ポートフォリオのリターンは、次の要素に分解されます。
- 現地リターン: 資産の現地通貨でのリターン
- 為替リターン: 為替レートの変動による損益
- 交差項: 現地リターンと為替リターンの相互作用
- トータルリターン(基準通貨): R_base ≈ R_local + R_currency + R_local × R_currency
- ヘッジ後リターン: 現地リターン + ヘッジコスト(フォワード・プレミアム/ディスカウント)
- アクティブな為替判断のアトリビューション:実際の為替エクスポージャーとベンチマークの為替エクスポージャーの比較
保有銘柄ベースとリターンベースのアトリビューション
- 保有銘柄ベース: 実際のポートフォリオのポジションを使用します。精度は高くなりますが、各評価時点の詳細な保有銘柄データが必要です
- リターンベース(スタイル分析): ポートフォリオリターンを一連のスタイル指数(例:シャープのスタイル分析)に対して回帰します。精度は劣りますが、リターン系列だけで実施できます
- 取引ベース: 実際の取引記録を使用して期間中の売買を考慮するため、最も正確です
主要な公式
| 公式 | 式 | 用途 |
|---|---|---|
| 配分効果(セクター i) | A_i = (w_p,i - w_b,i) × (R_b,i - R_b) | セクターのウェイト付けの判断 |
| 銘柄選択効果(セクター i) | S_i = w_b,i × (R_p,i - R_b,i) | セクター内の銘柄選択 |
| 相互作用効果(セクター i) | I_i = (w_p,i - w_b,i) × (R_p,i - R_b,i) | 配分と銘柄選択の複合効果 |
| 総アクティブリターン | R_p - R_b = Σ(A_i + S_i + I_i) | すべての効果の合計がアクティブリターンに等しい |
| ファクターリターンの寄与 | C_k = β_k × F_k | ファクター k へのエクスポージャーによるリターン |
| デュレーション効果 | ΔP/P ≈ -D × Δy | 利回り変動による債券価格の変化 |
| 為替リターン | R_fx = (S_end - S_start) / S_start | 為替レートの影響 |
計算例
例 1:Brinson-Fachler 株式アトリビューション
前提: テクノロジーとヘルスケアの 2 セクターで構成されるポートフォリオ。ポートフォリオ:テクノロジー 35%(リターン 15%)、ヘルスケア 65%(リターン 8%)。ベンチマーク:テクノロジー 25%(リターン 12%)、ヘルスケア 75%(リターン 6%)。ベンチマークの総リターン:0.25×12% + 0.75×6% = 7.5%。 計算: 各セクターの配分、銘柄選択、相互作用の各効果、および総アクティブリターンを求めます。 解答:
- ポートフォリオの総リターン: 0.35×15% + 0.65×8% = 5.25% + 5.20% = 10.45%。
- 総アクティブリターン: 10.45% - 7.50% = 2.95%。
- テクノロジーの配分効果: (0.35 - 0.25) × (12% - 7.5%) = 0.10 × 4.5% = +0.45%(ベンチマークを上回ったセクターをオーバーウェイト)。
- テクノロジーの銘柄選択効果: 0.25 × (15% - 12%) = 0.25 × 3% = +0.75%(テクノロジーで選んだ銘柄がテクノロジーのベンチマークを上回る)。
- テクノロジーの相互作用効果: (0.35 - 0.25) × (15% - 12%) = 0.10 × 3% = +0.30%(オーバーウェイトし、かつアウトパフォーム)。
- ヘルスケアの配分効果: (0.65 - 0.75) × (6% - 7.5%) = -0.10 × -1.5% = +0.15%(ベンチマークに劣後したセクターをアンダーウェイト)。
- ヘルスケアの銘柄選択効果: 0.75 × (8% - 6%) = 0.75 × 2% = +1.50%(ヘルスケアで選んだ銘柄がヘルスケアのベンチマークを上回る)。
- ヘルスケアの相互作用効果: (0.65 - 0.75) × (8% - 6%) = -0.10 × 2% = -0.20%(アンダーウェイトだがアウトパフォーム — 相互作用はマイナス)。
- 合計: 配分 = 0.45 + 0.15 = 0.60%。銘柄選択 = 0.75 + 1.50 = 2.25%。相互作用 = 0.30 + (-0.20) = 0.10%。合計 = 0.60 + 2.25 + 0.10 = 2.95% ✓。
例 2:ファクターベースのアトリビューション
前提: ファンドのファクター・ローディングは β_mkt = 1.1、β_smb = 0.3、β_hml = -0.2 です。対象期間中の値は MKT = 5%、SMB = 2%、HML = -1%です。無リスク金利 = 1%。ファンドの超過リターン = 7%。 計算: ファクターの寄与とアルファを求めます。 解答:
- 市場の寄与: 1.1 × 5% = 5.50%。
- サイズ(SMB)の寄与: 0.3 × 2% = 0.60%。
- バリュー(HML)の寄与: -0.2 × (-1%) = +0.20%。
- ファクターで説明されるリターンの合計: 5.50 + 0.60 + 0.20 = 6.30%。
- アルファ(残差): 7.00% - 6.30% = +0.70%。
- 解釈: ファンドの超過リターン 7%は、主に市場を上回るベータ(5.5%)と小型株への傾斜(0.6%)によって説明されます。バリューがアンダーパフォームしたため、バリューへの負のローディングはプラスに寄与しました(+0.2%)。すべてのファクターを考慮すると、運用者は 0.70%の真のアルファを生み出しました。
よくある落とし穴
- 相互作用効果は解釈が難しいです。一部のアトリビューションモデルでは、これを配分効果または銘柄選択効果に含めるため、報告される結果が大きく変わります
- 複数期間のアトリビューションには幾何リンクが必要です。単純な算術アトリビューションでは複利効果を正しく反映できず、残差が時間とともに増加します
- リターンベースのアトリビューション(スタイル分析)は、実際の保有銘柄を反映しない場合があります。特に、積極的に取引する、またはスタイルを変更する運用者ではその傾向があります
- ファクターアトリビューションの結果は、選択したファクターモデルに大きく左右されます。モデルが異なれば、アルファの推定値も異なります
- 国際ポートフォリオでは通貨アトリビューションが見落とされがちで、見かけ上のスキルが隠れたり、過大に見えたりします
- 運用者評価におけるサバイバーシップバイアス:存続したファンドのみが分析対象となるため、平均的なスキルが過大評価されます
- ベンチマークとの比較で、手数料控除前リターンと手数料控除後リターンを混同する
- ポートフォリオの投資対象と一致しない、不適切なベンチマークを使用する
相互参照
- investment-policy(wealth-management プラグイン):IPS でのベンチマーク選定は、パフォーマンスアトリビューション分析に直接反映されます
- tax-efficiency(wealth-management プラグイン):税引後アトリビューションでは、税の影響を考慮してリターンを調整する必要があります
- savings-goals(wealth-management プラグイン):アトリビューションは、投資戦略が目標達成に向けて順調かどうかの評価に役立ちます
- liquidity-management(wealth-management プラグイン):流動性準備金によるキャッシュドラッグは、ポートフォリオ全体のアトリビューションに影響します
- client-review-prep(advisory-practice プラグイン):アトリビューション分析の主なポイントは、クライアントレビューの重要な議題です
- tax-loss-harvesting(wealth-management プラグイン):TLH による税務アルファは、別個に追跡してアトリビューションする必要があります
スクリプトの実行
uv run scripts/performance_attribution.py で実行します(PEP 723 ヘッダーにより numpy が自動的に解決されます)。または、pip install numpy scipy の実行後に python3 scripts/performance_attribution.py で実行します。引数なしで実行すると、3 つのデモが表示されます。Worked Example 1 の Brinson-Fachler アトリビューション、シード値を指定した合成データに対する OLS ファクターアトリビューション、Carino 複数期間リンクです。--verify を指定すると、出力がこのスキルの計算例の数値と一致することを検証します(PASS の場合、終了コードは 0 です)。クラスの概要を確認するには --help を指定してください。このファイルは主にモジュールとしてインポートして使用することを想定しています(例:from performance_attribution import BrinsonFachler)。