Strasmore Research

Sharpe ratio میں risk-free rate کیسے ملائیں؟

Sharpe ratio میں risk-free rate وقت کے ساتھ بدلتی ہے۔ جانیں bill yield کو return frequency سے کیسے ملائیں اور ایک fixed rate جواب کو کیسے متاثر کرتی ہے۔

Sharpe ratio میں risk-free rate وہ return ہے جو اسی مدت کے دوران، زیرِجائزہ risk لیے بغیر حاصل کیا جا سکتا تھا۔ یہ ایک series ہوتی ہے، جس میں ہر period کے لیے ایک reading شامل ہوتی ہے، اور اسے returns کی currency میں quote کیا جاتا ہے۔ اس کی frequency کو return کی frequency کے مطابق رکھیں اور period بہ period اسے منہا کریں۔ Annualization صرف آخر میں ایک مرتبہ کریں۔

زیادہ تر شائع شدہ Sharpe ratios میں غلطی اسی طریقۂ کار کو چھوڑنے سے پیدا ہوتی ہے۔ بیس سالہ return history سے صرف ایک عدد اٹھا لینا، عموماً اس ہفتے Treasury bill کی yield، 2009 پر بھی وہی hurdle عائد کرتا ہے جو 2024 پر۔ Sharpe ratio کے لیے ہماری رہنما تحریر میں بتایا گیا ہے کہ یہ ratio کیا measure کرتا ہے۔ یہ صفحہ اس input کا احاطہ کرتا ہے جسے تقریباً کوئی document نہیں کرتا۔

Risk-free rate مستقل نہیں ہوتی

بیس سال کی مدت میں ناپا گیا Sharpe ratio مختلف rates کی پوری history پر محیط ہوتا ہے۔ ذیل کا panel three-month Treasury bill کو لیتا ہے اور ہر calendar year کو ایک average اور اس کے گرد موجود range میں سمیٹتا ہے۔

استفسار کریںکیلنڈر سال کے لحاظ سے تین ماہ کے Treasury bill کی 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

سالانہ average 3.22% میں 2005 رہی اور 3.74% میں 2026، جبکہ یہ سلسلہ 22 calendar years پر محیط تھا۔ ان دو readings کے درمیان rate کا راستہ اہم ہے۔ line floor تک گر جاتی ہے، تقریباً ایک دہائی تک وہیں رہتی ہے، پھر دوبارہ اوپر چڑھتی ہے۔ low اور high columns دکھاتے ہیں کہ ایک ہی سال کے اندر rate کتنی دور تک گئی۔ اسی لیے one-year Sharpe ratio کے لیے بھی ایک quote کے بجائے matched series درکار ہوتی ہے۔

Sharpe ratio میں کون سی risk-free rate شامل ہونی چاہیے

چار خصوصیات اس انتخاب کا تعین کرتی ہیں۔

  1. مختصر maturity۔ ایک measurement period کے دوران rate تقریباً یقینی ہونی چاہیے۔ ماہانہ analysis کے لیے three-month bill موزوں ہے۔ ten-year note موزوں نہیں، کیونکہ جس ماہ کو آپ measure کر رہے ہیں اس دوران اس کی قیمت حرکت کر سکتی ہے۔
  2. Return کی اپنی currency۔ euro-denominated strategy کو euro bill کے مقابل measure کیا جاتا ہے۔
  3. Return کی اپنی frequency۔ Bill yields annual rates کے طور پر quote ہوتی ہیں، اس لیے monthly return میں شامل کرنے سے پہلے annual quote کو ماہانہ rate میں تبدیل کرنا ضروری ہے۔
  4. دونوں جانب returns کی قابلِ موازنہ definitions۔ Bill کی yield اس کا مکمل return ہوتی ہے، اس لیے dividends کو خارج کرنے والا strategy return یکساں بنیاد پر measure نہیں ہوتا۔ Price return بمقابلہ total return اس فرق کی وضاحت کرتا ہے۔

نکتے تین میں بیان کردہ conversion کے دو طریقے رائج ہیں۔ Simple division annual quote کو بارہ سے تقسیم کرتا ہے۔ Compounding میں one plus annual rate کا twelfth root لیا جاتا ہے۔ فرضی 5% bill پر یہ طریقے ماہ کے لیے بالترتیب 0.4167% اور 0.4074% دیتے ہیں۔ فرق تقریباً ایک basis point ہے، جو sample کے ہر ماہ میں دہرایا جاتا ہے۔ یہاں موجود panels compounding استعمال کرتے ہیں۔ اگر bill yields کو hurdle کے بجائے holding کے طور پر سمجھنا مقصود ہو تو dividend yield بمقابلہ Treasury yields اور غیر استعمال شدہ cash کہاں رکھیں اس موضوع کا احاطہ کرتے ہیں۔

