Strasmore Research
నేర్చుకోండి Matt Connorద్వారా Matt Connor

Sharpe నిష్పత్తిలో risk-free rate ఎలా ఎంచుకోవాలి

Sharpe నిష్పత్తిలో risk-free rate కాలానుగుణంగా మారుతుంది. Treasury bill yieldను మీ return frequencyతో ఎలా సరిపోల్చాలో, ఒకే స్థిరమైన rate వల్ల వచ్చే వ్యత్యాసాన్ని తెలుసుకోండి.

Sharpe నిష్పత్తిలో risk-free rate అంటే, మీరు అంచనా వేస్తున్న ప్రమాదాన్ని తీసుకోకుండా అదే కాలవ్యవధిలో పొందగలిగే రాబడి. ఇది ప్రతి కాలానికి ఒక విలువగా ఉండే series. ఆ రాబడి ఏ కరెన్సీలో ఉందో అదే కరెన్సీలో rateను పేర్కొంటారు. దాని frequencyను return frequencyతో సరిపోల్చి, ప్రతి కాలంలో దాన్ని return నుంచి తీసివేయాలి. చివర్లో ఒక్కసారి మాత్రమే annualize చేయాలి.

ఈ విధానాన్ని పాటించకపోవడమే ప్రచురితమైన Sharpe నిష్పత్తుల్లో ఎక్కువ తప్పులకు కారణం. ఇరవై సంవత్సరాల return history నుంచి ఒకే సంఖ్యను తీసుకుని—సాధారణంగా ఆ వారంలో Treasury bill ఇచ్చే రాబడిని—ప్రతి కాలానికి వర్తింపజేస్తే, 2009కు మరియు 2024కు ఒకే hurdle rate విధించినట్టవుతుంది. Sharpe నిష్పత్తిపై మా మార్గదర్శకం ఈ నిష్పత్తి ఏమి కొలుస్తుందో వివరిస్తుంది. ఈ పేజీ మాత్రం దాదాపు ఎవరూ నమోదు చేయని inputపై దృష్టి పెడుతుంది.

Risk-free rate స్థిరమైనది కాదు

ఇరవై సంవత్సరాలపై కొలిచిన Sharpe నిష్పత్తి మొత్తం rate historyని కలిగి ఉంటుంది. దిగువ panelలో three-month Treasury billను తీసుకుని, ప్రతి calendar yearను సగటు మరియు దాని చుట్టూ ఉన్న పరిధిగా చూపించాం.

క్వెరీక్యాలెండర్ సంవత్సరం వారీగా మూడు నెలల Treasury yield
ప్రతి సంఖ్య వెనుక ఉన్న ఖచ్చితమైన 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 calendar years‌కు సంబంధించినవి. ఆ రెండు readings మధ్య rate ఎలా మారిందన్నదే ముఖ్యం. రేటు కనిష్ఠ స్థాయికి పడిపోయి, దశాబ్దంలో ఎక్కువ భాగం అక్కడే ఉండి, తర్వాత మళ్లీ పెరిగింది. Low, high columns ఒకే సంవత్సరంలో rate ఎంత దూరం ప్రయాణించిందో చూపిస్తాయి. అందుకే ఒక సంవత్సరపు Sharpe నిష్పత్తికైనా ఒకే quote కంటే సరిపోలిన series అవసరం.

Sharpe నిష్పత్తిలో ఏ risk-free rateను ఉపయోగించాలి

ఎంపికను నాలుగు లక్షణాలు నిర్ణయిస్తాయి.

  1. తక్కువ maturity. ఒక measurement periodలో rate దాదాపు ఖచ్చితంగా ఉండాలి. నెలవారీ లెక్కలకు three-month bill సరిపోతుంది. Ten-year note సరిపోదు, ఎందుకంటే మీరు కొలుస్తున్న నెలలో దాని ధర మారుతుంది.
  2. Return ఉన్న అదే కరెన్సీ. Euro-denominated strategyను euro billతో అంచనా వేయాలి.
  3. Return ఉన్న అదే frequency. Bill yieldsను annual ratesగా పేర్కొంటారు. కాబట్టి annual quoteను monthly returnకు వర్తింపజేయడానికి ముందు monthly rateగా మార్చాలి.
  4. రెండు వైపులా సమానమైన return నిర్వచనాలు. Bill yield దాని మొత్తం return. కాబట్టి dividendsను మినహాయించిన strategy returnను అదే ప్రాతిపదికన కొలవలేం. Price return మరియు total return ఈ తేడాను వివరిస్తుంది.

