Sharpe oranında risksiz faiz oranı hesaplama
Sharpe oranında kullanılan risksiz faiz oranı zamanla değişir. Hazine bonosu getirisini getiri frekansıyla eşleştirme yöntemleri ve sabit oran kullanımının hatalı sonuçları.
Sharpe oranındaki risksiz faiz oranı, değerlendirdiğiniz riski almadan aynı dönem boyunca elde edebileceğiniz getiridir. Bu, getiri para birimi cinsinden ifade edilen ve dönem başına bir okuma içeren bir seridir. Frekansını getiri frekansıyla eşleştirin ve dönem dönem çıkarın. Yıllıklandırmayı yalnızca en sonda, bir kez yapın.
Yayınlanan çoğu Sharpe oranındaki hata, bu prosedürün atlanmasından kaynaklanır. Yirmi yıllık bir getiri geçmişinin tepesinden tek bir rakam almak —genellikle o hafta bir Hazine bonosunun (Treasury bill) ödediği faiz— 2009 yılına da 2024 yılıyla aynı engeli yüklemek demektir. Sharpe oranına dair rehberimiz, oranın neyi ölçtüğünü ele almaktadır. Bu sayfa ise neredeyse hiç kimsenin belgelemediği girdi verilerini kapsamaktadır.
Risksiz faiz oranı sabit değildir
Yirmi yıl boyunca ölçülen bir Sharpe oranı, bir faiz oranı geçmişini kapsar. Aşağıdaki panel, üç aylık Hazine bonosunu alır ve her takvim yılını bir ortalamaya ve bu ortalamanın etrafındaki aralığa indirger.
Her verinin arkasındaki tam 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 yearYıllık ortalama, 22 takvim yılı boyunca 2005 döneminde 3.22%, 2026 döneminde ise 3.74% seviyesinde gerçekleşmiştir. Önemli olan, bu iki okuma arasındaki yoldur. Çizgi tabana iner, on yılın büyük bir kısmında orada kalır, ardından tekrar tırmanır. Düşük ve yüksek sütunları, faizin tek bir yıl içinde ne kadar hareket ettiğini gösterir; bu nedenle bir yıllık Sharpe oranı bile tek bir alıntı yerine eşleştirilmiş bir seri gerektirir.
Sharpe oranına hangi risksiz faiz oranı dahil edilmelidir
Seçimi dört özellik belirler.
- Kısa vade. Faiz oranı, bir ölçüm dönemi boyunca neredeyse kesin olmalıdır. Üç aylık bir bono, aylık çalışmalar için uygundur. On yıllık bir tahvil (note) ise ölçüm yaptığınız ay boyunca fiyatı değiştiği için uygun değildir.
- Getirinin kendi para birimi. Euro cinsinden bir strateji, euro cinsi bir bono ile kıyaslanmalıdır.
- Getirinin kendi frekansı. Bono getirileri yıllık oranlar olarak ifade edilir ve yıllık bir alıntının aylık bir getiriye dokunmadan önce dönüştürülmesi gerekir.
- Her iki tarafta karşılaştırılabilir getiri tanımları. Bir bononun getirisi onun toplam getirisidir, bu nedenle temettüleri hariç tutan bir strateji getirisi aynı temelde ölçülmez. Fiyat getirisi ile toplam getiri bu farkı ele alır.
Üçüncü maddedeki dönüşüm için dolaşımda iki gelenek vardır. Basit bölme, yıllık alıntıyı on ikiye böler. Bileşiklendirme ise bir artı yıllık oranın on ikinci dereceden kökünü alır. Varsayımsal yüzde beşlik bir bonoda bunlar ay için yüzde 0,4167 ve yüzde 0,4074 verir; bu, örneklemin her ayında tekrarlanan yaklaşık bir baz puanlık farktır. Buradaki paneller bileşiklendirme kullanır. Bono getirileri sizin için bir engel (hurdle) değil de bir varlık olarak ilgi çekiciyse, temettü getirisi ile Hazine getirileri ve boşta duran nakit nereye park edilir konuları bu alanı kapsar.
Aylık aşırı getiri serisi nasıl oluşturulur
Yapı mekaniktir: Her ayın son kapanışını alın, ayın getirisini oluşturun, o ayın bono alıntısını aylık orana dönüştürün ve ardından çıkarın. Ortaya çıkan şey, ayda bir rakamdan oluşan bir aşırı getiri serisidir. Aylık getiriler nasıl ölçülür, getiri ayağını ayrıntılı olarak ele alır.
Her verinin arkasındaki tam 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.mBunlar SPY kapanışlarıdır, dolayısıyla getiri sütunu temettülerin hariç tutulduğu bir fiyat getirisi serisidir. Risksiz sütun, görünürdeki ilk ay için 0.128% seviyesinde açılır ve 0.359% seviyesinde kapanır. Yüzde birkaç oranında dalgalanan hisse senedi ayları yanında, risksiz şerit yuvarlama hatası gibi görünür. 60 aylık çıkarma işlemi boyunca, aynı şeyi ölçtüğünü iddia eden iki Sharpe oranı arasındaki tüm farkı bu oluşturur.
Önce çıkarın, sonra yıllıklandırın
Seriler hizalandıktan sonra iki işlem sırası mevcuttur ve bunlar birbiriyle uyuşmaz. Önce aşırı getiri: Aylık oranı aylık getiriden çıkarın, ardından aşırı getiri serisini yıllıklandırın. Önce yıllıklandırın: Getirileri yıllık bir rakama bileşiklendirin, bonoyu yıllık bir rakama bileşiklendirin, ardından birini diğerinden çıkarın.
Her verinin arkasındaki tam 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 penceresi üzerinde, önce aşırı getiri yönteminin cevabı yıllık 6.49% iken diğer sıralama için 6.59%'dur; bu, 0.099 yüzde puanlık bir farktır. 1-year penceresinde aynı iki hesaplama 0.814 puan farkla durur. Önce yıllıklandırma rakamı, buradaki her pencerede önce aşırı getiri rakamının üzerinde çıkar. Onları ayıran şey bir çapraz terimdir: Bir getiri serisini yıllık bir sayıya bileşiklendirmek, risk priminin üzerine bono faizini de kazanmayı içerir ve sonrasında yıllıklandırılmış bir bonoyu çıkarmak o parçayı asla geri almaz. Çapraz terim, iki yıllıklandırılmış sayının çarpımıyla ölçeklenir, bu nedenle bonolar iyi getiri sağladığında en geniştir.
Yıllıklandırmanın ikinci bir ayrımı vardır. Aritmetik yıllıklandırma, ortalama aylık aşırı getiriyi on iki ile çarpar. Geometrik yıllıklandırma ise bileşiklendirir: Kümülatif sonucu yeniden üreten sabit yıllık oran. Varsayımsal olarak yüzde elli artış ve ardından yüzde otuz üç virgül üç düşüşten oluşan iki dönemlik bir seriyi ele alın; bu seri başladığı noktada biter. Aritmetik ortalama dönem başına yüzde sekiz virgül otuz beş, geometrik ortalama ise sıfırdır. Buradaki paneller bileşiklendirme kullanır. Bir dipnot: Aritmetik yıllıklandırma altında, ortalama getirinin on iki katı eksi ortalama bono oranının on iki katı, cebirsel olarak ortalama aşırı getirinin on iki katı ile aynıdır. Bu gelenek altında çıkarma sırası payı değiştirmez. Payda ise hareket etmeye devam eder, çünkü faiz oranının kendisi hareket halindeyken aşırı getirilerin standart sapması, ham getirilerin standart sapmasından ayrılır.
Tek bir sabit oranın maliyeti nedir
Yaygın kısa yol, mevcut bono getirisini alıp geçmişteki her dönemden çıkarmaktır. Aşağıdaki panel, aynı tarihte sona eren beş pencere boyunca Sharpe oranını her iki şekilde de çalıştırır: bir kez eşleştirilmiş aylık seriyle, bir kez de pencerenin sonunda yürürlükte olan bono getirisiyle.
Her verinin arkasındaki tam 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 penceresinde iki okuma 0.07 farkla sonuçlanır. On iki ay boyunca sabit oranın pencerenin kendi ortalamasından sapması için çok az alan vardır. 20-year penceresinde ise 0.18 farkla dururlar: Eşleştirilmiş seride 0.49, sabit oranda 0.32. Hata, seçtiğiniz tek oran ile aslında geçerli olan ortalama oran arasındaki mesafeyi takip eder ve pencere uzadıkça bu mesafenin açılma alanı artar. Aşağı yönlü her şey bunu miras alır ve oynaklık hedefleme ve pozisyon boyutlandırma tam olarak bu tür girdilerle çalışır.
Para birimi tuzağı
Bir para biriminde kazanan ve başka bir para biriminin bonosuyla kıyaslanan bir strateji, her iki tarafta da pek bir anlam ifade etmeyen bir sayı üretir. Aşırı getiriyi tek bir para birimi içinde hesaplayın: Euro getirilerini euro bonosuyla, yen getirilerini yen bonosuyla. Hedge edilmiş stratejiler ikinci bir tuzak taşır. Bir kur hedge'i forward üzerinden fiyatlanır ve forward puanları, iki para birimi arasındaki faiz farkına yakındır; bu da yerel faizin bir kısmını zaten hedge edilmiş yabancı getiri içine yerleştirir. Bunun üzerine bir de yabancı bonoyu çıkarmak, aynı faizi iki kez tahsil etmek anlamına gelir. Oranın yanına para birimini yazın, belirsizlik ortadan kalksın.
Oranı, Sharpe oranıyla birlikte yayınlayın
Risksiz kaynak ve frekansı belirtilmeden alıntılanan bir Sharpe oranı, kimse tarafından doğrulanamaz. İki farklı ekip, aynı getiri akışından 0,8 ve 1,1 hesaplayabilir ve farklı faiz serileri ile farklı dönüşüm gelenekleri kullandıkları için her ikisi de haklı olabilir. Sayıyla birlikte dört öğe taşınmalıdır: Oranın geldiği enstrüman, frekansı, dönüşüm geleneği ve tam pencere aralığı. Bir okuyucunun denetleyebileceği bir sayı ile bir okuyucunun inançla kabul etmek zorunda olduğu bir sayı arasındaki fark budur.
Veri notları ve tekrarlanabilirlik
Her paneldeki faiz serisi, günlük Hazine getiri eğrisinden alınan, her takvim ayı içinde ortalaması alınan ve bir artı yıllık alıntının on ikinci dereceden kökü olarak aylık orana dönüştürülen üç aylık Hazine bonosudur. Getiriler SPY ay sonu kapanışlarıdır, sadece fiyat getirisi olup temettüler hariç tutulmuştur. Oranlar, aylık aşırı getirilerin örneklem standart sapmasını ve yıllıklandırma için on ikinin karekökünü kullanır. Son iki panel, ortak bir tarihte sona eren pencereleri kullanır ve sabit oran sütunu, o pencerenin son ayındaki ortalama bono alıntısını alır. Metindeki her rakam, yanındaki panelden gelmektedir.
SSS
Sharpe oranında hangi risksiz faiz oranını kullanmalıyım?
Getirilerle aynı para biriminde olan, getirilerle aynı frekansa dönüştürülmüş kısa vadeli bir devlet bonosu. Aylık USD getirileri için bu, bir aylık veya üç aylık Hazine bonosu anlamına gelir. Daha uzun vadeler, ölçüm dönemi boyunca fiyat riski taşır ve bu da onları risksiz bir ayak olarak diskalifiye eder.
Bugünkü Hazine bonosu getirisini uzun bir getiri geçmişinden çıkarabilir miyim?
Bu, yayınlanan Sharpe oranlarındaki en yaygın hatadır. Yukarıdaki 20-year penceresi üzerinde, sabit bir dönem sonu oranı ve eşleştirilmiş aylık seri, aynı getiriler üzerinde 0.18 farkla sonuçlanan okumalar üretir.
Risksiz faiz oranını çıkarmadan önce yıllıklandırmalı mıyım?
Hayır. Yıllık bono alıntısını getirinin frekansına dönüştürün, dönem dönem çıkarın ve ardından aşırı getiri serisini en sonda bir kez yıllıklandırın. Her ayağı ayrı ayrı yıllıklandırıp sonrasında çıkarmak, cevapta bir çapraz terim bırakır.
Risksiz faiz oranı bir Sharpe oranını ne kadar değiştirir?
Kabaca, orandaki değişimin yıllıklandırılmış oynaklığa bölünmesi kadardır. Yıllık yüzde 15 oynaklıkla çalışan varsayımsal bir stratejide, varsayılan orandaki yüzde 4'lük bir fark, oranı yaklaşık 0,27 değiştirir; bu, sıradan bir performans kaydı ile başarılı bir kayıt arasındaki mesafedir.
Aritmetik ve geometrik yıllıklandırma arasındaki fark nedir?
Aritmetik, ortalama dönem aşırı getirisini bir yıldaki dönem sayısıyla çarpar. Geometrik ise kümülatif sonucu yeniden üreten sabit orana ulaşmak için dönemleri bileşiklendirir. Dönem bazında geometrik rakam, aritmetik rakamın altında veya ona eşittir ve aralarındaki mesafe oynaklıkla birlikte artar.
Buradaki her panel, onu üreten SQL kodunu taşır, böylece faiz serisi ve pencere aralığı görülebilir. Aynı yapıyı başka bir ticker veya başka bir geçmiş dönemi üzerinde çalıştırmak için Strasmore terminalinde bunu düz bir dille talep edin.