ماہانہ excess return series کیسے بنائیں

اس کی construction mechanical ہے: ہر ماہ کا آخری close لیں، ماہانہ return بنائیں، اس ماہ کی bill quote کو monthly rate میں تبدیل کریں، پھر اسے منہا کریں۔ نتیجے میں excess return series حاصل ہوتی ہے، جس میں ہر ماہ کے لیے ایک number ہوتا ہے۔ ماہانہ returns کیسے measure کیے جاتے ہیں return کے حصے کی تفصیل پیش کرتا ہے۔

استفسار کریںماہانہ return، ماہانہ risk-free rate اور excess، 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 ایک price return ہے جس میں dividends شامل نہیں۔ زیرِمشاہدہ پہلے ماہ کے لیے risk-free column 0.128% سے شروع ہوتا ہے اور 0.359% پر ختم ہوتا ہے۔ Equity months میں کئی فیصد کی تبدیلیوں کے مقابلے میں risk-free strip rounding جیسی دکھائی دیتی ہے۔ لیکن 60 ماہ کی subtraction کے دوران یہی وہ مکمل فرق ہے جو ایک ہی چیز measure کرنے کا دعویٰ کرنے والے دو Sharpe ratios کے درمیان پیدا ہوتا ہے۔

پہلے subtract کریں، پھر annualize

Series کو align کرنے کے بعد operation کی دو ترتیبیں ممکن ہیں، اور دونوں کے نتائج مختلف ہوتے ہیں۔ پہلے excess: monthly return سے monthly rate منہا کریں، پھر excess series کو annualize کریں۔ پہلے annualize: returns کو annual figure میں compound کریں، bill کو annual figure میں compound کریں، پھر ایک کو دوسرے سے منہا کریں۔

استفسار کریںسالانہائزڈ risk premium: ماہانہ منفی کریں، یا پہلے ہر 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 >= '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 answer سالانہ 6.49% ہے، جبکہ دوسری ترتیب کا نتیجہ 6.59% ہے؛ فرق 0.099 percentage points کا ہے۔ 1-year کی window میں یہی دونوں calculations ایک دوسرے سے 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 کے product کے ساتھ بڑھتا ہے، اس لیے bills کی yield بلند ہونے پر یہ فرق سب سے زیادہ ہوتا ہے۔

Annualization کے اندر بھی دو طریقے ہیں۔ Arithmetic annualization average monthly excess کو بارہ سے ضرب دیتی ہے۔ Geometric annualization compounding کرتی ہے: یعنی وہ constant annual rate جو cumulative result کو دوبارہ پیدا کرے۔ فرض کریں دو periods میں پہلے +50% اور پھر -33.3% return حاصل ہو، جس سے portfolio بالکل ابتدائی سطح پر واپس آ جائے۔ Arithmetic average +8.35% فی period ہے، جبکہ geometric average صفر ہے۔ یہاں موجود panels compounding استعمال کرتے ہیں۔ ایک اہم footnote یہ ہے کہ arithmetic annualization کے تحت twelve times mean return minus twelve times mean bill rate، algebraically، twelve times mean excess کے برابر ہے۔ اس convention میں subtraction کی ترتیب numerator کو تبدیل نہیں کرتی۔ تاہم denominator پھر بھی بدلتا ہے، کیونکہ جب rate خود حرکت کر رہی ہو تو excess returns کا standard deviation، raw returns کے standard deviation سے مختلف ہو جاتا ہے۔

ایک fixed rate result کو کتنا بدل دیتی ہے

عام shortcut یہ ہے کہ موجودہ bill yield لے کر history کے ہر period سے اسے منہا کر دیا جائے۔ ذیل کا panel ایک ہی اختتامی تاریخ پر ختم ہونے والی پانچ windows میں Sharpe ratio کو دونوں طریقوں سے calculate کرتا ہے: ایک مرتبہ matched monthly series کے مقابل، اور دوسری مرتبہ window کے اختتام پر نافذ bill yield کے مقابل۔

