【发布时间】:2021-08-12 10:42:50
【问题描述】:
我有几年的每日股票回报,并希望复合每月股票回报。我的数据如下所示:
R2[1:5, 1:5]
1996-01-01 1996-01-02 1996-01-03 1996-01-04 1996-01-05
BERKSHIRE HATHAWAY 'A' 1 0.9813084 0.981746 0.9862571 0.9836066
MORGAN STANLEY 1 1.0053210 1.007944 0.9894978 0.9867380
GOLDMAN SACHS GP. NA NA NA NA NA
CHARLES SCHWAB 1 1.0248524 1.018196 0.9642593 1.0061998
BLACKROCK NA NA NA NA NA
日期按列排列,公司名称按行排列。每日回报是数字。 因此,对于一个给定的月份,我应用以下内容:
R4 <- R4 %>%
mutate("1996-02" = apply(select(R2, matches("1996-02")), 1, prod))
R4[1:5, 1:2]
1996-01 1996-02
BERKSHIRE HATHAWAY 'A' 0.9937695 1.1128527
MORGAN STANLEY 1.1516025 0.9930737
GOLDMAN SACHS GP. NA NA
CHARLES SCHWAB 1.2484572 1.0149366
BLACKROCK NA NA
我想要一个自动计算从 1996 年到 2020 年的每月回报的循环,并尝试了这个:
R3 <- for(i in 1996:2020) {
for(j in 1:12) {
mutate("i-j" = apply(select(R2, matches ("i-j")), 1, prod))
}
}
我将如何正确定义 i 和 j 以便循环在整个期间内改变每个月的变量并调整必须用于计算该月度收益的每日股票收益?目前我只是将它们作为占位符。
或者有没有更好更简单的方法?
编辑 - 重现我的数据:
df <- data.frame(c(1, 1, NA, 1, NA),
c(0.981308411214953, 1.00532100309623, NA, 1.02485242822646, NA),
c(0.981746031746032, 1.0079443588933, NA, 1.01819550348529, NA),
c(0.986257073565077, 0.989497753854871, NA, 0.964259312827436, NA),
c(0.983606557377049, 0.986737970101638, NA, 1.00619979334022, NA))
colnames(df) <- as.Date(c("1996-01-01", "1996-01-02", "1996-01-03", "1996-01-04", "1996-01-05"))
rownames(df) <- c("BERKSHIRE HATHAWAY 'A'", "MORGAN STANLEY", "GOLDMAN SACHS GP.", "CHARLES SCHWAB", "BLACKROCK")
解决方案:
R3 <- R2 %>%
rownames_to_column("company") %>%
pivot_longer(cols = -company) %>%
mutate(name = as.Date(name),
year = year(name),
month = month(name),
day = day(name)) %>%
group_by(company, year, month) %>%
summarise(value = prod(value, na.rm = FALSE))
【问题讨论】:
-
您能否使用
dput(R2[1:5, 1:5])以可重现的格式提供数据? -
@RonakShah,当然:结构(列表(
1996-01-01= c(1, 1, NA, 1, NA),1996-01-02= c(0.981308411214953, 1.00532100309623, NA, 1.0248524282266) ,1996-01-03= C(0.981746031746032,1.0079443588933,NA,1.01819550348529,NA),1996-01-04= C(0.986257073565077,0.989497753854871,NA,0.964259312827436,NA),1996-01-05= C(0.983606557377049,0.986737970101638,NA,1.00619979334022,NA )), row.names = c("BERKSHIRE HATHAWAY 'A'", "MORGAN STANLEY", "GOLDMAN SACHS GP.", "CHARLES SCHWAB", "BLACKROCK"), class= "data.frame") -
我把它作为编辑,@RonakShah