మూడో అంశంలోని conversionకు ప్రస్తుతం రెండు విధానాలు ఉన్నాయి. Simple divisionలో annual quoteను పన్నెండుతో భాగిస్తారు. Compoundingలో annual rateకు ఒకటి కలిపి, దాని twelfth root తీసుకుంటారు. ఊహాత్మకంగా bill rate 5% అయితే, ఈ రెండు విధానాలు నెలకు వరుసగా 0.4167% మరియు 0.4074% ఇస్తాయి. దాదాపు ఒక basis point తేడా ప్రతి నెలా sampleలో పునరావృతమవుతుంది. ఇక్కడి panels compoundingను ఉపయోగిస్తాయి. Bill yieldను hurdleగా కాకుండా holdingపై వచ్చే వడ్డీగా మీరు పరిశీలిస్తే, డివిడెండ్ yield మరియు Treasury yields మధ్య తేడా మరియు వినియోగంలో లేని నగదును ఎక్కడ ఉంచాలి ఆ అంశాన్ని వివరిస్తాయి.

నెలవారీ excess return seriesను ఎలా నిర్మించాలి

నిర్మాణం యాంత్రికమైనదే: ప్రతి నెల చివరి closeను తీసుకోవాలి, ఆ నెల returnను లెక్కించాలి, ఆ నెల bill quoteను monthly rateగా మార్చాలి, తర్వాత దాన్ని return నుంచి తీసివేయాలి. ఫలితంగా ప్రతి నెలకు ఒక విలువ ఉండే excess return series వస్తుంది. నెలవారీ returnsను ఎలా కొలవాలి return భాగాన్ని వివరంగా వివరిస్తుంది.

క్వెరీనెలవారీ రాబడి, నెలవారీ risk-free రేటు మరియు అదనపు రాబడి, 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 closes. అందువల్ల return columnలో dividends మినహాయించిన price return ఉంటుంది. చూపిస్తున్న మొదటి నెలలో risk-free column 0.128%తో ప్రారంభమై, 0.359% వద్ద ముగుస్తుంది. కొన్ని శాతం మేరకు మారే equity months పక్కన risk-free strip roundingలా కనిపిస్తుంది. అయితే 60 నెలల subtractionలో, ఒకే విషయాన్ని కొలుస్తున్నట్టు చెప్పుకునే రెండు Sharpe నిష్పత్తుల మధ్య మొత్తం తేడాను ఇదే నిర్ణయిస్తుంది.

ముందుగా subtract చేసి, తర్వాత annualize చేయాలి

Seriesలను సరిపోల్చిన తర్వాత operationsకు రెండు క్రమాలు అందుబాటులో ఉంటాయి. అవి ఒకే ఫలితాన్ని ఇవ్వవు. ముందుగా excess: monthly return నుంచి monthly rateను తీసివేసి, తర్వాత excess seriesను annualize చేయాలి. ముందుగా annualize: returnsను annual figureగా compound చేసి, billను annual figureగా compound చేసి, ఆ తర్వాత ఒకదాన్ని మరొకటి నుంచి తీసివేయాలి.

క్వెరీవార్షికీకరించిన risk premium: నెలవారీగా తీసివేయడం లేదా ముందుగా ప్రతి భాగాన్ని వార్షికీకరించడం
ప్రతి సంఖ్య వెనుక ఉన్న ఖచ్చితమైన 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 windowలో excess-first ఫలితం సంవత్సరానికి 6.49%. మరో క్రమంలో అది 6.59%. ఈ రెండింటి మధ్య తేడా 0.099 percentage points. 1-year windowలోనూ రెండు computations మధ్య తేడా 0.814 points. ఇక్కడి ప్రతి windowలో annualize-first figure, excess-first figure కంటే ఎక్కువగా ఉంటుంది. ఈ తేడాకు cross term కారణం. Return seriesను annual numberగా compound చేసినప్పుడు, risk premiumపై కూడా bill rate ద్వారా వచ్చే earning చేరుతుంది. తర్వాత annualized billను తీసివేసినప్పుడు ఆ భాగం తిరిగి తొలగదు. ఈ cross term రెండు annualized numbers గుణితంపై ఆధారపడి ఉంటుంది. అందుకే bill rates ఎక్కువగా ఉన్నప్పుడు తేడా విస్తృతంగా ఉంటుంది.

