Strasmore Research
למידה Matt Connorמאת Matt Connor

חישוב ריבית חסרת סיכון במדד שארפ

שיעור הריבית חסרת הסיכון במדד שארפ משתנה לאורך זמן. למדו כיצד להתאים את תשואת ה-Treasury bill לתדירות התשואות שלכם ומהן ההשלכות של שימוש בריבית קבועה אחת בחישובים.

שיעור הריבית חסרת הסיכון במדד שארפ (Sharpe ratio) הוא התשואה שהיית יכול להשיג באותה תקופה מבלי ליטול את הסיכון שאתה מודד. מדובר בסדרה, עם קריאה אחת לכל תקופה, הנקובה במטבע של התשואות. יש להתאים את תדירות הריבית לתדירות התשואה ולחסר אותה תקופה אחר תקופה. את העיגון השנתי (annualization) מבצעים פעם אחת, בסוף התהליך.

דילוג על הליך זה הוא המקור לרוב הטעויות במדדי שארפ המתפרסמים. לקיחת נתון בודד מתוך היסטוריית תשואות של עשרים שנה, בדרך כלל מה ששטר אוצר (Treasury bill) משלם השבוע, מטילה על שנת 2009 את אותו רף כמו על שנת 2024. המדריך שלנו למדד שארפ סוקר את מה שהמדד מודד. דף זה עוסק בנתון הקלט שכמעט אף אחד לא מתעד.

הריבית חסרת הסיכון אינה קבועה

מדד שארפ הנמדד לאורך עשרים שנה משתרע על פני היסטוריית ריביות. הלוח להלן לוקח את שטר האוצר לשלושה חודשים ומקבץ כל שנה קלנדרית לממוצע ולטווח סביבו.

שאילתהתשואת אג'ח אוצר ל-3 חודשים לפי שנה קלנדרית
ה-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
Run this yourself

הממוצע השנתי עמד על 3.22% ב-2005 ועל 3.74% ב-2026, לאורך 22 שנים קלנדריות. הנתיב בין שתי הקריאות הללו הוא החלק החשוב. הקו יורד לרצפה, נשאר שם במשך רוב העשור, ואז מטפס חזרה. עמודות המינימום והמקסימום מראות כמה הריבית נעה בתוך שנים בודדות, וזו הסיבה שאפילו מדד שארפ לשנה אחת דורש סדרה מותאמת ולא ציטוט בודד.

איזו ריבית חסרת סיכון שייכת למדד שארפ

ארבעה מאפיינים קובעים את הבחירה.

  1. פדיון קצר. הריבית חייבת להיות ודאית כמעט לחלוטין לאורך תקופת מדידה אחת. שטר לשלושה חודשים מתאים לעבודה חודשית. איגרת לעשר שנים אינה מתאימה, שכן מחירה משתנה במהלך החודש שאתה מודד.
  2. המטבע של התשואה. אסטרטגיה הנקובה באירו נמדדת מול שטר אירו.
  3. תדירות התשואה. תשואות שטרות מצוטטות כשיעורים שנתיים, ויש להמיר ציטוט שנתי לפני שהוא מופחת מתשואה חודשית.
  4. הגדרות תשואה בנות השוואה בשני הצדדים. התשואה של שטר היא התשואה הכוללת שלו, לכן תשואת אסטרטגיה שאינה כוללת דיבידנדים אינה נמדדת על בסיס שווה. תשואת מחיר לעומת תשואה כוללת מכסה פער זה.

להמרה בסעיף שלוש יש שתי מוסכמות נפוצות. חילוק פשוט מחלק את הציטוט השנתי ב-12. חישוב ריבית דריבית לוקח את השורש ה-12 של אחד ועוד הריבית השנתית. על שטר היפותטי של 5%, אלו נותנים 0.4167% ו-0.4074% לחודש, הבדל של כנקודת בסיס אחת שחוזר על עצמו בכל חודש במדגם. הלוחות כאן משתמשים בריבית דריבית. אם תשואות שטרות מעניינות אותך כהחזקה ולא כרף, תשואת דיבידנד לעומת תשואות אג"ח ממשלתי ו-היכן להחזיק מזומן פנוי מכסים נושאים אלו.

כיצד לבנות סדרת תשואה עודפת חודשית

