回報
年化夏普比率計算
我試圖複製道瓊斯工業平均指數的買入並持有策略的年化夏普比率,該策略由多年組成。我得到了每日 DJIA(收盤價)價格指數(變數:“價格”)和無風險利率(以一年百分比為單位,變數:“rf”)。
我遵循的程序:
- 通過以下方式計算每日日誌回報:
log_returns = log(1+(price(t)/price(t-1)-1))
- 通過以下方式計算每日對數無風險利率:
log_rf = log(1+(rf/100))/252
- 通過以下方式計算每日超額收益:
excess_returns = log_returns-log_rf
- 通過以下方式計算每日夏普比率:
daily_sharpe = mean(excess_returns)/std(excess_returns)
- 通過以下方式計算年化夏普比率:
annualized_sharpe = sqrt(252)*daily_sharpe
然而,年化的夏普比率與報告的數字並不對應。我是否錯過了一步/做錯了什麼(使用日誌?)?
編輯:
這就是人們通常使用 logreturns 計算 SR 的方式:
library(quantmod) getSymbols('DJIA', src='yahoo', from = '2009-01-01') price <- Cl(DJIA) log_ret <- log(price/lag(price,1)) mean_log_ret <- mean(log_ret, na.rm=T) sd_log_ret <- sd(log_ret, na.rm=T) rf <- 0.0025 # benchmark SR <- (252 * mean_log_ret - log(1+rf))/(sd_log_ret*sqrt(252)) SR [1] 0.5565204
更新。具有幾何復合回報的 SR:
g_ret <- (price/lag(price,1) - 1)[-1] n_periods <- length(g_ret) avg_g_ret <- prod(1 + coredata(g_ret)) ^ (1/n_periods) annual_g_return <- avg_g_ret^252 - 1 annual_sd_g_return <- sd(g_ret) * sqrt(252) SR <- (annual_g_return - rf)/annual_sd_g_return SR [1] 0.5844989
另一種給貓剝皮的方法:
# risk-free = 0 require(quantmod) require( PerformanceAnalytics) getSymbols('DJIA', src='yahoo', from = '2009-01-01', to ='2014-12-31') price <- Cl(DJIA) simple.ret <- price/lag(price)-1 table.AnnualizedReturns(simple.ret,Rf=0)[3,] # [1] 0.7267 log.ret <- na.omit(ROC(price)) SD <- sd(log.ret)*sqrt(252) R <- exp(mean(log.ret)*252)-1 SR <- R/SD SR # [1] 0.7263711