Annualizingలో మరో విభజన ఉంది. Arithmetic annualizationలో average monthly excessను పన్నెండుతో గుణిస్తారు. Geometric annualizationలో compounding చేస్తారు. అంటే cumulative resultను పునరుత్పత్తి చేసే స్థిరమైన annual rateను కనుగొంటారు. ఊహాత్మకంగా రెండు periodsలో మొదట +50%, తర్వాత -33.3% వచ్చినా, చివరికి ప్రారంభ స్థాయికే తిరిగి వస్తుంది. Arithmetic average ప్రతి periodకు +8.35%, geometric average సున్నా. ఇక్కడి panels compoundingను ఉపయోగిస్తాయి. గుర్తుంచుకోవాల్సిన ఒక footnote: arithmetic annualizationలో twelve times the mean return minus twelve times the mean bill rate, algebraically, twelve times the mean excessతో సమానం. ఈ conventionలో subtraction క్రమం numeratorను మార్చదు. అయితే denominator మారుతుంది. Rate స్వయంగా మారుతున్నప్పుడు excess returns standard deviation, raw returns standard deviationతో ఇక సమానంగా ఉండదు.

ఒకే fixed rate వల్ల ఫలితంపై పడే ప్రభావం

సాధారణ shortcutగా ప్రస్తుత bill yieldను తీసుకుని historyలోని ప్రతి period నుంచి దాన్ని తీసివేస్తారు. ఒకే తేదీతో ముగిసే ఐదు windowsలో Sharpe నిష్పత్తిని దిగువ panel రెండు విధాలుగా లెక్కిస్తుంది. ఒకసారి matched monthly seriesతో, మరోసారి window ముగిసే సమయానికి అమల్లో ఉన్న bill yieldతో.

క్వెరీఒక స్థిర రేటుతో సరిపోల్చిన rate series పై 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 windowలో రెండు readings మధ్య తేడా 0.07. పన్నెండు నెలల windowలో fixed rate, ఆ window సగటు నుంచి ఎక్కువగా దూరం వెళ్లే అవకాశం తక్కువ. 20-year windowలో అవి 0.18 తేడాతో ఉన్నాయి: matched seriesపై 0.49, fixed rateపై 0.32. మీరు ఎంచుకున్న single rateకు మరియు వాస్తవంగా అమల్లో ఉన్న average rateకు మధ్య దూరాన్ని error అనుసరిస్తుంది. Window పొడవు పెరిగే కొద్దీ ఆ దూరం పెరగడానికి ఎక్కువ అవకాశం ఉంటుంది. దాని తర్వాతి అన్ని లెక్కలపై ఈ ప్రభావం పడుతుంది. volatility targeting మరియు position sizing కూడా ఇలాంటి inputsపైనే ఆధారపడతాయి.

కరెన్సీ ఉచ్చు

ఒక కరెన్సీలో ఆదాయం పొందే strategyను మరో కరెన్సీ billతో అంచనా వేస్తే, ఆ సంఖ్యకు ఏ కరెన్సీలోనూ సరైన అర్థం ఉండదు. Excess returnను ఒకే కరెన్సీలో లెక్కించాలి: euro returnsకు euro bill, yen returnsకు yen bill. Hedged strategiesలో మరో సమస్య ఉంది. Currency hedge forwardపై ఆధారపడి ధర నిర్ణయించబడుతుంది. Forward points రెండు కరెన్సీల మధ్య interest rate differentialకు సమీపంగా ఉంటాయి. అందువల్ల hedged foreign returnలో domestic rateలోని కొంత భాగం ఇప్పటికే ఉంటుంది. దాని పైన foreign billను తీసివేస్తే, అదే rateను రెండుసార్లు లెక్కించినట్టవుతుంది. Rate పక్కన కరెన్సీని పేర్కొంటే ఈ ambiguity తొలగిపోతుంది.

Ratioతో పాటు rateను కూడా ప్రచురించాలి

