return-calculations について
CAGR、TWR、MWR などの投資収益の慣行と計算方法を説明する金融分析スキルです。記載された計算を行う静的メソッドを備えた Python の `Returns` クラスも含みます。
主な機能
- 01保有期間収益と CAGR の計算
- 02算術・幾何・対数収益の区別
- 03TWR、MWR、Modified Dietz の解説
- 04年率換算と期間収益の連結
- 05Python の `Returns` クラス
活用シーン
- 01投資の年平均成長率の計算
- 02運用成績と投資家の実績の切り分け
- 03キャッシュフロー時点に応じた収益計算法の選択
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ joellewis/ finance_skills --skill return-calculationsインストール後、Claude Code で/return-calculationsを入力して読み込まれたか確認します。
同梱ファイルscripts/return_calculations.py
詳細
リターンの計算
基本概念
単純リターン(保有期間リターン)
$$R = \frac{V_{end} - V_{begin} + D}{V_{begin}}$$
ここで、D = 期間中に受け取った分配金(配当、利息)です。V_endに分配金の再投資分がすでに反映されている場合、Dを再度加算しないでください。
平均リターンと対数リターンの規約
- 算術平均
R_a = (1/n) * sum(R_i)— 期待される 単一期間 リターンの不偏推定値です(平均・分散最適化など、将来予測に使う入力値に使用します)。常に幾何平均以上となり、実現した複利成長率を過大評価します。 - 幾何平均
R_g = [prod(1 + R_i)]^(1/n) - 1— 実現した複数期間の複利成長率を測る正しい指標です。算術平均を下回る差は、おおよそsigma^2 / 2(ボラティリティ・ドラッグ)となります。 - 対数リターン
r = ln(V_end / V_begin)— 時間に関して加算可能(r_total = r_1 + ... + r_n)なため、統計モデリングや複数期間の集計に適しています。R_simple = e^r - 1、r = ln(1 + R_simple)で変換します。対数リターンは時間に関しては加算可能ですが、資産間では加算できません。
CAGR(年平均成長率)
$$CAGR = \left(\frac{V_{end}}{V_{begin}}\right)^{1/n} - 1$$
ここで、nは年数です。期間中にキャッシュフローがない場合の、2つの評価額の間の年率換算した幾何成長率です。
時間加重リターン(TWR)
外部キャッシュフローのたびに算出した小期間リターンを連鎖的に結び付け、キャッシュフローのタイミングによる影響を取り除きます。TWRは、投資家の入金・出金の判断とは独立して運用者の投資スキルを測定するものであり、運用者のパフォーマンスを評価するGIPS基準です。
$$1 + R_{TWR} = \prod_{i=1}^{n}(1 + R_i), \qquad R_i = \frac{V_{end,i}}{V_{begin,i} + CF_i} - 1$$
正確なTWRを算出するには、すべてのキャッシュフロー日にポートフォリオを評価する必要があります。
修正ディーツ・リターン
各キャッシュフロー日の評価額が得られない場合、修正ディーツ法では、期間中の各外部キャッシュフローを日数で加重して期間リターンを近似します。
$$R_{MD} = \frac{V_{end} - V_{begin} - CF_{net}}{V_{begin} + \sum_i CF_i \times w_i}, \qquad w_i = \frac{CD - D_i}{CD}$$
ここで、CF_net = 外部キャッシュフローの合計、CD = 期間中の暦日数、D_i = フロー i の発生日(そのため、w_iはフローが投資されていた期間の割合です)です。これは金額加重リターンの近似値です。修正ディーツ法による小期間リターンを連鎖的に結び付けることで、TWRを近似できます。ポートフォリオ価値に対してフローが大きい場合や、期間中の市場変動が激しい場合は精度が低下するため、大口フローの日に再評価してください。
金額加重リターン(MWR/IRR)
すべての投資家キャッシュフロー(拠出、引き出し、最終評価額)のNPVをゼロにする内部収益率です。
$$0 = \sum_{t=0}^{T} \frac{CF_t}{(1 + r)^t}$$
MWRは、キャッシュフローのタイミングと金額の影響を受けるため、実際の投資家の運用成果を反映します。数値的に解を求めます(ニュートン・ラフソン法または二分法)。
年率換算
$$R_{annual} = (1 + R_{period})^{periods_per_year} - 1$$
たとえば、四半期リターン2%を年率換算すると、(1.02)^4 - 1 = 8.24%となります。
小期間リターンの連鎖
$$(1 + R_{total}) = \prod_{i=1}^{n}(1 + R_i)$$
TWRとCAGRの基礎となる恒等式です。
計算例
例1:5年間の投資からCAGRを計算する
条件: 10,000ドルの投資が、期間中のキャッシュフローなしに、ちょうど5年間で16,105.10ドルに増加します。
計算: 年平均成長率(CAGR)。
解答:
CAGR = (V_end / V_begin)^(1/n) - 1
CAGR = (16,105.10 / 10,000)^(1/5) - 1
CAGR = (1.610510)^(0.2) - 1
CAGR = 1.10 - 1
CAGR = 0.10 = 10%
この投資は、年率**10%**で複利成長しました。
検算:$10,000 * (1.10)^5 = $10,000 * 1.61051 = $16,105.10
例 2:キャッシュフローのタイミングが悪い場合の TWR と MWR の乖離
条件: あるファンドの運用履歴は以下のとおりです。
- 1 年目の期首:ポートフォリオ価値 = $100,000
- 1 年目の期末:ポートフォリオ価値 = $120,000(リターン = +20%)
- 2 年目の期首:投資家が $100,000 を入金し、ポートフォリオ価値は $220,000 に
- 2 年目の期末:ポートフォリオ価値 = $198,000(リターン = -10%)
計算: TWR と MWR の両方を求め、乖離の理由を説明してください。
解答:
時間加重収益率(TWR):
Sub-period 1 return: R_1 = (120,000 - 100,000) / 100,000 = +20%
Sub-period 2 return: R_2 = (198,000 - 220,000) / 220,000 = -10%
TWR (cumulative) = (1 + 0.20) * (1 + (-0.10)) - 1
= 1.20 * 0.90 - 1
= 1.08 - 1
= +8.0%
TWR (annualized) = (1.08)^(1/2) - 1 = 3.92%
金額加重収益率(MWR / IRR): 投資家の視点から見たキャッシュフロー:
- t=0:-$100,000(初期投資)
- t=1:-$100,000(追加の入金)
- t=2:+$198,000(最終価値)
解く式:-100,000 + (-100,000)/(1+r) + 198,000/(1+r)^2 = 0
これは x = 1/(1+r) に関する二次方程式です。正の根から r = -0.66815% が得られます(付属のスクリプトまたは任意の IRR ソルバーで検証できます)。
r = -0.0066815 での NPV チェック:
-100,000 + (-100,000)/0.9933185 + 198,000/0.9933185^2
= -100,000 - 100,672.65 + 200,672.65
= 0.00 (exact)
MWR は年率で約 -0.67% です。
解釈: 年率 +3.92% の TWR は、マネージャーのスキルを反映しています。ファンドは 20% 上昇した後に 10% 下落し、2 年間で合計 +8% となりました。約 -0.67% の MWR は、投資家の実績を反映しています。多額の入金があったため、損失が出た 2 年目にリスクにさらされていた資金が多く、投資家の金額加重の結果はわずかなマイナスとなりました。この乖離は、マネージャーのパフォーマンス評価には TWR が適している一方、MWR は特定の投資家が実現した結果をより適切に表す理由を示しています。
よくある落とし穴
- 算術平均と幾何平均を混同する:算術平均は常に幾何平均以上になります(相加相乗平均の不等式)。複利成長の予測に算術平均を使うと、最終的な資産額を過大評価します。
- 複数期間の複利計算に算術平均を使う:複数期間にわたる複利成長を表す場合は、必ず幾何平均または CAGR を使います。
- ごく短い期間のリターンを年率換算する:週次リターン 2% を年率換算すると
(1.02)^52 - 1 = 180%となり、ノイズが増幅され、誤解を招きます。年率換算が最も意味を持つのは、1 年以上の期間です。 - TWR が適切な場合にキャッシュフローのタイミングを無視する:MWR は、マネージャーのスキルと投資家のタイミング判断を一緒に評価してしまいます。マネージャーの評価には TWR を使います。
- 配当を二重計上する:期末価値
V_endに再投資された配当がすでに含まれている場合、保有期間リターンの式でDを別途加算しないでください。 - 期間内の大きなキャッシュフローがある場合に Modified Dietz をそのまま使う:単一のキャッシュフローがポートフォリオ価値のおよそ 10% を超える場合は、日数加重するのではなく、キャッシュフローの発生日にポートフォリオを再評価します。
スクリプトの実行
scripts/return_calculations.py は、上記すべての計算式に対応する静的メソッドを備えた Returns クラスを提供します(保有期間リターン、TWR、Newton 法による MWR/IRR、組み合わせが簡単な Modified Dietz、CAGR、年率換算、リンク、算術平均/幾何平均、対数リターンの変換)。
- 実行方法:
uv run scripts/return_calculations.py(PEP 723 のインラインメタデータにより numpy が自動的に解決されます)。または、numpy がインストールされている場合はpython3 scripts/return_calculations.py。 - 引数なしで実行(または
--verifyを指定)すると、すべての関数のデモを表示し、上記の計算例の値(例 1 の CAGR = 10%、例 2 の TWR = 累積 +8.0%/年率 3.92%、MWR = -0.6682%)をアサートします。不一致があると、ゼロ以外の終了コードで終了します。 --helpには、使用可能な関数とインポート方法が表示されます。- プログラムから使用する場合は、スクリプトとして実行するのではなく、インポートします:
from return_calculations import Returns。
関連項目
- time-value-of-money(コアプラグイン):NPV、IRR、割引の概念は MWR の計算と重複します。プロジェクト/ローンの IRR を扱います
- statistics-fundamentals(コアプラグイン):算術平均と幾何平均、リターン分布の分析