8 votos

Cálculo del Índice de Sharpe Anualizado

Estoy tratando de replicar el ratio Sharpe anualizado de una estrategia de comprar y mantener para el índice Dow Jones Industrial Average durante un período que abarca varios años. Tengo el índice de precios diarios del DJIA (cierre) (variable: "price") y la tasa libre de riesgo (dada en porcentaje anual, variable: "rf").

El procedimiento que sigo:

  • Calcular los rendimientos diarios en logaritmo, mediante: log_returns = log(1+(price(t)/price(t-1)-1))
  • Calcular las tasas de riesgo libre diarias en logaritmo, mediante: log_rf = log(1+(rf/100))/252
  • Calcular los rendimientos en exceso diarios, mediante: excess_returns = log_returns-log_rf
  • Calcular el ratio Sharpe diario, mediante: daily_sharpe = mean(excess_returns)/std(excess_returns)
  • Calcular el ratio Sharpe anualizado, mediante: annualized_sharpe = sqrt(252)*daily_sharpe

Sin embargo, el ratio Sharpe anualizado no corresponde con los números reportados. ¿Me falta algún paso/estoy haciendo algo mal (con los logaritmos?)?

Editar:

El cálculo utilizado en el artículo (Bajgrowicz & Scaillet, diciembre de 2012): Cálculo del ratio Sharpe

0 votos

Intenta: calcular la TAE del índice, luego resta la tasa de interés libre de riesgo promedio (no registrada o desanualizada), y divide por la desviación estándar diaria aritmética (no logarítmica) multiplicada por la raíz cuadrada de 250 o 252.

0 votos

Desafortunadamente, este enfoque tampoco me dio los números deseados.

0 votos

¿Cuál es el ratio de Sharpe "correcto" (y cuál es el período exacto que cubren)?

3voto

ScottyDont Puntos 433

Así es como la gente suele abordar el cálculo de SR con logreturns:

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

ACTUALIZACIÓN. SR con rendimientos de composición geométrica:

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

0 votos

Ese es el mismo procedimiento que estoy describiendo arriba (solo escrito de manera diferente), ¿así que estoy haciendo todo correctamente (en teoría)?

0 votos

Supuestamente sí, todo está correcto en tu código, asumiendo que el SR deseado también se calcula en logaritmos. ¿Cuál es el número "reportado"?

3 votos

Sospecho que hay alrededor de 64 formas de calcular SR dependiendo de cómo definas los rendimientos y las volatilidades y los annualices. El hecho más fundamental sobre SR: numerador -- rendimiento en exceso durante el período, denominador -- volatilidad del rendimiento en exceso durante el mismo período (es decir, rendimiento por unidad de riesgo, o rendimiento ajustado por riesgo). A partir de aquí, puedes proceder de varias formas comunes. (1) rendimientos logarítmicos, ver arriba. (2) rendimientos aritméticos, cuestionables a largo plazo. (3) rendimientos compuestos geométricamente. En la práctica, la última es preferible. De todos modos, el procedimiento debería acordarse antes de los cálculos

2voto

Eevee Puntos 18333

Otra forma de hacer las cosas:

    # riesgo = 0
require(quantmod)
require(PerformanceAnalytics)
getSymbols('DJIA', src='yahoo', from = '2009-01-01', to ='2014-12-31')
precio       <- Cl(DJIA)
retorno.simple  <- precio/lag(precio)-1
table.AnnualizedReturns(retorno.simple,Rf=0)[3,]
# [1] 0.7267

retorno.log <- na.omit(ROC(precio))
SD <- sd(retorno.log)*sqrt(252)
R <- exp(mean(retorno.log)*252)-1
SR <- R/SD
SR 
# [1] 0.7263711

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X