Risk-free source, frequency లేకుండా పేర్కొన్న Sharpe నిష్పత్తిని ఎవరూ తనిఖీ చేయలేరు. ఒకే return stream నుంచి రెండు desks 0.8 మరియు 1.1ను లెక్కించినా, వేర్వేరు rate seriesలు మరియు conversion conventions ఉపయోగించి ఉంటే రెండూ సరైనవే కావచ్చు. ఆ సంఖ్యతో పాటు నాలుగు అంశాలు ఉండాలి: rate వచ్చిన instrument, దాని frequency, conversion convention, ఖచ్చితమైన window. పాఠకుడు audit చేయగలిగే సంఖ్యకు, కేవలం నమ్మాల్సిన సంఖ్యకు మధ్య ఇదే తేడా.

డేటా మరియు పునరుత్పాదకతపై గమనికలు

ప్రతి panelలోని rate series daily Treasury yield curve నుంచి తీసుకున్న three-month Treasury bill. ప్రతి calendar monthలో దాని సగటును తీసుకుని, annual quoteకు ఒకటి కలిపి 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 తీసుకున్నాం. పై proseలోని ప్రతి figure దాని పక్కన ఉన్న panel నుంచి వచ్చింది.

తరచుగా అడిగే ప్రశ్నలు

Sharpe నిష్పత్తిలో ఏ risk-free rateను ఉపయోగించాలి?

Returns ఉన్న అదే కరెన్సీలోని short-term government billను ఉపయోగించాలి. దాన్ని returns frequencyకి మార్చాలి. Monthly USD returnsకు one-month లేదా three-month Treasury bill సరిపోతుంది. Longer maturities measurement periodలో price riskను కలిగి ఉంటాయి. అందువల్ల అవి risk-free legగా సరిపోవు.

దీర్ఘకాలిక return history నుంచి ఈరోజు Treasury bill yieldను తీసివేయవచ్చా?

ఇది ప్రచురితమైన Sharpe నిష్పత్తుల్లో అత్యంత సాధారణమైన తప్పు. పై 20-year windowలో, fixed end-of-window rate మరియు matched monthly series ఒకే returnsపై 0.18 తేడా ఉన్న readingsను ఇస్తాయి.

Risk-free rateను subtract చేయడానికి ముందు annualize చేయాలా?

లేదు. Annual bill quoteను return frequencyకి మార్చి, ప్రతి periodలో తీసివేయాలి. తర్వాత చివర్లో excess seriesను ఒక్కసారి annualize చేయాలి. ప్రతి legను విడిగా annualize చేసి, తర్వాత subtract చేస్తే cross term ఫలితంలో మిగిలిపోతుంది.

Risk-free rate Sharpe నిష్పత్తిని ఎంతవరకు మార్చగలదు?

సుమారుగా rateలోని మార్పును annualized volatilityతో భాగించినంత మేరకు. ఊహాత్మకంగా ఒక strategy annualized volatility 15%తో నడుస్తుందని అనుకుందాం. Assumed rateలో 4% తేడా ratioను సుమారు 0.27 మార్చుతుంది. సాధారణ track recordకు, ప్రశంసలు పొందిన track recordకు మధ్య ఉండే దూరం అంతే కావచ్చు.

Arithmetic మరియు geometric annualization మధ్య తేడా ఏమిటి?

Arithmetic విధానంలో average period excessను సంవత్సరంలోని periods సంఖ్యతో గుణిస్తారు. Geometric విధానంలో periodsను compound చేసి, cumulative resultను పునరుత్పత్తి చేసే స్థిరమైన rateను కనుగొంటారు. ప్రతి periodలో geometric figure, arithmetic figureకు సమానంగా లేదా దాని కంటే తక్కువగా ఉంటుంది. Volatility పెరిగే కొద్దీ వాటి మధ్య దూరం పెరుగుతుంది.


ఇక్కడి ప్రతి panelను రూపొందించిన SQLను కలిగి ఉంది. అందువల్ల rate series మరియు window రెండూ కనిపిస్తాయి. మరో ticker లేదా historyలోని మరో కాలవ్యవధిపై ఇదే constructionను అమలు చేయాలంటే, Strasmore terminalలో plain Englishలో కోరండి.

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