استفسار کریںایک مقررہ rate کے مقابل matched 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 کا فرق ہے۔ بارہ ماہ کی مدت میں fixed rate کے لیے window کے اپنے average سے بہت دور جانے کی گنجائش کم ہوتی ہے۔ 20-year کی window میں فرق 0.18 ہے: matched series پر 0.49 کے مقابل fixed rate پر 0.32۔ یہ error اس فاصلے کے مطابق بڑھتا ہے جو منتخب کردہ single rate اور حقیقت میں prevailing average rate کے درمیان ہو۔ Window طویل ہونے پر اس فاصلے کے بڑھنے کی گنجائش زیادہ ہوتی ہے۔ اس کے بعد کے تمام نتائج بھی اسی error کو inherit کرتے ہیں، اور volatility targeting اور position sizing بالکل اسی نوعیت کے inputs پر چلتے ہیں۔

Currency trap

جو strategy ایک currency میں return کماتی ہو اور اسے دوسری currency کے bill کے مقابل measure کیا جائے، اس سے حاصل ہونے والا number کسی بھی currency کے لیے بامعنی نہیں رہتا۔ Excess return کو ایک ہی currency کے اندر calculate کریں: euro returns کے مقابل euro bill اور yen returns کے مقابل yen bill۔ Hedged strategies میں ایک دوسرا trap بھی ہوتا ہے۔ Currency hedge کی pricing forward کے ذریعے ہوتی ہے، اور forward points دونوں currencies کے درمیان interest rate differential کے قریب ہوتے ہیں۔ اس طرح domestic rate کا ایک حصہ پہلے ہی hedged foreign return میں شامل ہوتا ہے۔ اس کے اوپر foreign bill منہا کرنا ایک ہی rate کو دو مرتبہ charge کرتا ہے۔ Rate کے ساتھ currency کا نام درج کریں، تو ambiguity ختم ہو جاتی ہے۔

Rate کو ratio کے ساتھ publish کریں

Risk-free source اور frequency کے بغیر quote کیا گیا Sharpe ratio کوئی verify نہیں کر سکتا۔ دو desks ایک ہی return stream سے 0.8 اور 1.1 calculate کر سکتے ہیں، اور دونوں درست ہو سکتے ہیں، اگر وہ مختلف rate series اور conversion conventions استعمال کر رہے ہوں۔ Number کے ساتھ چار items شامل ہونے چاہییں: rate کس instrument سے لی گئی، اس کی frequency، conversion convention، اور exact window۔ یہی فرق ہے اس number میں جسے reader audit کر سکتا ہے، اور اس number میں جسے reader کو محض یقین کی بنیاد پر قبول کرنا پڑتا ہے۔

Data notes اور reproducibility

ہر panel میں rate series daily Treasury yield curve سے حاصل کردہ three-month Treasury bill ہے۔ اسے ہر calendar month کے اندر average کیا گیا اور annual quote کے one plus annual rate کے 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 سے حاصل کی گئی ہے۔

FAQ

Sharpe ratio میں کون سی risk-free rate استعمال کرنی چاہیے؟

Returns کی currency میں ایک short government bill، جسے returns کی frequency کے مطابق convert کیا گیا ہو۔ Monthly USD returns کے لیے اس کا مطلب one-month یا three-month Treasury bill ہے۔ Longer maturities measurement period کے دوران price risk رکھتی ہیں، اس لیے risk-free leg کے طور پر موزوں نہیں۔

کیا میں طویل return history سے آج کی Treasury bill yield منہا کر سکتا ہوں؟

یہ published Sharpe ratios میں سب سے عام غلطی ہے۔ اوپر 20-year window میں fixed end-of-window rate اور matched monthly series، بالکل انہی returns پر، 0.18 کے فرق سے readings دیتی ہیں۔

کیا subtraction سے پہلے risk-free rate کو annualize کرنا چاہیے؟

نہیں۔ Annual bill quote کو return کی frequency میں convert کریں، period بہ period اسے منہا کریں، پھر آخر میں excess series کو ایک مرتبہ annualize کریں۔ ہر leg کو الگ الگ annualize کر کے بعد میں منہا کرنے سے answer میں ایک cross term باقی رہ جاتا ہے۔

Risk-free rate Sharpe ratio کو کتنا بدلتی ہے؟

تقریباً rate میں تبدیلی کو annualized volatility سے تقسیم کرنے کے برابر۔ فرضی strategy میں annualized volatility 15% ہو تو assumed rate میں 4% کا فرق ratio کو تقریباً 0.27 بدل دیتا ہے۔ یہ ایک معمولی track record اور نمایاں طور پر سراہا جانے والے track record کے درمیان فاصلہ ہو سکتا ہے۔

Arithmetic اور geometric annualization میں کیا فرق ہے؟

Arithmetic سال کے periods کی تعداد کے مطابق average period excess کو multiply کرتی ہے۔ Geometric periods کو compound کر کے وہ constant rate نکالتی ہے جو cumulative result کو دوبارہ پیدا کرے۔ فی 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