Cálculo de rentabilidades con R: Rentabilidad aritmética Vs Rentabilidad logarítmica

4.5
(11)

Parar cualquier inversionista es muy importante diferenciar y saber calcular la rentabilidad o rendimiento de una inversión u activo financiero, por lo tanto, en esta entrada comentaré sobre los rendimientos de activos financieros y como no podía ser de otra forma, realizaré los cálculos con el lenguaje de programación R (R Language).

Además, en muchas de las entradas anteriores aplico rentabilidad logarítmica sin explicar el por qué, y aquí quiero profundizar un poco sobre ello.

Vamos a analizar la acción de Netflix, Inc. (NFLX) y descargaré los precios desde Yahoo Finance con la librería quantmod:

library(quantmod)

getSymbols("NFLX", from="2015-01-01", to="2019-07-31")
## [1] "NFLX"
head(NFLX)
##            NFLX.Open NFLX.High NFLX.Low NFLX.Close NFLX.Volume
## 2015-01-02  49.15143  50.33143 48.73143   49.84857    13475000
## 2015-01-05  49.25857  49.25857 47.14714   47.31143    18165000
## 2015-01-06  47.34714  47.64000 45.66143   46.50143    16037700
## 2015-01-07  47.34714  47.42143 46.27143   46.74286     9849700
## 2015-01-08  47.12000  47.83571 46.47857   47.78000     9601900
## 2015-01-09  47.63143  48.02000 46.89857   47.04143     9578100
##            NFLX.Adjusted
## 2015-01-02      49.84857
## 2015-01-05      47.31143
## 2015-01-06      46.50143
## 2015-01-07      46.74286
## 2015-01-08      47.78000
## 2015-01-09      47.04143
tail(NFLX)
##            NFLX.Open NFLX.High NFLX.Low NFLX.Close NFLX.Volume
## 2019-07-23    311.44    313.50   306.00     307.30     9171100
## 2019-07-24    310.51    319.99   307.25     317.94    11961800
## 2019-07-25    318.86    327.69   316.30     326.46    10798500
## 2019-07-26    328.79    336.00   327.50     335.78    10847500
## 2019-07-29    335.98    336.40   328.77     332.70     5782800
## 2019-07-30    329.20    329.65   323.23     325.93     6029300
##            NFLX.Adjusted
## 2019-07-23        307.30
## 2019-07-24        317.94
## 2019-07-25        326.46
## 2019-07-26        335.78
## 2019-07-29        332.70
## 2019-07-30        325.93

Selecciono los precios de cierre ajustados:

NFLX <- NFLX[,"NFLX.Adjusted"]

Grafico los precios utilizando la librería PerformanceAnalytics:

library(PerformanceAnalytics)

chart.TimeSeries(NFLX, col="darkgreen", 
                 legend.loc = "bottomright", 
                 main="Evolucion de la acción de Netflix, Inc. (NFLX)")

plot of chunk unnamed-chunk-167

Rentabilidad aritmética o simple

Si denotamos P_t&s=2 al precio de un activo al final del período t&s=2, el rendimiento simple viene dado por la siguiente expresión:

R_t=\frac{P_{t} - P_{t - 1}}{P_{t - 1}}&s=2

Los datos descargados tiene formato de serie temporal, por lo tanto, primero creo un vector con ellos, extrayendo sólo los datos y los índices de las fechas con la función coredata:

NFLX_vector <- coredata(NFLX)

Ahoro aplico la formula:

n <- nrow(NFLX_vector)
NFLX_rend_simple_1 <- (NFLX_vector[2:n, 1] - NFLX_vector[1:(n - 1), 1]) / NFLX_vector[1:(n - 1), 1]
head(NFLX_rend_simple_1)
## [1] -0.050897025 -0.017120620  0.005191927  0.022188202 -0.015457744
## [6] -0.031765320

Estos cálculos también se pueden hacer con la función Return.calculate():

