R:根据每日价格按组计算每月回报

时间:2019-05-27 12:29:13

标签: r return time-series quantmod stock

我有一个大型数据框crsp,其中包含几列每日库存数据。与该问题相关的是以下几列(小节为您提供一个思路):

PERMNO   date         monthyear  PRC       RET
10001    1990-01-02   199001     10.1250   0.0000
10001    1990-01-03   199001     10.0000  -0.0123
...
10001    1990-02-01   199002     10.0000   0.0000
10001    1990-02-02   199002     10.0625   0.0062
...
10002    1990-01-02   199001      6.1250   0.0000
10002    1990-01-03   199001      6.2000   0.0122
...
10002    1990-02-01   199002      6.2500   0.0000
10002    1990-02-02   199002      6.5000   0.0400
...

"PERMNO"是股票ID,"date"是实际日期,"monthyear"是月份,"PRC"是价格,"RET"是每日收益。 / p>

我正在尝试添加一个新列"MonthlyReturn",该列显示每只股票的月收益。因此,应针对每只股票的每个月(按PERMNO分组)计算该值。

据我所知,可能有两种方法可以解决此问题:

  1. 通过将每个股票的每个月的最后价格除以该月的第一个价格来计算月收益(注意:由于周末,该月的第一个交易日不一定是该月的实际第一天)< / li>
  2. 将现有的每日收益转换为每月收益

无论哪种方式,我的目标都是以下输出:

PERMNO   date         monthyear  PRC       RET      MonthlyReturn
10001    1990-01-02   199001     10.1250   0.0000   0.1000
10001    1990-01-03   199001     10.0000  -0.0123   0.1000
...
10001    1990-02-01   199002     10.0000   0.0000   0.0987
10001    1990-02-02   199002     10.0625   0.0062   0.0987
...
10002    1990-01-02   199001      6.1250   0.0000  -0.0034
10002    1990-01-03   199001      6.2000   0.0122  -0.0034
...
10002    1990-02-01   199002      6.2500   0.0000   0.2340
10002    1990-02-02   199002      6.5000   0.0400   0.2340
...

通过研究,我发现了Quantmod的monthlyReturn函数,这有用吗?

当我刚开始学习R时,任何帮助将不胜感激。也可以随意添加任何可以帮助我改善该问题对SO的适用性的东西。

1 个答案:

答案 0 :(得分:1)

使用Tidyverse,您可以通过以下方式计算每月收益:

library(tidyverse)
library(lubridate)

df <- left_join(df, df %>%
  arrange(PERMNO, date) %>% # order the data  by stock id and date
  filter(!wday(as.Date(date)) %in% c(1,7)) %>% # filter week end
  group_by(PERMNO, monthyear) %>% 
  mutate(MonthlyReturn = last(PRC) / first(PRC) - 1) %>% # calculate the monthly return per stock id and month
  select(PERMNO, monthyear, MonthlyReturn)) # Keep only these 3 columns

希望这会有所帮助。