Lãi suất phi rủi ro trong Sharpe ratio
Lãi suất phi rủi ro trong Sharpe ratio thay đổi theo thời gian. Cách khớp lợi suất bill với tần suất lợi nhuận và chi phí khi dùng một mức cố định.
Lãi suất phi rủi ro trong Sharpe ratio là mức sinh lời mà bạn có thể nhận được trong cùng khoảng thời gian nếu không chịu rủi ro đang được đánh giá. Đây là một chuỗi dữ liệu, gồm một giá trị cho mỗi kỳ, được báo giá bằng đồng tiền của chuỗi lợi nhuận. Tần suất của lãi suất phải khớp với tần suất lợi nhuận, sau đó được trừ theo từng kỳ. Chỉ annualize một lần, ở bước cuối.
Bỏ qua quy trình này là nguyên nhân khiến phần lớn Sharpe ratio được công bố bị sai. Việc lấy một con số duy nhất từ đầu chuỗi lợi nhuận 20 năm, thường là mức lợi suất Treasury bill trong tuần hiện tại, áp cùng một ngưỡng yêu cầu cho năm 2009 và năm 2024. Hướng dẫn của chúng tôi về Sharpe ratio giải thích ratio này đo lường điều gì. Trang này tập trung vào đầu vào mà gần như không ai ghi rõ.
Lãi suất phi rủi ro không phải một hằng số
Sharpe ratio được đo trong 20 năm sẽ bao quát cả một lịch sử lãi suất. Bảng dưới đây lấy Treasury bill kỳ hạn ba tháng và quy đổi từng năm dương lịch thành mức trung bình cùng khoảng dao động quanh mức đó.
Câu lệnh SQL chính xác đằng sau mỗi con số
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 yearMức trung bình năm là 3.22% trong 2005 và 3.74% trong 2026, trải qua 22 năm dương lịch. Diễn biến giữa hai mức đó mới là phần quan trọng. Đường lãi suất giảm xuống đáy, duy trì ở đó trong phần lớn một thập kỷ rồi tăng trở lại. Các cột thấp nhất và cao nhất cho thấy lãi suất đã dao động bao xa trong từng năm, qua đó giải thích vì sao ngay cả Sharpe ratio một năm cũng cần một chuỗi dữ liệu khớp tần suất thay vì chỉ một báo giá.
Lãi suất phi rủi ro nào phù hợp với Sharpe ratio
Bốn đặc điểm quyết định lựa chọn này.
- Kỳ hạn ngắn. Lãi suất phải gần như chắc chắn trong một kỳ đo lường. Treasury bill kỳ hạn ba tháng phù hợp với dữ liệu theo tháng. Treasury note kỳ hạn 10 năm thì không, vì giá của nó biến động trong chính tháng đang được đo lường.
- Đồng tiền của lợi nhuận. Một chiến lược tính bằng euro phải được đánh giá so với bill bằng euro.
- Tần suất của lợi nhuận. Lợi suất bill được báo cáo theo năm, nên phải chuyển mức báo giá theo năm về tần suất tháng trước khi trừ vào lợi nhuận tháng.
- Định nghĩa lợi nhuận phải tương đồng ở cả hai phía. Lợi suất bill bao gồm toàn bộ lợi nhuận, nên lợi nhuận chiến lược không bao gồm cổ tức sẽ không được đo trên cùng một cơ sở. Price return và total return giải thích khoảng chênh lệch này.
Có hai quy ước đang được sử dụng cho phép chuyển đổi ở điểm thứ ba. Phép chia đơn giản chia báo giá theo năm cho 12. Phép tính lãi kép lấy căn bậc 12 của một cộng với lãi suất năm. Với bill giả định có lãi suất 5%, hai cách này cho kết quả lần lượt là 0,4167% và 0,4074% trong tháng, chênh khoảng một basis point và lặp lại trong từng tháng của mẫu. Các bảng ở đây sử dụng lãi kép. Nếu bạn quan tâm đến lợi suất bill với tư cách một khoản đầu tư thay vì một ngưỡng yêu cầu, dividend yield và Treasury yield cùng cách phân bổ tiền mặt nhàn rỗi sẽ cung cấp thêm thông tin.
Cách xây dựng chuỗi excess return theo tháng
Cách xây dựng mang tính cơ học: lấy giá đóng cửa cuối mỗi tháng, tính lợi nhuận của tháng đó, chuyển báo giá bill của tháng đó thành lãi suất tháng rồi thực hiện phép trừ. Kết quả là một chuỗi excess return, với một giá trị cho mỗi tháng. Cách đo lường lợi nhuận theo tháng trình bày chi tiết phần lợi nhuận.
Câu lệnh SQL chính xác đằng sau mỗi con số
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Đây là giá đóng cửa của SPY, nên cột lợi nhuận là price return và không bao gồm cổ tức. Cột lãi suất phi rủi ro bắt đầu ở mức 0.128% trong tháng đầu tiên được hiển thị và kết thúc ở 0.359%. So với các tháng cổ phiếu biến động vài phần trăm, dải lãi suất phi rủi ro trông giống như sai số làm tròn. Nhưng qua 60 tháng thực hiện phép trừ, nó tạo ra toàn bộ khác biệt giữa hai Sharpe ratio cùng tuyên bố đo lường một khái niệm.
Trừ trước, annualize sau
Khi các chuỗi đã được căn chỉnh, có hai thứ tự tính toán và chúng cho kết quả khác nhau. Excess return trước: trừ lãi suất tháng khỏi lợi nhuận tháng, sau đó annualize chuỗi excess return. Annualize trước: ghép lợi nhuận thành một con số theo năm, ghép bill thành một con số theo năm rồi lấy con số thứ nhất trừ con số thứ hai.
Câu lệnh SQL chính xác đằng sau mỗi con số
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 yearsTrong khoảng thời gian 20-year, kết quả theo cách excess return trước là 6.49% mỗi năm, so với 6.59% theo cách còn lại, chênh 0.099 điểm phần trăm. Ở khoảng thời gian 1-year, hai phép tính này cách nhau 0.814 điểm. Trong mọi khoảng thời gian ở đây, con số annualize trước đều cao hơn con số excess return trước. Nguyên nhân là một cross term: khi ghép chuỗi lợi nhuận thành con số theo năm, phép tính bao gồm cả phần sinh lời từ lãi suất bill trên chính risk premium. Việc trừ lãi suất bill đã annualize sau đó không loại bỏ được phần này. Cross term tăng theo tích của hai con số annualize, nên chênh lệch lớn nhất khi bill có lợi suất cao.
Annualization còn có một nhánh lựa chọn khác. Arithmetic annualization nhân excess return tháng trung bình với 12. Geometric annualization thực hiện lãi kép, tức tìm mức lãi suất năm cố định tái tạo đúng kết quả tích lũy. Hãy xét một chuỗi giả định gồm hai kỳ: +50% rồi -33,3%, kết thúc đúng tại mức ban đầu. Arithmetic average là +8,35% mỗi kỳ, còn geometric average bằng 0. Các bảng ở đây sử dụng lãi kép. Có một lưu ý đáng nhớ: với arithmetic annualization, 12 lần excess return trung bình trừ 12 lần bill trung bình về mặt đại số tương đương với 12 lần excess return trung bình. Theo quy ước này, thứ tự phép trừ không thay đổi numerator. Tuy nhiên, denominator vẫn thay đổi, vì độ lệch chuẩn của excess return khác với độ lệch chuẩn của raw return khi chính lãi suất cũng biến động.
Một mức lãi suất cố định làm sai kết quả như thế nào
Cách làm tắt phổ biến là lấy lợi suất bill hiện tại và trừ nó khỏi mọi kỳ trong lịch sử. Bảng dưới đây tính Sharpe ratio theo cả hai cách trên năm khoảng thời gian kết thúc cùng một ngày: một lần so với chuỗi lãi suất tháng khớp tần suất, một lần so với lợi suất bill áp dụng tại thời điểm kết thúc mỗi khoảng thời gian.
Câu lệnh SQL chính xác đằng sau mỗi con số
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Ở khoảng thời gian 1-year, hai kết quả cách nhau 0.07. Trong 12 tháng, mức lãi suất cố định khó lệch nhiều so với mức trung bình của chính khoảng thời gian đó. Ở khoảng thời gian 20-year, hai kết quả cách nhau 0.18: 0.49 theo chuỗi khớp tần suất so với 0.32 theo lãi suất cố định. Sai số đi theo khoảng cách giữa mức lãi suất duy nhất bạn chọn và mức lãi suất trung bình thực tế trong giai đoạn. Khoảng cách này có nhiều cơ hội mở rộng hơn khi thời gian đo lường dài hơn. Mọi kết quả tính tiếp theo đều kế thừa sai số đó, và volatility targeting và position sizing sử dụng đúng loại đầu vào này.
Bẫy đồng tiền
Một chiến lược tạo lợi nhuận bằng một đồng tiền nhưng được đánh giá so với bill bằng đồng tiền khác sẽ cho ra một con số không có nhiều ý nghĩa với cả hai đồng tiền. Hãy tính excess return trong cùng một đồng tiền: lợi nhuận bằng euro so với bill bằng euro, lợi nhuận bằng yen so với bill bằng yen. Các chiến lược có hedge tiền tệ còn có một bẫy thứ hai. Hedge tiền tệ được định giá dựa trên forward, và forward points thường gần với chênh lệch lãi suất giữa hai đồng tiền. Điều này đã đưa một phần lãi suất nội địa vào lợi nhuận ngoại tệ đã hedge. Nếu tiếp tục trừ bill ngoại tệ, bạn sẽ tính cùng một mức lãi suất hai lần. Ghi rõ đồng tiền bên cạnh lãi suất sẽ loại bỏ sự mơ hồ.
Công bố lãi suất cùng với ratio
Một Sharpe ratio được báo cáo mà không nêu nguồn lãi suất phi rủi ro và tần suất thì không thể được kiểm chứng. Hai trading desk có thể tính ra lần lượt 0,8 và 1,1 từ cùng một chuỗi lợi nhuận mà cả hai đều đúng, nếu sử dụng các chuỗi lãi suất và quy ước chuyển đổi khác nhau. Có bốn thông tin phải đi cùng con số: công cụ tạo ra lãi suất, tần suất của lãi suất, quy ước chuyển đổi và khoảng thời gian chính xác. Đây là khác biệt giữa một con số mà người đọc có thể kiểm tra và một con số mà người đọc chỉ có thể tin tưởng.
Ghi chú dữ liệu và khả năng tái lập
Chuỗi lãi suất trong mọi bảng là Treasury bill kỳ hạn ba tháng lấy từ đường cong lợi suất Treasury hằng ngày, tính trung bình trong từng tháng dương lịch rồi chuyển thành lãi suất tháng bằng căn bậc 12 của một cộng với báo giá theo năm. Lợi nhuận được tính từ giá đóng cửa cuối tháng của SPY, chỉ là price return và không bao gồm cổ tức. Các ratio sử dụng độ lệch chuẩn mẫu của monthly excess return và căn bậc hai của 12 để annualize. Hai bảng cuối sử dụng các khoảng thời gian kết thúc cùng một ngày, trong đó cột lãi suất cố định lấy mức báo giá bill trung bình của tháng cuối trong mỗi khoảng thời gian. Mọi con số trong phần nội dung trên đều được lấy từ bảng ngay bên cạnh.
Câu hỏi thường gặp
Tôi nên sử dụng lãi suất phi rủi ro nào trong Sharpe ratio?
Một government bill kỳ hạn ngắn bằng cùng đồng tiền với chuỗi lợi nhuận, được chuyển đổi sang cùng tần suất với lợi nhuận. Với lợi nhuận USD theo tháng, đó là Treasury bill kỳ hạn một tháng hoặc ba tháng. Các kỳ hạn dài hơn chịu price risk trong thời gian đo lường, nên không phù hợp làm phần lãi suất phi rủi ro.
Tôi có thể trừ lợi suất Treasury bill hôm nay khỏi một chuỗi lợi nhuận dài không?
Đây là sai lầm phổ biến nhất trong các Sharpe ratio được công bố. Trong khoảng thời gian 20-year ở trên, lãi suất cố định tại thời điểm cuối kỳ và chuỗi tháng khớp tần suất cho ra hai kết quả cách nhau 0.18 trên cùng một chuỗi lợi nhuận.
Tôi có cần annualize lãi suất phi rủi ro trước khi trừ không?
Không. Hãy chuyển báo giá bill theo năm về cùng tần suất với lợi nhuận, trừ theo từng kỳ rồi chỉ annualize chuỗi excess return một lần ở bước cuối. Annualize riêng từng phần rồi mới trừ sẽ để lại một cross term trong kết quả.
Lãi suất phi rủi ro làm Sharpe ratio thay đổi bao nhiêu?
Xấp xỉ bằng mức thay đổi của lãi suất chia cho volatility đã annualize. Với một chiến lược giả định có volatility annualize 15%, chênh lệch 4% trong mức lãi suất giả định sẽ làm ratio thay đổi khoảng 0,27. Đây là khoảng cách giữa một track record bình thường và một track record được ca ngợi.
Arithmetic annualization khác geometric annualization như thế nào?
Arithmetic annualization nhân excess return trung bình mỗi kỳ với số kỳ trong một năm. Geometric annualization ghép các kỳ thành mức lãi suất cố định tái tạo đúng kết quả tích lũy. Theo từng kỳ, kết quả geometric luôn bằng hoặc thấp hơn kết quả arithmetic, và khoảng cách giữa hai kết quả mở rộng khi volatility tăng.
Mỗi bảng ở đây đều kèm theo SQL đã tạo ra bảng đó, nên chuỗi lãi suất và khoảng thời gian đều có thể quan sát. Để thực hiện cách xây dựng tương tự với ticker khác hoặc một giai đoạn lịch sử khác, hãy yêu cầu bằng tiếng Anh tự nhiên trên terminal Strasmore.