我有一个大型数据框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分组)计算该值。
据我所知,可能有两种方法可以解决此问题:
无论哪种方式,我的目标都是以下输出:
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的适用性的东西。
答案 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
希望这会有所帮助。