Sharpe ratioमध्ये risk-free rate कसा वापरावा
Sharpe ratioसाठी risk-free rate काळानुसार बदलतो. Treasury bill yield तुमच्या return frequencyशी जुळवा आणि स्थिर दर वापरल्याने उत्तर कसे चुकते ते समजा.
Sharpe ratioमधील risk-free rate म्हणजे तुम्ही ज्या कालावधीचे मूल्यमापन करत आहात, तोच कालावधी जोखीम न घेता मिळवता आला असता असा परतावा. हा एक series असतो. प्रत्येक periodसाठी त्याची एक reading असते आणि तो returns ज्या currencyमध्ये आहेत त्याच currencyमध्ये दर्शवला जातो. त्याची frequency returnsच्या frequencyशी जुळवा आणि प्रत्येक periodसाठी तो वजा करा. Annualize फक्त शेवटी, एकदाच करा.
ही प्रक्रिया वगळल्यामुळे प्रकाशित Sharpe ratiosमध्ये सर्वाधिक चुका होतात. वीस वर्षांच्या return historyमधून एकच आकडा घेणे—साधारणतः त्या आठवड्यात Treasury bill देत असलेला दर—म्हणजे 2009 आणि 2024 साठी समान hurdle लावणे होय. Sharpe ratioसाठी आमचे मार्गदर्शक हे ratio काय मोजतो ते स्पष्ट करते. हे पृष्ठ जवळपास कोणीही नोंदवत नसलेल्या inputवर आहे.
Risk-free rate स्थिर नसतो
वीस वर्षांतील Sharpe ratioमध्ये ratesचा संपूर्ण इतिहास समाविष्ट असतो. खालील panelमध्ये three-month Treasury bill घेऊन प्रत्येक calendar yearचा average आणि त्याभोवतीची range दाखवली आहे.
प्रत्येक आकड्यामागील अचूक 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वार्षिक average 3.22% मध्ये 2005 होता आणि 3.74% मध्ये 2026 होता; हा बदल 22 calendar yearsमध्ये दिसतो. या दोन readingsमधील प्रवास महत्त्वाचा आहे. दर तळाच्या पातळीवर घसरतो, जवळपास दशकभर तिथेच राहतो आणि नंतर पुन्हा वाढतो. Low आणि high columns एकाच वर्षात दर किती हलला हे दाखवतात. म्हणूनच one-year Sharpe ratioसाठीसुद्धा एका quoteऐवजी जुळणारा series आवश्यक असतो.
Sharpe ratioमध्ये कोणता risk-free rate वापरावा
निवड चार गुणधर्मांवर ठरते.
- अल्प मुदत. एका measurement periodमध्ये दर जवळपास निश्चित असला पाहिजे. Monthly कामासाठी three-month bill योग्य आहे. Ten-year note योग्य नाही, कारण तुम्ही मोजत असलेल्या महिन्यात त्याची किंमत बदलते.
- Returnची स्वतःची currency. Euro-denominated strategyचे मूल्यमापन euro billच्या तुलनेत केले पाहिजे.
- Returnची स्वतःची frequency. Bill yields annual rates म्हणून दिले जातात. त्यामुळे monthly returnला लागू करण्यापूर्वी annual quoteचे monthly rateमध्ये रूपांतर करावे लागते.
- दोन्ही बाजूंवरील return definitions तुलनात्मक असाव्यात. Billचा yield हा त्याचा संपूर्ण return असतो. त्यामुळे dividends वगळणारा strategy return समान आधारावर मोजला जात नाही. Price return आणि total return हा फरक स्पष्ट करते.
तिसऱ्या मुद्द्यातील conversionसाठी दोन पद्धती प्रचलित आहेत. Simple divisionमध्ये annual quoteला twelveने भागले जाते. Compoundingमध्ये one plus annual rateचा twelfth root घेतला जातो. काल्पनिक 5% billवर या पद्धतींनी महिन्यासाठी अनुक्रमे 0.4167% आणि 0.4074% दर मिळतात. सुमारे one basis pointचा हा फरक sampleमधील प्रत्येक महिन्यात पुन्हा दिसतो. येथे panelsमध्ये compounding वापरले आहे. Bill yieldsचा वापर hurdleऐवजी holding म्हणून समजून घ्यायचा असल्यास dividend yield विरुद्ध Treasury yields आणि idle cash कुठे ठेवावे हे भाग पाहा.
Monthly excess return series कसा तयार करावा
ही प्रक्रिया यांत्रिक आहे: प्रत्येक महिन्याचा शेवटचा close घ्या, त्या महिन्याचा return काढा, त्या महिन्याच्या bill quoteचे monthly rateमध्ये रूपांतर करा आणि तो वजा करा. यामुळे प्रत्येक महिन्यासाठी एक आकडा असलेला excess return series मिळतो. Monthly returns कसे मोजले जातात या return legचे सविस्तर स्पष्टीकरण देते.
प्रत्येक आकड्यामागील अचूक 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चे closes आहेत. त्यामुळे return column हा dividends वगळणारा price return आहे. या कालावधीतील पहिल्या महिन्यासाठी risk-free column 0.128% पासून सुरू होतो आणि 0.359% वर संपतो. काही टक्के चढ-उतार असलेल्या equity monthsच्या तुलनेत risk-free strip roundingसारखा दिसतो. मात्र 60 महिन्यांतील subtractionमध्ये तोच, समान गोष्ट मोजत असल्याचा दावा करणाऱ्या दोन Sharpe ratiosमधील संपूर्ण फरक ठरवतो.
आधी वजा करा, नंतर annualize करा
Series जुळवल्यानंतर operationच्या दोन पद्धती उपलब्ध असतात आणि त्यांचे परिणाम वेगळे येतात. आधी excess: monthly returnमधून monthly rate वजा करा आणि नंतर excess seriesचे annualization करा. आधी annualize: returnsचे annual figureमध्ये compounding करा, billचे annual figureमध्ये compounding करा आणि नंतर एक दुसऱ्यातून वजा करा.
प्रत्येक आकड्यामागील अचूक 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 कालावधीत excess-first उत्तर 6.49% प्रति वर्ष येते, तर दुसऱ्या पद्धतीचे उत्तर 6.59% येते. फरक 0.099 percentage pointsचा आहे. 1-year कालावधीतही ही दोन computations 0.814 pointsने वेगळी आहेत. येथे प्रत्येक windowमध्ये annualize-first figure हा excess-first figureपेक्षा जास्त दिसतो. यामागे cross term आहे. Return seriesचे annual numberमध्ये compounding करताना risk premiumवर bill rateचा परतावाही मिळतो. नंतर annualized bill वजा केल्यावर तो भाग पुन्हा काढला जात नाही. हा cross term दोन annualized numbersच्या productनुसार वाढतो. त्यामुळे billsचा दर जास्त असताना तो सर्वाधिक असतो.
Annualizingमध्ये आणखी एक फरक असतो. Arithmetic annualizationमध्ये average monthly excessला twelveने गुणले जाते. Geometric annualizationमध्ये compounding केले जाते. म्हणजे cumulative result पुन्हा निर्माण करणारा constant annual rate काढला जातो. काल्पनिक two-period run घ्या: +50% आणि त्यानंतर -33.3%. शेवटी तो अगदी सुरुवातीच्या पातळीवर येतो. Arithmetic average प्रति period +8.35% असतो, तर geometric average zero असतो. येथे panelsमध्ये compounding वापरले आहे. एक महत्त्वाची footnote: arithmetic annualizationमध्ये twelve times mean return minus twelve times mean bill rate हे algebraically twelve times mean excessइतकेच असते. या conventionमध्ये subtractionचा order numerator बदलत नाही. मात्र denominator बदलतो. कारण rate स्वतः बदलत असल्याने excess returnsची standard deviation आणि raw returnsची standard deviation वेगळी होते.
एकच fixed rate वापरल्याची किंमत
सामान्य shortcut म्हणजे current bill yield घेऊन historyतील प्रत्येक periodमधून तो वजा करणे. खालील panelमध्ये एकाच अंतिम तारखेला संपणाऱ्या five windowsवर Sharpe ratio दोन प्रकारे काढला आहे. एकदा matched monthly seriesच्या तुलनेत आणि एकदा windowच्या शेवटी लागू असलेल्या bill yieldच्या तुलनेत.
प्रत्येक आकड्यामागील अचूक 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 windowमध्ये दोन readings 0.07ने वेगळे येतात. Twelve monthsमध्ये fixed rateला त्या windowच्या स्वतःच्या averageपासून फार दूर जाण्याची संधी नसते. 20-year windowमध्ये हा फरक 0.18 आहे: matched seriesवर 0.49 आणि fixed rateवर 0.32. तुम्ही निवडलेल्या single rate आणि प्रत्यक्षात लागू असलेल्या average rateमधील अंतरानुसार error बदलतो. Window मोठी होत गेली की हे अंतर वाढण्याची शक्यता अधिक असते. त्यावर आधारित पुढील सर्व calculationsमध्ये हा परिणाम दिसतो. volatility targeting आणि position sizing अशाच inputsवर चालते.
Currency trap
एका currencyमध्ये मिळणाऱ्या strategyचे मूल्यमापन दुसऱ्या currencyच्या billच्या तुलनेत केल्यास मिळणाऱ्या आकड्याचा अर्थ कोणत्याही currencyमध्ये स्पष्ट राहत नाही. एका currencyमध्येच excess return मोजा: euro returnsच्या तुलनेत euro bill आणि yen returnsच्या तुलनेत yen bill. Hedged strategiesमध्ये आणखी एक trap असतो. Currency hedgeची किंमत forwardवर आधारित असते. Forward points हे दोन्ही currenciesमधील interest rate differentialच्या जवळ असतात. त्यामुळे hedged foreign returnमध्ये domestic rateचा काही भाग आधीच समाविष्ट असतो. त्यावर foreign bill वजा केल्यास तोच rate दोनदा वजा होतो. Rateच्या शेजारी currency स्पष्टपणे लिहिल्यास ही संदिग्धता दूर होते.
Ratioसोबत rateही प्रकाशित करा
Risk-free source आणि frequency न सांगता प्रकाशित केलेला Sharpe ratio कोणीही तपासू शकत नाही. एकाच return streamवर दोन desks वेगवेगळ्या rate series आणि conversion conventions वापरून 0.8 आणि 1.1 काढू शकतात आणि दोन्ही बरोबर असू शकतात. त्या आकड्यासोबत चार गोष्टी द्या: rate कोणत्या instrumentमधून घेतला, त्याची frequency, conversion convention आणि अचूक window. यामुळे वाचक audit करू शकतो असा आकडा आणि केवळ विश्वास ठेवावा लागणारा आकडा यांतील फरक स्पष्ट होतो.
Data notes आणि reproducibility
प्रत्येक panelमधील rate series हा daily Treasury yield curveमधील three-month Treasury bill आहे. तो प्रत्येक calendar monthमध्ये average करून annual quoteच्या one plus valueचा twelfth root घेऊन monthly rateमध्ये रूपांतरित केला आहे. Returns हे SPYचे month-end closes आहेत. ते price return आहेत आणि dividends वगळले आहेत. Ratiosमध्ये monthly excess returnsची sample standard deviation आणि annualizationसाठी square root of twelve वापरले आहे. शेवटचे दोन panels समान तारखेला संपणारे windows वापरतात. Fixed-rate columnमध्ये त्या windowच्या अंतिम महिन्यातील average bill quote घेतला आहे. वरील मजकुरातील प्रत्येक figure त्याच्या शेजारील panelमधून घेतला आहे.
वारंवार विचारले जाणारे प्रश्न
Sharpe ratioमध्ये कोणता risk-free rate वापरावा?
Returns ज्या currencyमध्ये आहेत त्याच currencyमधील short government bill वापरा आणि त्याचे returnsच्या frequencyशी जुळणाऱ्या frequencyमध्ये रूपांतर करा. Monthly USD returnsसाठी one-month किंवा three-month Treasury bill वापरता येतो. Longer maturitiesमध्ये measurement periodदरम्यान price risk असतो. त्यामुळे त्या risk-free legसाठी योग्य ठरत नाहीत.
Long return historyमधून आजचा Treasury bill yield वजा करू शकतो का?
ही प्रकाशित Sharpe ratiosमधील सर्वात सामान्य चूक आहे. वरील 20-year windowमध्ये fixed end-of-window rate आणि matched monthly series एकाच returnsवर 0.18ने वेगवेगळी readings देतात.
वजा करण्यापूर्वी risk-free rateचे annualization करावे का?
नाही. Annual bill quoteचे returnsच्या frequencyमध्ये रूपांतर करा, प्रत्येक periodसाठी तो वजा करा आणि शेवटी excess seriesचे एकदाच annualization करा. प्रत्येक legचे स्वतंत्र annualization करून नंतर subtraction केल्यास answerमध्ये cross term राहतो.
Risk-free rate Sharpe ratioमध्ये किती बदल घडवतो?
साधारणतः rateमधील बदलाला annualized volatilityने भागल्याएवढा. 15% annualized volatility असलेल्या काल्पनिक strategyमध्ये assumed rateमधील 4% फरक ratioमध्ये सुमारे 0.27चा बदल घडवतो. सामान्य track record आणि विशेष मानल्या जाणाऱ्या track recordमधील अंतर एवढेच असू शकते.
Arithmetic आणि geometric annualizationमध्ये काय फरक आहे?
Arithmeticमध्ये average period excessला वर्षातील periodsच्या संख्येने गुणले जाते. Geometricमध्ये periodsचे compounding करून cumulative result पुन्हा निर्माण करणारा constant rate काढला जातो. प्रति period geometric figure हा arithmetic figureइतका किंवा त्यापेक्षा कमी असतो. Volatility वाढल्यावर दोघांतील अंतर वाढते.
येथील प्रत्येक panelसोबत तो तयार करणारा SQL दिला आहे. त्यामुळे rate series आणि window दोन्ही स्पष्ट दिसतात. दुसऱ्या tickerवर किंवा historyच्या दुसऱ्या कालावधीवर हीच रचना वापरायची असल्यास Strasmore terminalवर plain Englishमध्ये विनंती करा.