Stopa wolna od ryzyka we wskaźniku Sharpe’a
Analiza wpływu zmienności stopy wolnej od ryzyka na wskaźnik Sharpe’a. Wyjaśniamy jak poprawnie dopasować rentowność obligacji skarbowych do częstotliwości stóp zwrotu portfela.
Stopa wolna od ryzyka w wskaźniku Sharpe’a to stopa zwrotu, którą można było uzyskać w tym samym okresie bez podejmowania ryzyka, które jest oceniane. Jest to szereg czasowy, z jednym odczytem na okres, wyrażony w walucie stóp zwrotu. Należy dopasować jego częstotliwość do częstotliwości stóp zwrotu i odejmować go okres po okresie. Urocznienie (annualizacja) następuje dopiero na samym końcu.
Pominięcie tej procedury jest najczęstszym błędem w publikowanych wskaźnikach Sharpe’a. Przyjęcie jednej wartości z dwudziestoletniej historii stóp zwrotu, zazwyczaj bieżącej rentowności obligacji skarbowych (Treasury bill), sprawia, że rok 2009 jest oceniany według tej samej poprzeczki co rok 2024. Nasz przewodnik po wskaźniku Sharpe’a omawia, co mierzy ten wskaźnik. Niniejsza strona opisuje dane wejściowe, których prawie nikt nie dokumentuje.
Stopa wolna od ryzyka nie jest stała
Wskaźnik Sharpe’a mierzony w okresie dwudziestu lat obejmuje historię zmiennych stóp procentowych. Poniższy panel przedstawia trzymiesięczne obligacje skarbowe, sprowadzając każdy rok kalendarzowy do średniej oraz zakresu wahań.
Dokładny kod SQL dla każdej liczby
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 yearRoczna średnia wyniosła 3.22% w 2005 oraz 3.74% w 2026, w ciągu 22 lat kalendarzowych. Kluczowy jest przebieg zmian między tymi dwoma odczytami. Linia spada do minimum, utrzymuje się tam przez większość dekady, a następnie ponownie rośnie. Kolumny wartości minimalnych i maksymalnych pokazują, jak bardzo stopa zmieniała się w ciągu pojedynczych lat, dlatego nawet roczny wskaźnik Sharpe’a wymaga dopasowanego szeregu danych, a nie pojedynczego notowania.
Która stopa wolna od ryzyka powinna być użyta we wskaźniku Sharpe’a
O wyborze decydują cztery właściwości.
- Krótki termin zapadalności. Stopa musi być niemal pewna w jednym okresie pomiarowym. Trzymiesięczna obligacja skarbowe nadaje się do obliczeń miesięcznych. Obligacja dziesięcioletnia nie, ponieważ jej cena zmienia się w trakcie miesiąca, który jest mierzony.
- Waluta stopy zwrotu. Strategia denominowana w EUR jest oceniana względem obligacji skarbowych w EUR.
- Częstotliwość stopy zwrotu. Rentowności obligacji są podawane jako stopy roczne, a kwotowanie roczne musi zostać przeliczone przed odjęciem od stopy zwrotu miesięcznej.
- Porównywalne definicje stóp zwrotu po obu stronach. Rentowność obligacji to jej całkowity zwrot, więc stopa zwrotu strategii wykluczająca dywidendy nie jest mierzona na tych samych zasadach. Stopa zwrotu z ceny a całkowita stopa zwrotu omawia tę różnicę.
W konwersji z punktu trzeciego stosuje się dwie konwencje. Proste dzielenie dzieli kwotowanie roczne przez dwanaście. Procent składany wykorzystuje pierwiastek dwunastego stopnia z sumy jedności i stopy rocznej. Dla hipotetycznej obligacji o rentowności 5% daje to odpowiednio 0,4167% i 0,4074% w skali miesiąca – różnica około jednego punktu bazowego, która powtarza się w każdym miesiącu próby. Panele tutaj stosują procent składany. Jeśli rentowności obligacji interesują inwestora jako lokata, a nie jako poprzeczka, stopa dywidendy a rentowność obligacji skarbowych oraz gdzie lokować wolną gotówkę omawiają to zagadnienie.
Jak zbudować szereg miesięcznych stóp zwrotu nadmiarowego
Konstrukcja jest mechaniczna: należy przyjąć ostatni kurs zamknięcia każdego miesiąca, obliczyć miesięczną stopę zwrotu, przeliczyć miesięczne kwotowanie obligacji na stopę miesięczną, a następnie odjąć. Wynikiem jest szereg stóp zwrotu nadmiarowego, jedna liczba na miesiąc. Jak mierzone są miesięczne stopy zwrotu szczegółowo omawia składnik stopy zwrotu.
Dokładny kod SQL dla każdej liczby
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.mSą to kursy zamknięcia SPY, więc kolumna stopy zwrotu to stopa zwrotu z ceny bez uwzględnienia dywidend. Kolumna stopy wolnej od ryzyka otwiera się wartością 0.128% dla pierwszego miesiąca i zamyka wartością 0.359%. W zestawieniu z miesięcznymi wahaniami akcji rzędu kilku procent, stopa wolna od ryzyka wygląda jak zaokrąglenie. W ciągu 60 miesięcy odejmowania stanowi ona całą różnicę między dwoma wskaźnikami Sharpe’a, które rzekomo mierzą to samo.
Najpierw odejmij, potem annualizuj
Po zestawieniu szeregów dostępne są dwie kolejności działań, które dają różne wyniki. Najpierw nadmiar: odejmij stopę miesięczną od miesięcznej stopy zwrotu, a następnie annualizuj szereg nadmiarowy. Najpierw annualizacja: skapitalizuj stopy zwrotu do wartości rocznej, skapitalizuj rentowność obligacji do wartości rocznej, a następnie odejmij jedną od drugiej.
Dokładny kod SQL dla każdej liczby
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 yearsW oknie 20-year wynik przy odejmowaniu najpierw wynosi 6.49% rocznie wobec 6.59% przy drugiej kolejności, co daje różnicę 0.099 punktu procentowego. W oknie 1-year te same dwa obliczenia różnią się o 0.814 punktu. Wynik przy annualizacji najpierw jest zawsze wyższy niż przy odejmowaniu najpierw. Rozdziela je wyraz mieszany: kapitalizacja szeregu stóp zwrotu do wartości rocznej obejmuje zarobienie stopy obligacji powyżej samej premii za ryzyko, a późniejsze odjęcie zannualizowanej stopy obligacji nigdy tego elementu nie usuwa. Wyraz mieszany skaluje się wraz z iloczynem dwóch zannualizowanych liczb, więc jest największy, gdy obligacje oferują wysokie rentowności.
Annualizacja ma drugie rozwidlenie. Annualizacja arytmetyczna mnoży średni miesięczny nadmiar przez dwanaście. Annualizacja geometryczna stosuje procent składany: stała stopa roczna, która odtwarza wynik skumulowany. Przyjmijmy hipotetyczny dwuokresowy przebieg +50% a następnie -33,3%, co kończy się dokładnie w punkcie wyjścia. Średnia arytmetyczna wynosi +8,35% na okres, a geometryczna zero. Panele tutaj stosują procent składany. Warto zapamiętać: przy annualizacji arytmetycznej dwunastokrotność średniej stopy zwrotu minus dwunastokrotność średniej stopy obligacji jest algebraicznie tym samym, co dwunastokrotność średniego nadmiaru. Przy tej konwencji kolejność odejmowania nie zmienia licznika. Mianownik nadal się zmienia, ponieważ odchylenie standardowe nadmiarowych stóp zwrotu różni się od odchylenia standardowego surowych stóp zwrotu, gdy sama stopa procentowa ulega zmianie.
Jaki jest koszt stosowania jednej stałej stopy
Powszechnym skrótem jest przyjęcie bieżącej rentowności obligacji i odjęcie jej od każdego okresu w historii. Poniższy panel przedstawia wskaźnik Sharpe’a obliczony na dwa sposoby w pięciu oknach kończących się w tej samej dacie: raz względem dopasowanego szeregu miesięcznego, raz względem rentowności obligacji obowiązującej na koniec okna.
Dokładny kod SQL dla każdej liczby
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 yearsW oknie 1-year oba odczyty różnią się o 0.07. W ciągu dwunastu miesięcy stała stopa ma niewiele miejsca na odchylenie od średniej z okna. W oknie 20-year różnią się o 0.18: 0.49 dla dopasowanego szeregu wobec 0.32 dla stałej stopy. Błąd wynika z odległości między wybraną pojedynczą stopą a średnią stopą, która faktycznie obowiązywała; odległość ta rośnie wraz z wydłużaniem okna. Każda kolejna analiza dziedziczy ten błąd, a targetowanie zmienności i wielkość pozycji opiera się na danych wejściowych dokładnie tego typu.
Pułapka walutowa
Strategia zarabiająca w jednej walucie i oceniana względem obligacji w innej walucie daje wynik, który niewiele znaczy w obu przypadkach. Nadmiarową stopę zwrotu należy obliczać wewnątrz jednej waluty: stopy zwrotu w EUR względem obligacji w EUR, stopy zwrotu w JPY względem obligacji w JPY. Strategie zabezpieczone (hedged) niosą drugą pułapkę. Zabezpieczenie walutowe jest wyceniane na podstawie kontraktów terminowych (forward), a punkty forward zależą od różnic stóp procentowych między dwiema walutami, co już umieszcza część krajowej stopy procentowej wewnątrz zabezpieczonej zagranicznej stopy zwrotu. Odjęcie zagranicznej obligacji dodatkowo powoduje dwukrotne obciążenie tą samą stopą. Należy podać walutę obok stopy, aby wyeliminować niejednoznaczność.
Publikuj stopę obok wskaźnika
Wskaźnika Sharpe’a podanego bez źródła stopy wolnej od ryzyka i jej częstotliwości nie można zweryfikować. Dwa zespoły mogą obliczyć 0,8 i 1,1 z tego samego strumienia stóp zwrotu i oba mogą mieć rację, pracując na różnych szeregach stóp i różnych konwencjach konwersji. Cztery elementy powinny towarzyszyć liczbie: instrument, z którego pochodzi stopa, jego częstotliwość, konwencja konwersji oraz dokładny okres. To różnica między liczbą, którą czytelnik może sprawdzić, a liczbą, w którą musi uwierzyć.
Uwagi dotyczące danych i powtarzalności
Szereg stóp w każdym panelu to trzymiesięczne obligacje skarbowe z krzywej rentowności Treasury, uśrednione w każdym miesiącu kalendarzowym, przeliczone na stopę miesięczną jako pierwiastek dwunastego stopnia z sumy jedności i kwotowania rocznego. Stopy zwrotu to kursy zamknięcia SPY na koniec miesiąca, tylko stopa zwrotu z ceny, bez dywidend. Wskaźniki wykorzystują odchylenie standardowe z próby miesięcznych stóp zwrotu nadmiarowego oraz pierwiastek z dwunastu dla annualizacji. Ostatnie dwa panele wykorzystują okna kończące się w tej samej dacie, a kolumna stałej stopy przyjmuje średnie kwotowanie obligacji w ostatnim miesiącu tego okna. Każda liczba w powyższym tekście pochodzi z panelu obok.
FAQ
Jakiej stopy wolnej od ryzyka powinienem użyć we wskaźniku Sharpe’a?
Krótkoterminowej obligacji rządowej w tej samej walucie co stopy zwrotu, przeliczonej na tę samą częstotliwość co stopy zwrotu. Dla miesięcznych stóp zwrotu w USD oznacza to miesięczne lub trzymiesięczne obligacje skarbowe. Dłuższe terminy zapadalności niosą ryzyko cenowe w okresie pomiarowym, co dyskwalifikuje je jako składnik wolny od ryzyka.
Czy mogę odjąć dzisiejszą rentowność obligacji skarbowych od długiej historii stóp zwrotu?
To najczęstszy błąd w publikowanych wskaźnikach Sharpe’a. W oknie 20-year powyżej, stała stopa z końca okna i dopasowany szereg miesięczny dają odczyty różniące się o 0.18 dla tych samych stóp zwrotu.
Czy należy annualizować stopę wolną od ryzyka przed jej odjęciem?
Nie. Przelicz roczne kwotowanie obligacji na częstotliwość stopy zwrotu, odejmij okres po okresie, a następnie annualizuj szereg nadmiarowy dopiero na końcu. Annualizacja każdego składnika osobno i późniejsze odejmowanie pozostawia w wyniku wyraz mieszany.
Jak bardzo stopa wolna od ryzyka zmienia wskaźnik Sharpe’a?
Mniej więcej o zmianę stopy podzieloną przez zannualizowaną zmienność. W hipotetycznej strategii o zannualizowanej zmienności 15%, różnica 4% w założonej stopie zmienia wskaźnik o około 0,27, co stanowi dystans między przeciętnym wynikiem a wybitnym.
Jaka jest różnica między annualizacją arytmetyczną a geometryczną?
Arytmetyczna mnoży średni nadmiar okresowy przez liczbę okresów w roku. Geometryczna kapitalizuje okresy do stałej stopy, która odtwarza wynik skumulowany. W ujęciu okresowym wartość geometryczna jest równa lub niższa od arytmetycznej, a odległość między nimi rośnie wraz ze zmiennością.
Każdy panel zawiera kod SQL, który go wygenerował, więc szereg stóp i okno czasowe są widoczne. Aby przeprowadzić tę samą konstrukcję na innym tickerze lub innym odcinku historii, poproś o to w prostym języku na terminalu Strasmore.