時間加重収益率(TWR)計算ツール
時間加重収益率は、外部からの入金や出金の金額と時期に左右されず、運用戦略そのものの成果を測る指標です。連続する各サブ期間についてポートフォリオの評価額を入力し、資金移動が期間の開始時か終了時かを指定してください。計算ツールが各期間の収益率を求め、それらを連結して累積値を算出します。異なる金額を異なる時期に入出金した口座同士でも、運用担当者、モデル、戦略を公平に比較できます。
無料で実行
外部資金の移動ごとに測定期間を区切ります
時間加重収益率を求める際は、まず測定対象の全期間をサブ期間に分割します。運用成果とは関係のない理由で資金がポートフォリオに入る、または外へ出るたびに境界を設けてください。追加投資、預入、引出し、口座外へ受け取る分配金は外部キャッシュフローです。一方、利息、再投資した配当、手数料、市場変動による損益は通常、運用成果に含まれるため、キャッシュフローとして入力しません。各サブ期間について、開始時と終了時の市場評価額を入力します。外部キャッシュフローは、入金なら正の数、出金なら負の数で指定してください。その金額を期間全体で運用できた場合は開始を選び、期間の運用成果が生じた後に入金された場合や、その後に出金された場合は終了を選びます。境界時点の評価額は正確であることが重要です。長い期間の途中で資金移動があった場合は、おおよその時期を割り当てず、その時点に評価境界を設けてください。行は時系列順に入力します。計算ツールは同じ順序で各収益率を連結します。
サブ期間の式と連結方法を確認します
終了時のキャッシュフローについては、終了評価額からその金額を差し引き、調整後の終了評価額を開始評価額で割ります。開始時のキャッシュフローについては、その金額を開始評価額に加え、終了評価額を実際の投資元本で割ります。どちらの場合も、得られた比率から1を引くとサブ期間収益率になります。次に、各収益率を成長係数へ変換し、すべての係数を掛け合わせ、積から1を引きます。たとえば、上昇の後に下落した場合は平均ではなく複利で計算されます。同じ大きさのプラスとマイナスの率でも、後の率が異なる元本に作用するため相殺されません。結果には、各サブ期間収益率の小数表示と百分率表示、最終的な成長係数、累積時間加重収益率が含まれます。丸めは、完全な精度の値をすべて連結した後、表示値にだけ適用されます。そのため結果の再現性を保ちつつ、途中で丸めた百分率を連結することで生じる誤差を避けられます。
結果の意味と適用範囲を理解します
最終的な百分率は、口座保有者による資金投入の判断から切り離して運用プロセスを評価するために使用します。運用担当者、ベンチマーク、モデルポートフォリオ、または入金日程が異なる口座で同じ戦略を比較する場合に特に適しています。正の結果は、すべてのサブ期間にわたり運用された1単位の資本が増えたことを示し、負の結果は減少したことを示します。成長係数は同じ成果を乗数で表し、1を上回れば成長、1を下回れば損失です。大きな入出金があった場合、時間加重収益率は投資家個人が実際に得た収益率とは一致しません。その目的には、資金移動の時期と金額を反映する金額加重収益率または内部収益率が適しています。この計算ツールは、年率換算、欠損した評価額の推定、期間内の資金移動日の推測、ベンチマークとの比較も行いません。精度は、外部キャッシュフローの正しい分類と適切な境界での市場評価額に依存します。報告や分析に利用する前に、表示された各期間の収益率を確認し、不自然な行がないかを点検してください。
活用例
運用担当者を評価する
顧客が決めた入出金を除外し、資金移動の時期ではなく投資判断を反映した収益率を算出します。
モデルポートフォリオを比較する
残高や入金日程が異なる口座でも、同じ基準で求めた戦略のサブ期間収益率を連結できます。
運用実績報告書を作成する
連結に使用した各期間の収益率とともに、検証可能な累積収益率を作成します。
よくある質問
計算ツールの料金はいくらですか?
APIリクエスト1件の料金は$0.002です。同じ決定論的な計算をブラウザ内でも実行できます。
入金は正負のどちらで入力しますか?
入金は正のキャッシュフロー、出金は負のキャッシュフローとして入力してください。
開始と終了はどのように選びますか?
資金がサブ期間全体で運用された場合は開始を選び、その期間の運用成果が生じた後に移動した場合は終了を選んでください。
時間加重収益率と内部収益率は同じですか?
いいえ。時間加重収益率は外部資金の金額と時期の影響を除き、内部収益率は投資家の実績を金額加重で測定します。
結果は年率換算されますか?
いいえ。入力したサブ期間全体の累積収益率です。年率換算に必要な経過時間は、この入力では受け取りません。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/finance/time-weighted-return \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"periods":[{"beginning_value":10000,"ending_value":10800,"cash_flow":500,"cash_flow_timing":"end"},{"beginning_value":11300,"ending_value":11752,"cash_flow":0,"cash_flow_timing":"end"}]}'const res = await fetch("https://api.kit.forhosting.com/finance/time-weighted-return", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"periods": [
{
"beginning_value": 10000,
"ending_value": 10800,
"cash_flow": 500,
"cash_flow_timing": "end"
},
{
"beginning_value": 11300,
"ending_value": 11752,
"cash_flow": 0,
"cash_flow_timing": "end"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/time-weighted-return",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"periods": [
{
"beginning_value": 10000,
"ending_value": 10800,
"cash_flow": 500,
"cash_flow_timing": "end"
},
{
"beginning_value": 11300,
"ending_value": 11752,
"cash_flow": 0,
"cash_flow_timing": "end"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/time-weighted-return", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"periods":[{"beginning_value":10000,"ending_value":10800,"cash_flow":500,"cash_flow_timing":"end"},{"beginning_value":11300,"ending_value":11752,"cash_flow":0,"cash_flow_timing":"end"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"periods":[{"beginning_value":10000,"ending_value":10800,"cash_flow":500,"cash_flow_timing":"end"},{"beginning_value":11300,"ending_value":11752,"cash_flow":0,"cash_flow_timing":"end"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/time-weighted-return", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"periods": [
{
"beginning_value": 10000,
"ending_value": 10800,
"cash_flow": 500,
"cash_flow_timing": "end"
},
{
"beginning_value": 11300,
"ending_value": 11752,
"cash_flow": 0,
"cash_flow_timing": "end"
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.time_weighted_return",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |