分析:索提諾比率

定義: 

索提諾比率是由Frank Sortino所提出、基於夏普比率的改良版本。不同於夏普比率會將所有波動視為風險,索提諾比率只關注對投資者不利的負向波動(下行風險),忽略正報酬帶來的波動。 

解釋: 

它顯示的是:投資報酬率對於下行風險的補償程度。最終的索提諾值代表:每承受1%的下行風險,所獲得的超額報酬為幾%。 

一般認為索提諾比率的理想值為 ≥ 2,但在實務應用中,也要與基準與市場狀況一起考慮。 

範例:

投資組合:

  • 無風險利率 (RFR) = 2%
  • 2025-01-01 存入 1000
  • 2025-03-03 購買 NASDAQ:AAPL (數量:1,價格:190,手續費:0)
  • 2025-04-11 計算索提諾比率,當時AAPL的最後價格為198.15 

索提諾比率(投資組合):0.047% 

  • 下行風險帶來的報酬補償程度很低
  • 每承受1%的下行風險,僅獲得0.047%的超額報酬 

索提諾比率(基準):−0.817% 

  • 每承受1%的下行風險,反而損失了0.817%的報酬(相對於無風險利率) 

註:由於為了簡化計算而採用的觀察期間屬於短期,因此在解讀結果時應加以考慮。

計算:

索提諾比率 = (Rp − RFR) / DD

  • Rp(投資組合報酬) — 以TWR(時間加權報酬)方法按月計算的投資組合百分比報酬

  • RFR(無風險利率) — 取自投資組合設定。由於年利率是在設定中設定的,因此必須先將其轉換為期間利率,然後才能計算。

  • DD(下行風險標準差) — 僅針對報酬為負的期間,計算其標準差

索提諾比率計算範例(依照先前解釋): 

  1. 每月無風險利率計算:
     2 / 12 = 0.167%
  2. Rp計算:
    各月績效 
    1. 一月: 0
    2. 二月: 0
    3. 三月: 3.2% (取得:截自3月31日 → ((1032.13 − 1000) / 1000) * 100 )
    4. 四月: −2.3% (取得:((1008.15 − 1032.13) / 1032.13) * 100 )

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

  1. DD計算:
    1. 一月: min(0, 0 − 0.167)² = 0.0279
    2. 二月: min(0, 0 − 0.167)² = 0.0279
    3. 三月: min(0, 3.2 − 0.167)² = 0
    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)

注意:

如果所有交易都是在相對於指標計算日期的當前月份進行的,則不會計算該指標,因為沒有完整的日曆月。

另請閱讀