2 votos

¿Cómo calcular los rendimientos mensuales en R para cada empresa en un conjunto de datos de 4000 empresas?

Quiero calcular las rentabilidades mensuales de una serie temporal de 4000 empresas entre 2014 y 2019.

Este es el aspecto de mi conjunto de datos enter image description here

Estoy utilizando el siguiente código para calcular los rendimientos

nyseamex <- mutate(nyseamex, mon_return= adjprice /lag(adjprice)-1)

Hasta aquí todo bien. Sin embargo, al mirar los datos, R calcula para cada precio ajustado el rendimiento mensual. Esto se convierte en un problema en cuanto cambia el nombre de la empresa:

enter image description here

Intenté agrupar los nombres utilizando la función group_by(), sin embargo, recibí un mensaje de error cuando ejecuté mi función:

enter image description here

¿Alguien sabe cómo calcular la rentabilidad correcta para cada empresa en el conjunto de datos, como tener NA en la columna de rentabilidad para la primera entrada de la nueva empresa y luego calcular la rentabilidad hasta la última fecha y hacer el mismo procedimiento para cada nueva empresa en la serie?

Gracias de antemano.

1voto

Foxy Puntos 46

Ahora mismo no tengo un R/dplyr a mano, pero lo siguiente debería funcionar:

nyseamex %<>% group_by(name) %>% mutate(mon_return = adjprice/lag(adjprice)-1) %>% ungroup()

El primer operador %<>% es el operador de reasignación, efectivamente x=f(x), y cuando se utiliza cualquiera de los operadores de tubería ( %>% y %<>% ), el primer argumento de la función puede ser eliminado. Así,

x=f(x,y)

se convertirá en

x %<>% f(y)

EDITAR Si necesita ordenar sus datos en primer lugar, le sugiero

data %>% arrange(column)

de la dplyr universo... Yo recomendaría totalmente el uso de estas cosas a la manera de dplyr. El código es muy limpio, legible, y usted puede fácilmente enchufar diferentes operaciones...

1voto

BigCanOfTuna Puntos 210

No has dicho si los precios están ordenados por fecha (tu función lo requiere), y no has dicho cuál debe ser la estructura de datos final deseada. Pero aquí tienes una forma de hacerlo.

Comience con su conjunto de datos de ejemplo:

df <- data.frame(date = as.Date(c("2019-11-29", "2019-12-31",
                                  "2014-01-31", "2014-02-28")),
                 name = c("HANGER INC", "HANGER INC",
                          "ADAMS EXPRESS CO", "ADAMS EXPRESS CO"),
                 price = c(26.20, 27.61, 12.46, 12.92),
                 stringsAsFactors = FALSE)
df
##         date             name price
## 1 2019-11-29       HANGER INC 26.20
## 2 2019-12-31       HANGER INC 27.61
## 3 2014-01-31 ADAMS EXPRESS CO 12.46
## 4 2014-02-28 ADAMS EXPRESS CO 12.92

Ahora calcula los rendimientos dividiendo el marco de datos por name .

library("PMwR")
library("zoo")
ans <- lapply(split(df, df$name),
              function(x) returns(zoo(x$price, x$date), pad = NA))
ans
## $`ADAMS EXPRESS CO`
## 2014-01-31 2014-02-28 
##         NA 0.03691814 
## 
## $`HANGER INC`
## 2019-11-29 2019-12-31 
##         NA 0.05381679 

El resultado es una lista de series de retorno. Utilizando zoo tiene la ventaja de que se asegurará de que los precios se ordenen a tiempo.

Si prefieres un marco de datos grande:

do.call(merge, ans)
##            ADAMS EXPRESS CO HANGER INC
## 2014-01-31               NA         NA
## 2014-02-28       0.03691814         NA
## 2019-11-29               NA         NA
## 2019-12-31               NA 0.05381679

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