הבנייה היא מכנית: קח את מחיר הסגירה האחרון של כל חודש, חשב את תשואת החודש, המר את ציטוט השטר של אותו חודש לשיעור חודשי, ואז החסר. התוצאה היא סדרת תשואה עודפת, מספר אחד לכל חודש. כיצד נמדדות תשואות חודשיות מכסה את רכיב התשואה בפירוט.

שאילתהתשואה חודשית, ריבית חסרת סיכון חודשית והעודף, 2020 עד 2024
ה-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
Run this yourself

אלו מחירי סגירה של 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 years
Run this yourself

לאורך חלון ה-20-year, התשובה בשיטת "עודף תחילה" היא 6.49% לשנה לעומת 6.59% בשיטה השנייה, פער של 0.099 נקודות אחוז. בחלון ה-1-year, שני החישובים נמצאים במרחק של 0.814 נקודות זה מזה. הנתון של "עיגון תחילה" מודפס מעל הנתון של "עודף תחילה" בכל חלון כאן. מה שמפריד ביניהם הוא איבר צולב: חישוב ריבית דריבית על סדרת תשואות לנתון שנתי כולל צבירת ריבית השטר מעל פרמיית הסיכון עצמה, וחיסור ריבית שטר שנתית לאחר מכן לעולם לא מחזיר את החלק הזה. האיבר הצולב גדל עם מכפלת שני הנתונים השנתיים, לכן הוא רחב ביותר כאשר השטרות משלמים היטב.

לעיגון שנתי יש פיצול נוסף. עיגון אריתמטי מכפיל את ממוצע העודף החודשי ב-12. עיגון גיאומטרי משתמש בריבית דריבית: הריבית השנתית הקבועה שמשחזרת את התוצאה המצטברת. קח רצף היפותטי של שתי תקופות של 50%+ ואחריו 33.3%-, שמסתיים בדיוק היכן שהתחיל. הממוצע האריתמטי הוא 8.35%+ לתקופה והממוצע הגיאומטרי הוא אפס. הלוחות כאן משתמשים בריבית דריבית. הערת שוליים אחת שכדאי לזכור: תחת עיגון אריתמטי, 12 כפול התשואה הממוצעת פחות 12 כפול ריבית השטר הממוצעת הוא אלגברית זהה ל-12 כפול העודף הממוצע. תחת מוסכמה זו, סדר החיסור אינו משנה את המונה. המכנה עדיין משתנה, שכן סטיית התקן של תשואות עודפות נפרדת מסטיית התקן של תשואות גולמיות כאשר הריבית עצמה בתנועה.

מה העלות של שימוש בריבית קבועה אחת

קיצור הדרך הנפוץ הוא לקחת את תשואת השטר הנוכחית ולהחסיר אותה מכל תקופה בהיסטוריה. הלוח להלן מריץ את מדד שארפ בשתי הדרכים לאורך חמישה חלונות שמסתיימים באותו תאריך: פעם אחת מול הסדרה החודשית המותאמת, ופעם אחת מול תשואת השטר שהייתה בתוקף בסוף החלון.

שאילתהמדד Sharpe לפי סדרת ריבית תואמת לעומת ריבית קבועה
ה-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 years
Run this yourself

בחלון ה-1-year, שתי הקריאות נמצאות במרחק של 0.07 זו מזו. לאורך שנים-עשר חודשים לריבית הקבועה יש מעט מקום לסטות מהממוצע של החלון עצמו. בחלון ה-20-year הן נמצאות במרחק של 0.18: 0.49 בסדרה המותאמת לעומת 0.32 בריבית הקבועה. השגיאה עוקבת אחר המרחק בין הריבית הבודדת שבחרת לבין הריבית הממוצעת ששררה בפועל, ולמרחק הזה יש יותר מקום לגדול ככל שהחלון מתארך. כל מה שבא לאחר מכן יורש זאת, ו-מיקוד תנודתיות וקביעת גודל פוזיציה פועל על קלטים מסוג זה בדיוק.

מלכודת המטבע

אסטרטגיה המרוויחה במטבע אחד ונמדדת מול שטר של מטבע אחר מניבה מספר שאינו אומר הרבה באף אחד מהם. חשב את התשואה העודפת בתוך מטבע אחד: תשואות אירו מול שטר אירו, תשואות ין מול שטר ין. אסטרטגיות מגודרות נושאות מלכודת שנייה. גידור מטבע מתומחר לפי ה-Forward, ונקודות ה-Forward קרובות להפרש הריביות בין שני המטבעות, מה שכבר מציב חלק מהריבית המקומית בתוך תשואה זרה מגודרת. חיסור השטר הזר מעל זה גובה את אותה ריבית פעמיים. ציין את המטבע לצד הריבית והעמימות נעלמת.

