シャープレシオの無リスク金利とは
シャープレシオの無リスク金利は時間とともに変動します。短期証券の利回りをリターンの頻度に合わせる方法と、固定金利が答えに与える影響を解説します。
シャープレシオにおける無リスク金利とは、評価対象のリスクを取らずに、同じ期間に得られたリターンです。リターンと同じ通貨で示し、各期間に一つの値を持つ時系列です。リターンの頻度に合わせ、期間ごとに差し引きます。年率換算は最後に一度だけ行います。
この手順を省くことが、公開されているシャープレシオの大半が誤る原因です。二十年分のリターン履歴の冒頭に一つの数値を置き、通常はその週の財務省短期証券の利回りを使うと、2009年にも2024年にも同じハードルを課すことになります。シャープレシオの解説では、この比率が測るものを説明しています。このページでは、ほとんど誰も記録していない入力値を扱います。
無リスク金利は一定ではない
二十年間のシャープレシオは、金利の推移を含む期間を対象にします。以下のパネルでは、三カ月物財務省短期証券について、各暦年を平均値とその年内レンジにまとめています。
各数値の背後にある正確なSQL
SELECT
toString(toYear(date)) AS year,
round(avg(toFloat64(yield_3_month)), 2) AS avg_bill_pct,
round(min(toFloat64(yield_3_month)), 2) AS low_bill_pct,
round(max(toFloat64(yield_3_month)), 2) AS high_bill_pct
FROM global_markets.treasury_yields
WHERE date >= '2005-01-01'
AND yield_3_month IS NOT NULL
GROUP BY year
ORDER BY year年平均は3.22%の2005から3.74%の2026まで、22暦年にわたって推移しました。重要なのは、この二つの値の間の経路です。金利は底まで低下し、十年近くその水準にとどまった後、再び上昇しています。安値と高値の列は、各年の中で金利がどれだけ動いたかを示しています。そのため、一年のシャープレシオであっても、一つの金利ではなく、期間に対応した時系列が必要です。
シャープレシオに使う無リスク金利
選択を決める条件は四つあります。
- 短期であること。金利は、一つの測定期間にわたりほぼ確実でなければなりません。三カ月物短期証券は月次分析に適しています。十年債は、測定対象の一カ月間にも価格が動くため適しません。
- リターンと同じ通貨であること。ユーロ建て戦略は、ユーロ建て短期証券と比較します。
- リターンと同じ頻度であること。短期証券の利回りは年率で示されるため、月次リターンに使う前に月次金利へ変換する必要があります。
- 両者のリターン定義が比較可能であること。短期証券の利回りはリターン全体を表します。そのため、配当を除いた戦略リターンとは同じ条件で測定できません。プライスリターンとトータルリターンで、この差を説明しています。
三つ目の条件にある変換には、二つの方式があります。単純除算では、年率を十二で割ります。複利計算では、年率に一を加えた値の十二乗根を取ります。仮に短期証券の利回りが5%なら、月次ではそれぞれ0.4167%と0.4074%になります。差はおよそ一ベーシスポイントですが、サンプルの各月で繰り返されます。ここで示すパネルでは複利方式を使っています。短期証券の利回りをハードルではなく保有収益として知りたい場合は、配当利回りと財務省証券利回りおよび待機資金の置き場所を参照してください。
月次超過リターン系列の作り方
計算は機械的です。各月の最終終値を使って月次リターンを計算し、その月の短期証券利回りを月次金利へ変換してから差し引きます。得られるのは、月ごとに一つの値を持つ超過リターン系列です。リターン部分の詳細は月次リターンの測定方法で説明しています。
各数値の背後にある正確なSQL
WITH
monthly_px AS
(
SELECT
toStartOfMonth(date) AS m,
argMax(toFloat64(close), date) AS month_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2019-12-01'
AND date < '2025-01-01'
GROUP BY m
),
prior_px AS
(
SELECT
addMonths(m, 1) AS m,
month_close AS prev_close
FROM monthly_px
),
monthly_rf AS
(
SELECT
toStartOfMonth(date) AS m,
pow(1 + avg(toFloat64(yield_3_month)) / 100, 1.0 / 12) - 1 AS rf_month
FROM global_markets.treasury_yields
WHERE date >= '2019-12-01'
AND date < '2025-01-01'
AND yield_3_month IS NOT NULL
GROUP BY m
)
SELECT
toString(cur.m) AS month,
round(100 * (cur.month_close / prv.prev_close - 1), 2) AS spy_ret_pct,
round(100 * rf.rf_month, 3) AS rf_pct,
round(100 * (cur.month_close / prv.prev_close - 1 - rf.rf_month), 2) AS excess_pct
FROM monthly_px AS cur
INNER JOIN prior_px AS prv ON prv.m = cur.m
INNER JOIN monthly_rf AS rf ON rf.m = cur.m
ORDER BY cur.mこれらはSPYの終値なので、リターン列は配当を除いたプライスリターンです。無リスク金利の列は、表示期間の最初の月に0.128%で始まり、0.359%で終わります。数%動く株式市場の月次リターンと並べると、無リスク金利の変化は丸め誤差のように見えます。しかし、60カ月にわたって差し引くと、同じものを測るはずの二つのシャープレシオを分ける要因になります。
先に差し引き、その後で年率換算する
系列をそろえた後の計算順序には二つの方法があり、結果は一致しません。一つ目は、月次リターンから月次金利を差し引いて超過リターンを作り、その系列を年率換算する方法です。二つ目は、リターンを複利計算して年率にし、短期証券も年率にした後、両者を差し引く方法です。
各数値の背後にある正確なSQL
WITH
monthly_px AS
(
SELECT
toStartOfMonth(date) AS m,
argMax(toFloat64(close), date) AS month_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2004-12-01'
AND date < '2025-01-01'
GROUP BY m
),
prior_px AS
(
SELECT
addMonths(m, 1) AS m,
month_close AS prev_close
FROM monthly_px
),
monthly_rf AS
(
SELECT
toStartOfMonth(date) AS m,
pow(1 + avg(toFloat64(yield_3_month)) / 100, 1.0 / 12) - 1 AS rf_month
FROM global_markets.treasury_yields
WHERE date >= '2004-12-01'
AND date < '2025-01-01'
AND yield_3_month IS NOT NULL
GROUP BY m
),
excess AS
(
SELECT
cur.m AS m,
cur.month_close / prv.prev_close - 1 AS ret,
rf.rf_month AS rf_month,
cur.month_close / prv.prev_close - 1 - rf.rf_month AS exc
FROM monthly_px AS cur
INNER JOIN prior_px AS prv ON prv.m = cur.m
INNER JOIN monthly_rf AS rf ON rf.m = cur.m
)
SELECT
concat(toString(intDiv(count(), 12)), '-year') AS horizon,
round(100 * (exp(12 * avg(log(1 + exc))) - 1), 2) AS excess_first_pct,
round(100 * ((exp(12 * avg(log(1 + ret))) - 1)
- (exp(12 * avg(log(1 + rf_month))) - 1)), 2) AS annualize_first_pct,
round(100 * ((exp(12 * avg(log(1 + ret))) - 1)
- (exp(12 * avg(log(1 + rf_month))) - 1)
- (exp(12 * avg(log(1 + exc))) - 1)), 3) AS gap_pct
FROM excess
CROSS JOIN (SELECT arrayJoin([1, 3, 5, 10, 20]) AS years) AS hz
WHERE m >= subtractYears(toDate('2025-01-01'), years)
GROUP BY years
ORDER BY years20-yearの期間では、先に超過リターンを計算した結果が年率6.49%で、もう一方は6.59%です。差は0.099パーセントポイントです。1-yearの期間では、同じ二つの計算結果が0.814ポイント離れています。ここにあるすべての期間で、先に年率換算する方法の値が、先に超過リターンを計算する方法を上回っています。
差を生むのは交差項です。リターン系列を年率に複利換算すると、リスクプレミアム自体に短期金利が付く効果も含まれます。その後で年率換算した短期金利を差し引いても、その部分は取り除かれません。交差項は、二つの年率換算値の積に応じて大きくなります。そのため、短期金利が高いほど差も広がります。
年率換算には、もう一つ分岐があります。算術年率換算では、月次超過リターンの平均に十二を掛けます。幾何年率換算では複利計算を行い、累積結果を再現する一定の年率を求めます。仮に、二期間で+50%の後に-33.3%となると、出発点とまったく同じ水準に戻ります。このとき、算術平均は一期間当たり+8.35%ですが、幾何平均はゼロです。ここにあるパネルでは複利方式を使っています。
覚えておくべき点が一つあります。算術年率換算では、平均リターンに十二を掛けた値から平均短期金利に十二を掛けた値を引く計算は、平均超過リターンに十二を掛ける計算と代数的に同じです。この方式では、差し引く順序によって分子は変わりません。ただし、分母は変わります。金利自体が変動する場合、超過リターンの標準偏差は、元のリターンの標準偏差とは異なるためです。
固定金利を使うと結果はいくら変わるか
よくある簡便法は、現在の短期証券利回りを取得し、履歴のすべての期間から差し引くことです。以下のパネルでは、同じ日付で終わる五つの期間について、二通りのシャープレシオを計算しています。一つは期間に対応した月次系列を使い、もう一つは各期間の末日時点で適用される短期証券利回りを使います。
各数値の背後にある正確なSQL
WITH
monthly_px AS
(
SELECT
toStartOfMonth(date) AS m,
argMax(toFloat64(close), date) AS month_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2004-12-01'
AND date < '2025-01-01'
GROUP BY m
),
prior_px AS
(
SELECT
addMonths(m, 1) AS m,
month_close AS prev_close
FROM monthly_px
),
monthly_rf AS
(
SELECT
toStartOfMonth(date) AS m,
pow(1 + avg(toFloat64(yield_3_month)) / 100, 1.0 / 12) - 1 AS rf_month
FROM global_markets.treasury_yields
WHERE date >= '2004-12-01'
AND date < '2025-01-01'
AND yield_3_month IS NOT NULL
GROUP BY m
),
excess AS
(
SELECT
cur.m AS m,
cur.month_close / prv.prev_close - 1 AS ret,
rf.rf_month AS rf_month
FROM monthly_px AS cur
INNER JOIN prior_px AS prv ON prv.m = cur.m
INNER JOIN monthly_rf AS rf ON rf.m = cur.m
)
SELECT
concat(toString(intDiv(count(), 12)), '-year') AS horizon,
round(sqrt(12) * avg(ret - rf_month) / stddevSamp(ret - rf_month), 2) AS sharpe_matched_rf,
round(sqrt(12) * avg(ret - rf_fixed) / stddevSamp(ret - rf_fixed), 2) AS sharpe_fixed_rf,
round(abs(sqrt(12) * avg(ret - rf_month) / stddevSamp(ret - rf_month)
- sqrt(12) * avg(ret - rf_fixed) / stddevSamp(ret - rf_fixed)), 2) AS abs_gap
FROM excess
CROSS JOIN
(
SELECT pow(1 + avg(toFloat64(yield_3_month)) / 100, 1.0 / 12) - 1 AS rf_fixed
FROM global_markets.treasury_yields
WHERE date >= '2024-12-01'
AND date < '2025-01-01'
AND yield_3_month IS NOT NULL
) AS fixed_rate
CROSS JOIN (SELECT arrayJoin([1, 3, 5, 10, 20]) AS years) AS hz
WHERE m >= subtractYears(toDate('2025-01-01'), years)
GROUP BY years
ORDER BY years1-yearの期間では、二つの値が0.07離れています。十二カ月の期間では、固定金利が期間内の平均値から大きく離れる余地はほとんどありません。20-yearの期間では、差は0.18ポイントです。期間に対応した系列では0.49、固定金利では0.32です。
誤差は、選んだ単一の金利と実際に適用された平均金利との差に連動します。期間が長くなるほど、その差が広がる余地も大きくなります。その影響は後続の計算すべてに引き継がれます。ボラティリティ・ターゲティングとポジションサイジングも、まさにこの種の入力値を使います。
通貨の落とし穴
ある通貨で収益を得る戦略を、別の通貨の短期証券と比較すると、どちらの通貨についても意味の乏しい数値になります。超過リターンは一つの通貨の中で計算してください。ユーロ建てリターンはユーロ短期証券と、円建てリターンは円短期証券と比較します。
為替ヘッジ戦略には、別の落とし穴があります。為替ヘッジはフォワードレートを基準に価格付けされます。フォワードポイントは通常、二通貨間の金利差に近く、ヘッジされた外国資産のリターンには国内金利の一部がすでに含まれています。その上で外国通貨の短期証券を差し引くと、同じ金利を二重に課すことになります。金利の横に通貨を明記すれば、曖昧さはなくなります。
比率とともに金利を公表する
無リスク金利の出所と頻度を示さずにシャープレシオを公表しても、誰も検証できません。同じリターン系列から、二つの運用デスクが0.8と1.1を計算し、どちらも正しい場合があります。使った金利系列と変換方式が異なるためです。
数値とともに示すべき項目は四つあります。金利の対象商品、頻度、変換方式、正確な対象期間です。これらが、読者が監査できる数値と、読者が信じるしかない数値を分けます。
データに関する注記と再現方法
すべてのパネルで、金利系列には日次の財務省イールドカーブから取得した三カ月物財務省短期証券を使っています。各暦月内で平均し、年率に一を加えた値の十二乗根として月次金利へ変換しています。リターンはSPYの月末終値によるプライスリターンで、配当は除外しています。比率の計算には、月次超過リターンの標本標準偏差と、年率換算のための十二の平方根を使っています。最後の二つのパネルは共通の日付で終わる期間を使い、固定金利列には各期間の最終月における平均短期証券利回りを使っています。本文中のすべての数値は、隣接するパネルから取得しています。
よくある質問
シャープレシオには、どの無リスク金利を使うべきですか?
リターンと同じ通貨の短期国債を使い、リターンと同じ頻度へ変換します。月次の米ドル建てリターンであれば、一カ月物または三カ月物の財務省短期証券が該当します。長期債は測定期間中に価格リスクを伴うため、無リスク部分には適しません。
長期のリターン履歴から、今日の財務省短期証券利回りを差し引いてもよいですか?
公開されているシャープレシオで最も一般的な誤りです。上記の20-yearの期間では、期間末の固定金利と、期間に対応した月次系列を使うと、同じリターンから得られる値が0.18離れます。
無リスク金利は、差し引く前に年率換算しますか?
いいえ。年率の短期証券利回りをリターンの頻度へ変換し、期間ごとに差し引いてから、最後に超過リターン系列を一度だけ年率換算します。各要素を別々に年率換算してから差し引くと、交差項が結果に残ります。
無リスク金利は、シャープレシオをどの程度動かしますか?
おおむね、金利の変化を年率ボラティリティで割った大きさです。年率ボラティリティが15%の仮想的な戦略では、想定金利に4%の差があると、シャープレシオは約0.27動きます。これは、平凡な運用実績と高く評価される運用実績の差に相当します。
算術年率換算と幾何年率換算の違いは何ですか?
算術年率換算は、一期間当たりの超過リターンの平均に年間の期間数を掛けます。幾何年率換算は、期間を複利計算し、累積結果を再現する一定の金利を求めます。一期間当たりでは、幾何値は算術値以下になります。ボラティリティが高いほど、その差は広がります。
ここにあるすべてのパネルには、作成に使ったSQLが付いているため、金利系列と対象期間を確認できます。別のティッカーや別の期間について同じ計算を実行する場合は、Strasmore terminalで平易な英語により依頼してください。