分析: ソルティノレシオ

定義:

ソルティノレシオは、フランク・ソルティノによって考案されたシャープレシオと類似の指標で、シャープレシオと異なる点は、投資においてリスクとなる下落の変動のみを評価して、上昇の変動は除外する点です。

解釈:

この指標はリスクに対してどのくらい良いリターンが得られるかを示しています。1%の下落リスクに対して、何%のリターンが得られるかを直接示します。

一般的には、2以上が適切な数値と判断されていますが、ベンチマークや市場の状況に応じて総合的に判断することが重要です。

例:

ポートフォリオ:

  • リスクフリーレート (RFR) = 2%
  • 2025-01-01 入金 1000
  • 2025-03-03 NASDAQ:AAPLを購入(数量:1、約定価格: 190、手数料: 0)
  • 2025-04-11 ソルティノレシオの計算日。AAPLの最終価格 = 198.15

ポートフォリオのソルティノレシオ 0.047%:

  • 下落リスクに対するリターンが不十分な状態
  • 許容される下落リスクの各パーセントに対して、リターンはわずか0.047%にとどまっている状態

ベンチマークのソルティノレシオ -0.817%:

  • 下落リスクの1ユニット%に対して、ポートフォリオのリターンはリスクフリーレートを0.817%下回る状態

注: 上記の例では、計算を簡略化するために短期間のデータを使用しています。

計算式:

ソルティノレシオ = (Rp − RFR) / DD

  • Rp (ポートフォリオのリターン) — ポートフォリオのパフォーマンス%です。時間加重収益率 (TWR) 方式に基づいて、対象期間の月次パフォーマンスを算出します。 

  • RFR (リスクフリーレート) — ポートフォリオの設定で指定したリスクフリーレートを使用します。設定では年間のレートに設定されている為、ここでは対象期間に応じて変換したレートを使用します。

  • DD (下方偏差) — 対象期間におけるマイナスのパフォーマンスのみでの標準偏差です。

上記ポートフォリオに基づくソルティノレシオの計算例:

  1. 月次 RFR 計算式:
     2 / 12 = 0.167%
  2. Rp 計算式:
     各期間のパフォーマンス:
    1. 1月: 0
    2. 2月: 0
    3. 3月: 3.2% (3/31時点での値に基づく計算式: ((1032.13 − 1000) / 1000) * 100 )
    4. 4月: −2.3% (計算式: ((1008.15 − 1032.13) / 1032.13) * 100 )

Rp = (0 + 0 + 3.2 − 2.3) / 4 = 0.225

  1. DD 計算式:
    1. 1月: min(0, 0 − 0.167)² = 0.0279
    2. 2月: min(0, 0 − 0.167)² = 0.0279
    3. 3月: min(0, 3.2 − 0.167)² = 0
    4. 4月: min(0, −2.3 − 0.167)² = 6.1009

DD = ((0.0279 + 0.0279 + 0 + 6.1009) / 4)^(1/2) = 1.24%

  1. ソルティノレシオの計算式:
    SR = (Rp − RFR) / DD = (0.225% − 0.167%) / 1.24% ≈ 0.047%

Pineスクリプトの見本:

//@version=6
indicator("Sortino ratio example")
method downsideDeviation(array<float> returns, series float targetReturn) =>
    float sum = 0.0
    for r in returns
        if r >= targetReturn
            continue
        sum += math.pow(r - targetReturn, 2)
    sum /= returns.size()
    float result = math.sqrt(sum)

method sortinoRatio(array<float> returnsArray, series float annualBenchmark) =>
    var int numberOfperiods = 12
    if barstate.islast
        float fixedPeriodReturn = annualBenchmark / numberOfperiods
        float downsideDev       = returnsArray.downsideDeviation(fixedPeriodReturn)
        float avgReturn         = returnsArray.avg()
        float result            = (avgReturn - fixedPeriodReturn) / downsideDev

array<float> arr = array.from(0, 0, 3.2, -2.3)
float sortino = sortinoRatio(arr, 2)
plot(sortino, precision = 3)

注:

もしすべての取引がソルティノレシオの計算対象となる月に行われた場合、まだ1ヶ月分のデータが揃っていないため、ソルティノレシオは計算されません。

こちらもご覧ください