【问题标题】:For-Loops in R - Changing the sequences for monthly returnsR 中的 For 循环 - 更改每月回报的序列
【发布时间】: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

标签: r for-loop finance


【解决方案1】:

或许,你可以得到长格式的数据,计算出每一年、每一家公司的产品。

library(tidyverse)
library(lubridate)

df %>%
  rownames_to_column('company') %>%
  pivot_longer(cols = -company) %>%
  mutate(name = as.Date(name), 
         year = year(name)) %>%
  group_by(company, year) %>%
  summarise(value = prod(value, na.rm = TRUE))

【讨论】:

  • 我只是将其更改为按月分组以查看每月回报。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 2017-03-04
  • 1970-01-01
相关资源
最近更新 更多