performance-metrics について
ポートフォリオ分析向けに、リスク調整後指標の定義や計算式、解釈、注意点を解説するスキルです。ポートフォリオとベンチマークのデータを扱う Python スコアカードスクリプトも含みます。
主な機能
- 01Sharpe、Sortino などの比率解説
- 02ベンチマーク比較と捕捉率の指標
- 03計算例とよくある注意点
- 04Python スコアカードスクリプト
活用シーン
- 01ファンドのリスク調整後パフォーマンス比較
- 02ベンチマークに対する超過収益の評価
- 03パフォーマンス比率の前提確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ joellewis/ finance_skills --skill performance-metricsインストール後、Claude Code で/performance-metricsを入力して読み込まれたか確認します。
同梱ファイルscripts/performance_metrics.py
詳細
パフォーマンス指標
基本概念
シャープレシオ
最も広く使用されているリスク調整後パフォーマンス指標です。超過リターン(無リスク金利を上回るリターン)を総ボラティリティで割ります。
SR = (R_p - R_f) / sigma_p
- R_p:ポートフォリオの年率リターン
- R_f:年率無リスク金利
- sigma_p:ポートフォリオの年率ボラティリティ(リターンの標準偏差)
シャープレシオが高いほど、総リスク単位あたりのリターンが大きいことを示します。一般的なベンチマークは、SR < 0.5 は低水準、0.5-1.0 は許容範囲、> 1.0 は高水準、> 2.0 は非常に優れた水準です。
年率換算: 月次データから計算する場合、SR_annual = SR_monthly * sqrt(12) です。
ソルティノレシオ
総ボラティリティを下方偏差に置き換え、最低許容リターンを下回るリターンなど、有害なボラティリティのみをペナルティとして扱います。
Sortino = (R_p - R_f) / sigma_downside
ここで、sigma_downside = sqrt((1/n) * sum(min(R_i - MAR, 0)^2)) です。
一般的な MAR の選択肢は、0%、無リスク金利、または目標リターンです。使用する MAR を必ず明記し、分子でも下方偏差と同じ基準点を使用してください。MAR が無リスク金利でない場合、分子は (R_p - R_f) ではなく (R_p - MAR) にします。基準点を混在させると、比率の内部整合性が失われます。
インフォメーションレシオ
ベンチマークに対するアクティブリターン(アルファ)を、アクティブリスク(トラッキングエラー)単位あたりで測定します。
IR = (R_p - R_b) / TE
ここで、TE = std(R_p - R_b) * sqrt(N) です。
IR が 0.5 を超えると一般に良好と見なされ、1.0 を超えると非常に優れていますが、その水準を維持するのは困難です。
トレイナーレシオ
総リスクではなく、システマティックリスク(ベータ)単位あたりの超過リターンを測定します。
Treynor = (R_p - R_f) / beta_p
非システマティックリスクが分散によって取り除かれた分散投資ポートフォリオの評価に役立ちます。分散投資されていない保有資産には、シャープレシオのほうが適しています。
カルマーレシオ
年率リターンを、ピークからボトムまでの最大ドローダウンと比較します。
Calmar = CAGR / |MaxDrawdown|
カルマーレシオが 1.0 を超える場合、年率リターンが最大ドローダウンを上回ることを意味します。この比率は CTA やヘッジファンドの投資家に広く利用されています。通常、3 年間の期間で計算されます。
オメガレシオ
しきい値 tau を上回るリターンと下回るリターンの分布全体を考慮した損益比率です。
Omega(tau) = integral from tau to +inf of [1 - F(r)] dr
/ integral from -inf to tau of F(r) dr
ここで、F(r) はリターンの累積分布関数です。
実際には、次のように計算します。
Omega(tau) = sum(max(R_i - tau, 0)) / sum(max(tau - R_i, 0))
Omega > 1 は、tau を上回る期待利益が tau を下回る期待損失を上回ることを意味します。シャープレシオとは異なり、オメガレシオは分布の形状全体(歪度、尖度)を捉えます。
上昇・下落キャプチャレシオ
ベンチマーク市場の上昇局面と下落局面で、ポートフォリオがどの程度値動きに参加するかを測定します。
Up Capture = R_p(in up months) / R_b(in up months) * 100
Down Capture = R_p(in down months) / R_b(in down months) * 100
Capture Ratio = Up Capture / Down Capture
理想的なプロファイルは、Up Capture > 100%、Down Capture < 100%で、Capture Ratio > 1 となることです。「上昇月」と「下落月」は、それぞれベンチマークのリターンが正または負である月を指します。
Mスクエア(モディリアーニ・モディリアーニ)
ベンチマークと同じボラティリティになるようにポートフォリオのレバレッジを上げる、または下げることで、リスク調整後リターンをリターンと同じ単位で表します。
M^2 = R_f + SR_p * sigma_b
= R_f + ((R_p - R_f) / sigma_p) * sigma_b
解釈:「このポートフォリオのボラティリティをベンチマークと同じ水準に調整した場合、Mスクエアのリターンを得ていたことになります」。これにより、ベンチマークのリターンと直接比較できます。
主な公式
| 公式 | 式 | 用途 |
|---|---|---|
| シャープレシオ | (R_p - R_f) / sigma_p | 総リスク単位あたりのリターン |
| ソルティノレシオ | (R_p - R_f) / sigma_downside | 下方リスク単位あたりのリターン |
| インフォメーションレシオ | (R_p - R_b) / TE | アクティブリスク単位あたりのアクティブリターン |
| トレイナーレシオ | (R_p - R_f) / beta_p | システマティックリスク単位あたりのリターン |
| カルマーレシオ | CAGR / | MaxDD |
| オメガレシオ | sum(max(R_i - tau, 0)) / sum(max(tau - R_i, 0)) | 分布全体を考慮した損益比率 |
| 上昇キャプチャ | R_p(up) / R_b(up) * 100 | 上昇市場への参加度 |
| 下落キャプチャ | R_p(down) / R_b(down) * 100 | 下落市場への参加度 |
| Mスクエア | R_f + SR_p * sigma_b | リターン単位で表したリスク調整後リターン |
計算例
例 1:シャープレシオの計算
条件: ファンドの年率リターンは 12%、無リスク金利は 4%、ファンドの年率ボラティリティは 15%です。
計算: シャープレシオ。
解答:
SR = (0.12 - 0.04) / 0.15
= 0.08 / 0.15
= 0.533
ファンドはリスク 1 単位あたり、0.533 単位の超過リターンを獲得しました。これは「許容範囲」ですが、1.0 を下回っています。
例 2:シャープレシオとソルティノレシオによるファンドの比較
条件:
- ファンド A:シャープレシオ = 0.8、ソルティノレシオ = 1.2
- ファンド B:シャープレシオ = 0.7、ソルティノレシオ = 1.5
計算: 下方リスクを避けたい投資家にとって、どちらのファンドが優れていますか?
解答:
ファンド A のシャープレシオはより高く(0.8 対 0.7)、総リスク調整後のパフォーマンスが優れていることを示しています。しかし、ファンド B のソルティノレシオはかなり高く(1.5 対 1.2)、下方リスク 1 単位あたりのリターンが大幅に高いことを意味します。
この乖離は、ファンド B のボラティリティが上方に偏っていることを示しています。つまり、総ボラティリティには「良い」ボラティリティ(上昇)が多く含まれる一方で、下方ボラティリティは比較的抑えられています。
下方リスクを避けたい投資家には、ファンド B が適しています。 ソルティノレシオは投資家が重視するリスク(損失)をより適切に捉えており、ファンド B の優れたソルティノレシオは、下方リスクの管理に優れていることを示しています。
例 3:インフォメーションレシオ
条件: ポートフォリオの年率リターンは 10%、ベンチマークのリターンは 8%、トラッキングエラーは 4%です。
計算: インフォメーションレシオ。
解答:
IR = (0.10 - 0.08) / 0.04
= 0.02 / 0.04
= 0.50
運用担当者はアクティブリスク 1 単位あたり、0.50 単位のアクティブリターンを生み出しました。これは一般に良好な IR とみなされ、ベンチマークからの乖離に対して一貫してアルファを生み出していることを示唆します。
よくある落とし穴
- シャープレシオの年率換算を誤る: シャープレシオは、N を年間の期間数として、sqrt(N) を乗じて換算します。SR_annual = SR_monthly * sqrt(12) であり、* 12 ではありません。除算する前に、超過リターンとボラティリティの単位をそろえる必要があります。
- 無リスク金利の頻度を誤る: 月次シャープレシオを計算する場合は、年率をそのまま使わず、月次の無リスク金利(年率 / 12)を使用します。
- ソルティノレシオの MAR の曖昧さ: ソルティノレシオの結果は、MAR = 0、MAR = 無リスク金利、MAR = 目標リターンのいずれを使用するかによって大きく変わります。MAR の前提は必ず明示してください。
- サンプル数が少ないとレシオの信頼性が低くなる: 月次観測値が 36 未満のデータから算出したレシオは、統計的に信頼性が低くなります。12 か月分のデータから算出したシャープレシオの標準誤差は、およそ sqrt((1 + SR^2/2) / 12) となり、幅が非常に広くなります。
- 異なる期間のシャープレシオを比較する: 低ボラティリティ環境でのシャープレシオ 1.0 は、高ボラティリティ環境での 1.0 と同じではありません。パフォーマンスレシオは期間ごとに異なり、市場レジームが異なる場合は直接比較できません。
関連項目
- historical-risk(wealth-management プラグイン):これらのパフォーマンスレシオの分母に使用されるリスク指標(ボラティリティ、ドローダウン、下方偏差、トラッキングエラー)を提供します。
- performance-reporting(wealth-management プラグイン)および return-calculations(core プラグイン):TWR/MWR の計算方法とレポートでの提示については、performance-reporting および core/return-calculations を参照してください。
- forward-risk(wealth-management プラグイン):将来の潜在損失を推定する将来予測型のリスク指標(VaR、CVaR)は、過去のパフォーマンス評価を補完します。
- volatility-modeling(wealth-management プラグイン):GARCH または EWMA によるボラティリティ予測を使用して、将来予測型または条件付きのシャープレシオを計算できます。
- factor-investing(wealth-management プラグイン):ファクター回帰により、これらのレシオの背景にあるアルファを分解します。クローゼットインデックスのスクリーニングでは、トラッキングエラーと損益分岐点となるインフォメーションレシオを使用します。
スクリプトの実行
uv run scripts/performance_metrics.py で実行します(PEP 723 ヘッダーによって numpy が自動的に解決されます)。または、pip install numpy scipy の実行後に python3 scripts/performance_metrics.py で実行します。引数を指定せずに実行すると、シード値を固定した合成ポートフォリオデータとベンチマークデータに基づく完全なスコアカード(Sharpe、Sortino、Information Ratio、Calmar、Treynor、Omega、捕捉率、打率、勝敗)が出力されます。--verify を指定すると、出力がこのスキルの使用例とデモの期待値に一致することを検証します(PASS の場合、終了コードは 0 です)。--help を指定すると、クラスの概要が表示されます。このファイルは主にモジュールとしてインポートして使用することを想定しています(例:from performance_metrics import PerformanceScorecard)。