Strasmore Research
सीखें Matt Connorलेखक: Matt Connor

Sharpe ratio में risk-free rate का सही उपयोग कैसे करें

Sharpe ratio की गणना करते समय risk-free rate को रिटर्न आवृत्ति के साथ कैसे मिलाएं। एक स्थिर दर का उपयोग करने से होने वाली त्रुटियों और सटीक परिणाम प्राप्त करने की विधि जानें।

Sharpe ratio में risk-free rate वह रिटर्न है जिसे आप उस जोखिम को लिए बिना प्राप्त कर सकते थे जिसे आप माप रहे हैं। यह एक सीरीज़ है, जिसमें प्रति अवधि एक रीडिंग होती है, और इसे रिटर्न की मुद्रा में ही उद्धृत (quote) किया जाता है। इसकी आवृत्ति (frequency) को रिटर्न की आवृत्ति के साथ मिलाएं और अवधि-दर-अवधि घटाएं। अंत में, केवल एक बार annualize करें।

इस प्रक्रिया को छोड़ देना ही वह कारण है जिससे अधिकांश प्रकाशित Sharpe ratios गलत हो जाते हैं। बीस साल के रिटर्न इतिहास के शीर्ष से एक नंबर उठा लेना, आमतौर पर जो भी Treasury bill इस सप्ताह भुगतान कर रहा है, 2009 पर वही बाधा (hurdle) लगाता है जो 2024 पर। Sharpe ratio के लिए हमारी गाइड में यह बताया गया है कि यह अनुपात क्या मापता है। यह पृष्ठ उस इनपुट को कवर करता है जिसे लगभग कोई भी प्रलेखित (document) नहीं करता है।

Risk-free rate स्थिर नहीं है

बीस वर्षों में मापा गया Sharpe ratio एक दर इतिहास को कवर करता है। नीचे दिया गया पैनल तीन महीने के Treasury bill को लेता है और प्रत्येक कैलेंडर वर्ष को एक औसत और उसके आसपास की रेंज में समेटता है।

क्वेरीकैलेंडर वर्ष के अनुसार तीन-माह का Treasury bill यील्ड
हर आंकड़े के पीछे का पूरा 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 कैलेंडर वर्षों में फैला है। उन दो रीडिंग के बीच का रास्ता ही मायने रखता है। रेखा फर्श तक गिरती है, एक दशक के अधिकांश समय तक वहीं रहती है, फिर वापस ऊपर चढ़ती है। निम्न और उच्च कॉलम दिखाते हैं कि एकल वर्षों के भीतर दर कितनी दूर तक गई, यही कारण है कि एक साल के Sharpe ratio के लिए भी एक उद्धरण के बजाय एक मिलान वाली सीरीज़ की आवश्यकता होती है।

Sharpe ratio में कौन सी risk-free rate होनी चाहिए

चार गुण चुनाव तय करते हैं।

  1. कम परिपक्वता (Short maturity)। एक माप अवधि में दर लगभग निश्चित होनी चाहिए। तीन महीने का बिल मासिक कार्य के लिए योग्य है। दस साल का नोट नहीं है, क्योंकि जिस महीने आप माप रहे हैं, उस दौरान उसकी कीमत बदल जाती है।
  2. रिटर्न की अपनी मुद्रा। यूरो-मूल्यवर्ग की रणनीति को यूरो बिल के मुकाबले मापा जाता है।
  3. रिटर्न की अपनी आवृत्ति। बिल यील्ड को वार्षिक दरों के रूप में उद्धृत किया जाता है, और मासिक रिटर्न के साथ उपयोग करने से पहले एक वार्षिक उद्धरण को परिवर्तित (convert) करना पड़ता है।
  4. दोनों तरफ तुलनीय रिटर्न परिभाषाएं। बिल की यील्ड उसका संपूर्ण रिटर्न है, इसलिए जो रणनीति रिटर्न लाभांश (dividends) को बाहर करता है, उसे समान आधार पर नहीं मापा जाता है। Price return बनाम total return उस अंतर को कवर करता है।

बिंदु तीन में रूपांतरण के दो सम्मेलन प्रचलन में हैं। सरल विभाजन वार्षिक उद्धरण को बारह से विभाजित करता है। कंपाउंडिंग एक प्लस वार्षिक दर के बारहवें मूल (twelfth root) को लेती है। 5% के काल्पनिक बिल पर, ये महीने के लिए 0.4167% और 0.4074% देते हैं, जो नमूने के हर महीने में दोहराए जाने वाले आधार बिंदु (basis point) का अंतर है। यहाँ के पैनल कंपाउंडिंग का उपयोग करते हैं। यदि बिल यील्ड आपको एक बाधा के बजाय एक होल्डिंग के रूप में रुचि रखती है, तो dividend yield बनाम Treasury yields और खाली नकदी कहाँ रखें उस विषय को कवर करते हैं।

मासिक excess return सीरीज़ कैसे बनाएं

निर्माण यांत्रिक है: प्रत्येक महीने का अंतिम क्लोज लें, महीने का रिटर्न बनाएं, उस महीने के बिल उद्धरण को मासिक दर में बदलें, फिर घटाएं। जो बाहर आता है वह एक excess return सीरीज़ है, प्रति माह एक नंबर। मासिक रिटर्न कैसे मापे जाते हैं रिटर्न लेग को विस्तार से कवर करता है।

क्वेरीमासिक रिटर्न, मासिक जोखिम-मुक्त दर और अतिरिक्त रिटर्न, 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 क्लोज हैं, इसलिए रिटर्न कॉलम लाभांश को छोड़कर एक प्राइस रिटर्न है। Risk-free कॉलम दृश्य में पहले महीने के लिए 0.128% पर खुलता है और 0.359% पर बंद होता है। इक्विटी महीनों के बगल में जो कई प्रतिशत तक स्विंग करते हैं, risk-free पट्टी राउंडिंग जैसी दिखती है। 60 महीनों की घटाव के पार, यह दो Sharpe ratios के बीच का पूरा अंतर है जो एक ही चीज़ को मापने का दावा करते हैं।

पहले घटाएं, फिर annualize करें

एक बार सीरीज़ तैयार हो जाने के बाद संचालन के दो क्रम उपलब्ध हैं, और वे असहमत हैं। पहले Excess: मासिक रिटर्न से मासिक दर घटाएं, फिर excess सीरीज़ को annualize करें। पहले Annualize: रिटर्न को एक वार्षिक आंकड़े में कंपाउंड करें, बिल को एक वार्षिक आंकड़े में कंपाउंड करें, फिर एक को दूसरे से घटाएं।

क्वेरीवार्षिक जोखिम प्रीमियम: मासिक घटाएं, या पहले प्रत्येक भाग को वार्षिक करें
हर आंकड़े के पीछे का पूरा 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 विंडो पर, पहले-excess वाला उत्तर प्रति वर्ष 6.49% है, जबकि दूसरे क्रम के लिए 6.59% है, जो 0.099 प्रतिशत अंकों का अंतर है। 1-year विंडो पर, वही दो गणनाएं 0.814 अंक अलग हैं। पहले-annualize वाला आंकड़ा यहाँ हर विंडो में पहले-excess वाले आंकड़े के ऊपर प्रिंट होता है। उन्हें जो अलग करता है वह एक क्रॉस टर्म है: रिटर्न सीरीज़ को वार्षिक संख्या में कंपाउंड करने में जोखिम प्रीमियम के ऊपर बिल दर अर्जित करना शामिल है, और बाद में वार्षिक बिल को घटाने से वह हिस्सा कभी वापस नहीं निकलता। क्रॉस टर्म दोनों वार्षिक संख्याओं के गुणनफल के साथ स्केल करता है, इसलिए यह तब सबसे चौड़ा होता है जब बिल अच्छा भुगतान करते हैं।

Annualizing में एक दूसरा मोड़ है। अंकगणितीय (Arithmetic) annualization औसत मासिक excess को बारह से गुणा करता है। ज्यामितीय (Geometric) annualization कंपाउंड करता है: वह निरंतर वार्षिक दर जो संचयी परिणाम को पुन: उत्पन्न करती है। +50% और उसके बाद -33.3% की दो-अवधि की काल्पनिक दौड़ लें, जो बिल्कुल वहीं समाप्त होती है जहाँ से शुरू हुई थी। अंकगणितीय औसत प्रति अवधि +8.35% है और ज्यामितीय औसत शून्य है। यहाँ के पैनल कंपाउंडिंग का उपयोग करते हैं। एक फुटनोट जो ध्यान रखने योग्य है: अंकगणितीय annualization के तहत, माध्य रिटर्न का बारह गुना माइनस माध्य बिल दर का बारह गुना बीजगणितीय रूप से माध्य excess के बारह गुना के समान है। उस सम्मेलन के तहत घटाव का क्रम अंश (numerator) को अकेला छोड़ देता है। हर (denominator) अभी भी चलता है, क्योंकि excess रिटर्न का मानक विचलन (standard deviation) कच्चे रिटर्न के मानक विचलन से अलग हो जाता है जब दर स्वयं यात्रा कर रही होती है।

एक निश्चित दर की कीमत क्या है

सामान्य शॉर्टकट वर्तमान बिल यील्ड को लेना और इसे इतिहास की हर अवधि से घटाना है। नीचे दिया गया पैनल Sharpe ratio को पांच विंडो पर दोनों तरीकों से चलाता है जो एक ही तारीख पर समाप्त होते हैं: एक बार मिलान वाली मासिक सीरीज़ के खिलाफ, एक बार विंडो के अंत में प्रभावी बिल यील्ड के खिलाफ।

क्वेरीएक निश्चित दर के मुकाबले मैच की गई दर श्रृंखला पर Sharpe ratio
हर आंकड़े के पीछे का पूरा 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। त्रुटि आपके द्वारा चुनी गई एकल दर और वास्तव में प्रचलित औसत दर के बीच की दूरी को ट्रैक करती है, और उस दूरी के पास विंडो के लंबे होने पर खुलने के लिए अधिक जगह होती है। नीचे की ओर कुछ भी इसे विरासत में प्राप्त करता है, और volatility targeting और position sizing ठीक इसी तरह के इनपुट पर चलता है।

मुद्रा का जाल

एक रणनीति जो एक मुद्रा में कमाती है और दूसरी मुद्रा के बिल के खिलाफ मापी जाती है, एक ऐसा नंबर तैयार करती है जिसका दोनों में बहुत कम अर्थ है। एक मुद्रा के भीतर excess return की गणना करें: यूरो रिटर्न बनाम यूरो बिल, येन रिटर्न बनाम येन बिल। हेज्ड रणनीतियों में दूसरा जाल होता है। एक मुद्रा हेज फॉरवर्ड से कीमत तय करती है, और फॉरवर्ड पॉइंट दो मुद्राओं के बीच ब्याज दर अंतर के करीब बैठते हैं, जो पहले से ही घरेलू दर का हिस्सा एक हेज्ड विदेशी रिटर्न के अंदर रखता है। उसके ऊपर विदेशी बिल को घटाना उसी दर से दो बार शुल्क लेता है। दर के बगल में मुद्रा का नाम लिखें और अस्पष्टता दूर हो जाएगी।

अनुपात के साथ दर प्रकाशित करें

अपने risk-free स्रोत और आवृत्ति के बिना उद्धृत Sharpe ratio की जांच किसी के द्वारा नहीं की जा सकती है। दो डेस्क समान रिटर्न स्ट्रीम से 0.8 और 1.1 की गणना कर सकते हैं और दोनों सही हो सकते हैं, जो अलग-अलग दर सीरीज़ और अलग-अलग रूपांतरण सम्मेलनों से काम कर रहे हैं। चार आइटम नंबर के साथ यात्रा करते हैं: वह साधन जिससे दर आई, उसकी आवृत्ति, रूपांतरण सम्मेलन, और सटीक विंडो। यह उस नंबर के बीच का अंतर है जिसे एक पाठक ऑडिट कर सकता है और वह नंबर जिसे एक पाठक को विश्वास पर लेना पड़ता है।