פרסם את הריבית לצד המדד

מדד שארפ המצוטט ללא מקור הריבית חסרת הסיכון והתדירות שלו אינו ניתן לבדיקה על ידי איש. שני דסקאים יכולים לחשב 0.8 ו-1.1 מאותו זרם תשואות ושניהם יהיו צודקים, בהתבסס על סדרות ריבית שונות ומוסכמות המרה שונות. ארבעה פריטים צריכים ללוות את המספר: המכשיר שממנו הגיעה הריבית, התדירות שלו, מוסכמת ההמרה, והחלון המדויק. זהו ההבדל בין מספר שקורא יכול לבקר לבין מספר שקורא חייב לקבל באמונה עיוורת.

הערות נתונים ושחזור

סדרת הריבית בכל לוח היא שטר אוצר לשלושה חודשים מעקומת התשואות היומית של האוצר, ממוצעת בתוך כל חודש קלנדרי, מומרת לריבית חודשית כשורש ה-12 של אחד ועוד הציטוט השנתי. התשואות הן מחירי סגירה חודשיים של SPY, תשואת מחיר בלבד, ללא דיבידנדים. המדדים משתמשים בסטיית תקן מדגמית של תשואות עודפות חודשיות ובשורש ה-12 לצורך עיגון שנתי. שני הלוחות האחרונים משתמשים בחלונות המסתיימים בתאריך משותף, ועמודת הריבית הקבועה לוקחת את ציטוט השטר הממוצע בחודש האחרון של אותו חלון. כל נתון בטקסט לעיל מגיע מהלוח שלידו.

שאלות נפוצות

באיזו ריבית חסרת סיכון עלי להשתמש במדד שארפ?

שטר ממשלתי קצר באותו מטבע של התשואות, מומר לאותה תדירות של התשואות. עבור תשואות דולריות חודשיות, המשמעות היא שטר אוצר לחודש או לשלושה חודשים. פדיונות ארוכים יותר נושאים סיכון מחיר לאורך תקופת המדידה, מה שפוסל אותם כרכיב חסר סיכון.

האם אני יכול להחסיר את תשואת שטר האוצר של היום מהיסטוריית תשואות ארוכה?

זו הטעות הנפוצה ביותר במדדי שארפ שמתפרסמים. לאורך חלון ה-20-year לעיל, ריבית קבועה של סוף חלון והסדרה החודשית המותאמת מניבות קריאות בהפרש של 0.18 על אותן תשואות בדיוק.

האם אני מעגן את הריבית חסרת הסיכון לפני החיסור?

לא. המר את ציטוט השטר השנתי לתדירות התשואה, החסר תקופה אחר תקופה, ואז עגן את סדרת העודף פעם אחת בסוף. עיגון של כל רכיב בנפרד וחיסור לאחר מכן משאיר איבר צולב בתוך התשובה.

בכמה הריבית חסרת הסיכון מזיזה את מדד שארפ?

בערך בשינוי בריבית חלקי התנודתיות השנתית. באסטרטגיה היפותטית עם תנודתיות שנתית של 15%, הבדל של 4% בריבית המונחת מזיז את המדד בכ-0.27, שזה המרחק בין ביצועים רגילים לביצועים מהוללים.

מה ההבדל בין עיגון אריתמטי לגיאומטרי?

אריתמטי מכפיל את ממוצע העודף התקופתי במספר התקופות בשנה. גיאומטרי משתמש בריבית דריבית על התקופות לשיעור הקבוע שמשחזר את התוצאה המצטברת. לכל תקופה, הנתון הגיאומטרי נמצא בערך או מתחת לנתון האריתמטי, והמרחק ביניהם גדל עם התנודתיות.


כל לוח כאן נושא את ה-SQL שיצר אותו, כך שסדרת הריבית והחלון גלויים שניהם. כדי להריץ את אותה בנייה על טיקר אחר או על תקופת היסטוריה אחרת, בקש זאת באנגלית פשוטה במסוף Strasmore.

#sharpe ratio#risk-free rate#excess returns#annualization#performance measurement