2011-08-21 20 views
5

Tengo que calcular el retorno de un vector que da una serie histórica de precios de una acción. El vector es de una forma:¿Cómo calcular los rendimientos a partir de un vector de precios?

a <- c(10.25, 11.26, 14, 13.56) 

necesito para calcular diaria ganancias/pérdidas (%) - es decir, cuál es la ganancia que tiene de 10.25 a 11.26 luego desde 11.26 a 14, etc.

¿Hay una función para calcular esto automáticamente?

Respuesta

17

Uso de los datos de la muestra, creo que decir lo siguiente:

a <- c(10.25, 11.26, 14, 13.56) 
> diff(a)/a[-length(a)] 
[1] 0.09853659 0.24333925 -0.03142857 

diff devuelve el vector de diferencias rezagadas y a[-length(a)] gotas el último elemento de una.

+0

Hmm que debería obtener: 9,853659% (de 10.25 a 11.26) 24.33393% (de 11.26 a 14) -3.142857% (de 14 a 13.56) – blakc05

+0

Sí, esto es lo mismo que mi resultado. – Andrie

+0

así que tengo que multiplicar por 100 – blakc05

18

Usted puede encontrar las funciones en quantmod relevante para su trabajo:

> require(quantmod) 
> Delt(a) 
    Delt.1.arithmetic 
[1,]    NA 
[2,]  0.09853659 
[3,]  0.24333925 
[4,]  -0.03142857 
1
ret<-diff(log(a)) 

Esto le dará los rendimientos geométricas - retorno siguen una distribución logarítmica normal (límite inferior es de -100% ya que los precios son siempre no negativo), por lo que el ln(prices) sigue una distribución normal (por lo tanto, es posible que vea retornos menores a -1 o -100%).

Para el rango de retornos "normal", la diferencia entre [P(t+1)-P(t)]/P(t) y LN(P(t+1)/P(t)) debe ser insignificante. Espero que esto ayude.

+0

Sí, pero ¿por qué usar una relación aproximada cuando no es difícil calcular una exacta , como en la respuesta que brindo? –

+0

Además, si está utilizando devoluciones mensuales, anuales, etc. (que serán más grandes que, p.retornos diarios) los errores en este método te meterán en problemas rápidamente. –

1

También puede usar la relación exacta que devuelve el exponente de log returns menos uno. Por lo tanto, si Prices contiene sus precios, la siguiente información le dará sus declaraciones:

Returns = exp(diff(log(Prices))) - 1 

Tenga en cuenta que esta es una relación exacta , en lugar de la relación aproximada dada en la respuesta por @PBS.

0

Para complementar la respuesta de PBS, una forma un poco complicada de generar un retorno de registro sería ret<-c(NA,log(a[-1])-log(a[-length(a)])).

+0

Consulte primero este [cómo-para-responder] (https://stackoverflow.com/help/how-to-answer) Esta pregunta es respondida antes, obviamente, puede agregar su respuesta aquí. Pero necesitas entender algunos puntos antes de responder. Primero, no agregue una respuesta que se haya agregado previamente con el mismo código o sugerencia. Segundo, no agregue una respuesta demasiado complicada si el usuario ha preguntado muy específicamente sobre el problema y lo que necesita para resolverlo. En tercer lugar, puede agregar un comentario si desea sugerir algo con respecto a la respuesta o pregunta. –

0

Otra posibilidad es la función ROC del paquete TTR:

library(TTR) 
a <- c(10.25, 11.26, 14, 13.56) 
ROC(a, type = "discrete") 
## [1]   NA 0.09853659 0.24333925 -0.03142857 

type = continuous (que es la opción por defecto) da log-retornos:

ROC(a) 
## [1]   NA 0.09397892 0.21780071 -0.03193305 
Cuestiones relacionadas