डेटा नोट्स और पुनरुत्पादन

हर पैनल में दर सीरीज़ दैनिक Treasury यील्ड कर्व से तीन महीने का Treasury बिल है, जिसे प्रत्येक कैलेंडर महीने के भीतर औसत किया गया है, जिसे वार्षिक उद्धरण के एक प्लस के बारहवें मूल के रूप में मासिक दर में परिवर्तित किया गया है। रिटर्न SPY महीने के अंत के क्लोज हैं, केवल प्राइस रिटर्न, लाभांश को छोड़कर। अनुपात मासिक excess रिटर्न के नमूना मानक विचलन और annualization के लिए बारह के वर्गमूल का उपयोग करते हैं। अंतिम दो पैनल एक सामान्य तारीख पर समाप्त होने वाली विंडो का उपयोग करते हैं, और निश्चित-दर कॉलम उस विंडो के अंतिम महीने में औसत बिल उद्धरण लेता है। गद्य में हर आंकड़ा उसके बगल वाले पैनल से आता है।

सामान्य प्रश्न

मुझे Sharpe ratio में किस risk-free rate का उपयोग करना चाहिए?

रिटर्न के समान मुद्रा में एक अल्पकालिक सरकारी बिल, जिसे रिटर्न के समान आवृत्ति में परिवर्तित किया गया हो। मासिक USD रिटर्न के लिए इसका मतलब एक महीने या तीन महीने का Treasury बिल है। लंबी परिपक्वता अवधि माप अवधि के दौरान मूल्य जोखिम उठाती है, जो उन्हें risk-free लेग के रूप में अयोग्य बनाती है।

क्या मैं आज की Treasury बिल यील्ड को लंबे रिटर्न इतिहास से घटा सकता हूँ?

यह प्रकाशित Sharpe ratios में सबसे आम गलती है। ऊपर दी गई 20-year विंडो पर, एक निश्चित एंड-ऑफ-विंडो दर और मिलान वाली मासिक सीरीज़ उन्हीं रिटर्न पर 0.18 अलग रीडिंग देती हैं।

क्या मैं घटाने से पहले risk-free rate को annualize करता हूँ?

नहीं। वार्षिक बिल उद्धरण को रिटर्न की आवृत्ति में परिवर्तित करें, अवधि-दर-अवधि घटाएं, फिर अंत में excess सीरीज़ को एक बार annualize करें। प्रत्येक लेग को अलग से annualize करना और बाद में घटाना उत्तर में एक क्रॉस टर्म छोड़ देता है।

risk-free rate Sharpe ratio को कितना बदलता है?

लगभग दर में परिवर्तन को वार्षिक अस्थिरता (volatility) से विभाजित करें। 15% वार्षिक अस्थिरता पर चलने वाली एक काल्पनिक रणनीति पर, अनुमानित दर में 4% का अंतर अनुपात को लगभग 0.27 तक ले जाता है, जो एक साधारण ट्रैक रिकॉर्ड और एक प्रसिद्ध रिकॉर्ड के बीच की दूरी है।

अंकगणितीय और ज्यामितीय annualization में क्या अंतर है?

अंकगणितीय औसत अवधि excess को एक वर्ष में अवधियों की संख्या से गुणा करता है। ज्यामितीय अवधियों को उस निरंतर दर में कंपाउंड करता है जो संचयी परिणाम को पुन: उत्पन्न करती है। प्रति अवधि ज्यामितीय आंकड़ा अंकगणितीय के बराबर या उससे नीचे बैठता है, और उनके बीच की दूरी अस्थिरता के साथ चौड़ी हो जाती है।


यहाँ हर पैनल में वह SQL है जिसने इसे तैयार किया है, इसलिए दर सीरीज़ और विंडो दोनों दिखाई दे रहे हैं। किसी अन्य टिकर या इतिहास के किसी अन्य हिस्से पर समान निर्माण चलाने के लिए, Strasmore टर्मिनल पर सादे अंग्रेजी में पूछें।

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