NFLX_rend_simple_2 = Return.calculate(NFLX)
head(NFLX_rend_simple_2)
##            NFLX.Adjusted
## 2015-01-02            NA
## 2015-01-05  -0.050897025
## 2015-01-06  -0.017120620
## 2015-01-07   0.005191927
## 2015-01-08   0.022188202
## 2015-01-09  -0.015457744

Rentabilidad logarítmica o rendimientos compuestos continuos

Los rendimientos compuestos en tiempo continuo tienen una relación aditiva entre los períodos, por lo que muchas veces, resulta más útil el calculo de éstos que de los rendimientos simples, donde la relación entre los períodos es multiplicativa.

Con las rentabilidades simples, la rentabilidad anual de una inversión es la media geométrica de los rendimientos mensuales.

En este sentido, se debe tener en cuenta que el producto de variables normalmente distribuidas no es una variable normal, por el contrario, la suma de las variables normales no correlacionadas si es normal.

Por lo anterior, es mejor utilizar la suma de rentabilidades que la multiplicación y con la rentabilidad logarítmica sí se puede sumar la rentabilidad de los diferentes periodos para obtener la rentabilidad total, además se disminuye la complejidad algorítmica, ya que se podría aplicar el teorema central del límite.

La relación aditiva entre los períodos viene denotada por la siguiente expresión:

r_t=ln(1+R_t)&s=2

Donde R_t&s=2 es el rendimiento simple y r_t&s=2 es rendimiento compuesto en tiempo continuo en el momento t&s=2.

Por consiguiente, r_t&s=2 se puede calcular de la siguiente manera:

r_t=ln(\frac{P_t}{P_{t - 1}})&s=2

ln(\frac{P_{t}}{P_{t -1}}) = ln(P_{t}) - ln(P_{t -1})&s=2

Por otro lado,  la rentabilidad logarítmica es ampliamente usada en finanzas cuantitativas ya que permite calcular probabilidades que se basan en una distribución normal, teniendo en cuenta que estos rendimientos no pueden ser inferior a -1.

En R, estos se pueden calcular fácilmente: uso la función log() para calcular los logaritmos naturales a los precios y aplico diferencias con la función diff() para así obtener los retornos compuestos en tiempo continuo.

NFLX_rend_cc_1 <- diff(log(NFLX))
head(NFLX_rend_cc_1)
##            NFLX.Adjusted
## 2015-01-02            NA
## 2015-01-05  -0.052237977
## 2015-01-06  -0.017268873
## 2015-01-07   0.005178495
## 2015-01-08   0.021945626
## 2015-01-09  -0.015578461

Y con la función Return.calculate():

NFLX_rend_cc_2 = Return.calculate(NFLX, method="log")
head(NFLX_rend_cc_2)
##            NFLX.Adjusted
## 2015-01-02            NA
## 2015-01-05  -0.052237977
## 2015-01-06  -0.017268873
## 2015-01-07   0.005178495
## 2015-01-08   0.021945626
## 2015-01-09  -0.015578461

Por último, grafico los rendimientos:

dataToPlot <- merge(NFLX_rend_simple_2, NFLX_rend_cc_2)
colnames(dataToPlot) = c("Simple", "CC")
plot.zoo(dataToPlot, main="Simple vs Compuesto Continuo", plot.type="single", 
         ylab="Rendimientos", lwd=2, col=c("black", "red"))
abline(h=0)
legend("bottomleft", legend=colnames(dataToPlot),
       lty="solid", lwd=2, col=c("black", "red"))

plot of chunk unnamed-chunk-173

my.panel <- function(...) {
  lines(...)
  abline(h=0)
}
plot.zoo(dataToPlot, main="Simple vs Compuesto Continuo", plot.type="multiple", 
         panel=my.panel, lwd=2, col=c("black", "red"))

plot of chunk unnamed-chunk-173

¿Te ha parecido útil? ¡Puntúa esta entrada!

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 4.5 / 5. Recuento de votos: 11

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Facebook
Twitter
LinkedIn
Scroll al inicio