Безризикова ставка в коефіцієнті Sharpe
Безризикова ставка змінюється з часом. Як узгодити дохідність Treasury bill із частотою дохідності та чим спотворює результат одна фіксована ставка.
Безризикова ставка в коефіцієнті Sharpe — це дохідність, яку можна було б отримати за той самий період без ризику, який ви оцінюєте. Це часовий ряд: одне значення на кожен період, виражене у валюті дохідності. Його частота має відповідати частоті дохідності, а віднімати ставку потрібно окремо за кожен період. Річну дохідність розраховуйте лише наприкінці.
Саме пропуск цієї процедури найчастіше робить опубліковані коефіцієнти Sharpe помилковими. Якщо взяти одне значення на початку двадцятирічної історії дохідності — зазвичай те, скільки Treasury bill платить цього тижня, — то для 2009 року буде встановлено такий самий поріг, як і для 2024 року. Наш посібник із коефіцієнта Sharpe пояснює, що вимірює цей коефіцієнт. На цій сторінці розглянуто вхідний показник, який майже ніхто не документує.
Безризикова ставка не є сталою
Коефіцієнт Sharpe, розрахований за двадцять років, охоплює історію ставок. На панелі нижче наведено тримісячний Treasury bill: кожен календарний рік зведено до середнього значення та діапазону навколо нього.
Точний 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Середньорічне значення становило 3.22% у 2005 та 3.74% у 2026 — за 22 календарних років. Важливим є шлях між цими двома значеннями. Лінія опускається до мінімуму, залишається там більшу частину десятиліття, а потім знову зростає. Колонки з мінімальним і максимальним значеннями показують, наскільки ставка змінювалася протягом окремих років. Саме тому навіть для однорічного коефіцієнта Sharpe потрібен узгоджений часовий ряд, а не одне котирування.
Яка безризикова ставка потрібна для коефіцієнта Sharpe
Вибір визначають чотири властивості.
- Короткий строк до погашення. Ставка має бути майже гарантованою протягом одного вимірюваного періоду. Тримісячний bill підходить для місячного розрахунку. Десятирічна Treasury note — ні, оскільки її ціна змінюється протягом місяця, який ви вимірюєте.
- Власна валюта дохідності. Стратегію, номіновану в євро, потрібно оцінювати порівняно з євровим bill.
- Власна частота дохідності. Дохідність bill котирується як річна ставка, тому річне котирування потрібно спочатку перевести в місячну ставку, перш ніж порівнювати його з місячною дохідністю.
- Порівнювані визначення дохідності з обох боків. Дохідність bill охоплює весь його результат, тому дохідність стратегії без дивідендів не є порівнюваною. Price return і total return пояснює цю різницю.
Для перетворення, описаного в третьому пункті, використовують дві конвенції. Просте ділення означає поділ річного котирування на дванадцять. Компундування передбачає обчислення кореня дванадцятого ступеня з одиниці плюс річна ставка. Для умовного bill зі ставкою 5% ці методи дають відповідно 0,4167% і 0,4074% за місяць. Різниця становить приблизно один базисний пункт і повторюється в кожному місяці вибірки. На цих панелях використано компундування. Якщо дохідність bill цікавить вас як результат інвестиції, а не як поріг порівняння, дивідендна дохідність і дохідність Treasury та куди розмістити вільні грошові кошти розглядають це питання.
Як побудувати місячний часовий ряд excess return
Розрахунок є механічним: візьміть останнє закриття кожного місяця, визначте дохідність за місяць, переведіть котирування bill за цей місяць у місячну ставку, а потім відніміть її. У результаті утворюється часовий ряд excess return — одне значення на місяць. Як вимірюється місячна дохідність детально описує розрахунок дохідності.
Точний 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, тому колонка дохідності показує price return без дивідендів. Колонка безризикової ставки починається з 0.128% у першому місяці вибірки й завершується на рівні 0.359%. Порівняно з місячними змінами акцій на кілька відсотків, безризикова складова виглядає як похибка округлення. Але за 60 місяців віднімання вона формує всю різницю між двома коефіцієнтами Sharpe, які нібито вимірюють одне й те саме.
Спочатку віднімання, потім переведення в річний вимір
Після узгодження часових рядів можливі два порядки дій, і вони дають різні результати. Спочатку excess return: відніміть місячну ставку від місячної дохідності, а потім переведіть часовий ряд excess return у річний вимір. Спочатку річний вимір: скомпундуйте дохідність у річний показник, скомпундуйте bill у річний показник, а потім відніміть одне значення від іншого.
Точний 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За період 20-year результат за методом «спочатку excess return» становить 6.49% річних, тоді як за іншим порядком — 6.59%. Різниця дорівнює 0.099 процентного пункту. На періоді 1-year ті самі два розрахунки відрізняються на 0.814 пунктів. У кожному наведеному періоді показник, розрахований за методом «спочатку річний вимір», вищий за показник за методом «спочатку excess return». Причина — перехресний компонент: компундування часового ряду дохідності в річний показник включає дохід, отриманий за безризиковою ставкою поверх самої risk premium. Подальше віднімання річної дохідності bill уже не усуває цей компонент. Він залежить від добутку двох річних показників, тому є найбільшим, коли bill забезпечують високу дохідність.
Переведення в річний вимір має ще одну розвилку. Арифметичний метод передбачає множення середньої місячної excess return на дванадцять. Геометричний метод використовує компундування: визначається стала річна ставка, яка відтворює сукупний результат. Візьмімо умовну послідовність із двох періодів: +50%, а потім -33,3%. У результаті вона точно повертається до початкового рівня. Арифметичне середнє становить +8,35% за період, а геометричне — нуль. На цих панелях використано компундування. Важливе уточнення: за арифметичного методу дванадцятикратне середнє значення дохідності мінус дванадцятикратне середнє значення bill алгебраїчно дорівнює дванадцятикратному середньому значенню excess return. За цією конвенцією порядок віднімання не змінює чисельник. Але знаменник змінюється, оскільки стандартне відхилення excess return відрізняється від стандартного відхилення необробленої дохідності, коли сама ставка змінюється.
Скільки коштує результату одна фіксована ставка
Поширений спрощений підхід полягає в тому, щоб відняти поточну дохідність bill від кожного періоду історії. На панелі нижче коефіцієнт Sharpe розраховано двома способами для п’яти періодів, що завершуються в одну дату: один раз — із використанням узгодженого місячного часового ряду, другий — із використанням дохідності bill, чинної наприкінці періоду.
Точний 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На періоді 1-year два значення відрізняються на 0.07. За дванадцять місяців фіксована ставка має мало можливостей відхилитися від середньої ставки за самим періодом. На періоді 20-year різниця становить 0.18: 0.49 для узгодженого часового ряду проти 0.32 для фіксованої ставки. Помилка залежить від відстані між вибраною єдиною ставкою та середньою ставкою, яка фактично діяла. У довшому періоді ця відстань може бути більшою. Усі подальші розрахунки успадковують цю помилку, а таргетування волатильності та визначення розміру позиції використовує саме такі вхідні дані.
Валютна пастка
Стратегія, яка приносить дохід в одній валюті, але оцінюється порівняно з bill в іншій валюті, дає показник, що мало що означає в будь-якій із них. Розраховуйте excess return в межах однієї валюти: дохідність у євро — проти єврового bill, дохідність у єнах — проти bill у єнах. Стратегії з валютним хеджуванням мають додаткову пастку. Валютний hedge оцінюється через форвард, а форвардні пункти близькі до диференціала процентних ставок між двома валютами. Це означає, що частина внутрішньої ставки вже включена в дохідність хеджованої іноземної стратегії. Якщо додатково відняти іноземний bill, ту саму ставку буде враховано двічі. Зазначайте валюту поруч зі ставкою — це усуває неоднозначність.
Публікуйте ставку разом із коефіцієнтом
Коефіцієнт Sharpe без зазначення джерела та частоти безризикової ставки неможливо перевірити. Два trading desks можуть отримати 0,8 і 1,1 з ідентичного часового ряду дохідності, і обидва результати будуть правильними, якщо використано різні часові ряди ставок та різні конвенції перетворення. Разом із показником потрібно наводити чотири елементи: інструмент, з якого взято ставку, її частоту, конвенцію перетворення та точний період розрахунку. Саме це відрізняє показник, який читач може перевірити, від показника, якому читач змушений просто повірити.
Примітки щодо даних і відтворюваності
Часовий ряд ставок на кожній панелі — це тримісячний Treasury bill із щоденної кривої дохідності Treasury, усереднений у межах кожного календарного місяця та переведений у місячну ставку як корінь дванадцятого ступеня з одиниці плюс річне котирування. Дохідність — це місячні закриття SPY, лише price return, без дивідендів. У коефіцієнтах використано вибіркове стандартне відхилення місячної excess return і квадратний корінь із дванадцяти для переведення в річний вимір. В останніх двох панелях періоди завершуються в одну дату, а колонка фіксованої ставки використовує середнє котирування bill в останньому місяці відповідного періоду. Кожне число в тексті вище взято з розташованої поруч панелі.
FAQ
Яку безризикову ставку слід використовувати в коефіцієнті Sharpe?
Короткостроковий державний bill у тій самій валюті, що й дохідність, переведений у ту саму частоту. Для місячної дохідності в USD це означає одно- або тримісячний Treasury bill. Довші строки до погашення несуть ціновий ризик протягом вимірюваного періоду, тому не підходять як безризикова складова.
Чи можна відняти сьогоднішню дохідність Treasury bill від довгої історії дохідності?
Це найпоширеніша помилка в опублікованих коефіцієнтах Sharpe. За період 20-year вище фіксована ставка на кінець періоду та узгоджений місячний часовий ряд дають значення, що відрізняються на 0.18, хоча розрахунок виконано на основі тієї самої дохідності.
Чи потрібно переводити безризикову ставку в річний вимір до її віднімання?
Ні. Переведіть річне котирування bill у частоту дохідності, віднімайте ставку за кожен період, а потім один раз переведіть часовий ряд excess return у річний вимір наприкінці. Якщо спочатку перевести в річний вимір кожну складову окремо, а потім відняти одну від іншої, у результаті залишиться перехресний компонент.
Наскільки безризикова ставка змінює коефіцієнт Sharpe?
Приблизно на величину зміни ставки, поділену на річну волатильність. Для умовної стратегії з річною волатильністю 15% різниця в припущеній ставці на 4% змінює коефіцієнт приблизно на 0,27. Це різниця між звичайною історією результатів і результатом, який вважають винятковим.
У чому різниця між арифметичним і геометричним переведенням у річний вимір?
Арифметичний метод множить середню excess return за період на кількість періодів у році. Геометричний метод компундує періоди та визначає сталу ставку, яка відтворює сукупний результат. За один період геометричний показник не перевищує арифметичний, а різниця між ними зростає разом із волатильністю.
Кожна панель містить SQL-запит, на основі якого її побудовано, тому часовий ряд ставок і період розрахунку можна перевірити. Щоб виконати такий самий розрахунок для іншого ticker або іншого історичного періоду, сформулюйте запит звичайною англійською мовою в терміналі Strasmore.