R 从每日 returns 创建每月 returns (没有 xts)

R create monthly returns from daily returns (without xts)

类似的现有主题大多使用股票价格而不是 returns,这就是为什么我为我的问题创建了一个新主题。

我正在尝试从每日投资组合 returns 中创建几何每月投资组合 returns,这样:

我首先尝试使用 quantmod 包来做到这一点,但是,函数 monthlyReturn returns 对我的数据集不正确的值,这类似于下面列出的示例数据集(我的代码也没有返回我的期望的输出):

library(dplyr)
library(lubridate)

size = 1e4

df <- data.frame(
Date = sample(seq(as.Date('2020/01/01'), as.Date('2022/01/01'), by="day"), size, replace = TRUE),
Return.Portfolio1 = sample(-2000:2000, size, replace = TRUE)/100000,
Return.Portfolio2 = sample(-3000:3000, size, replace = TRUE)/100000,
Return.Portfolio3 = sample(-4000:4000, size, replace = TRUE)/100000)

df$Month <- lubridate::month(df$Date)
df$Year <- lubridate::year(df$Date)

monthlyreturns <- df %>%
  arrange(Date) %>%
  group_by(Year, Month) %>%
  dplyr::summarise(CumPrdct = (cumprod(buys.minus.sells+1)-1))

期望的输出是:

Year    Month   Return
2020    01  0.0123
2020    02  -0.0231

您的解决方案很接近,您只需要 prod 而不是 cumprod:

library(dplyr)
library(lubridate)

size = 1e4

set.seed(100)
df <- tibble(
  Date = sample(seq(as.Date('2020/01/01'), as.Date('2022/01/01'), by="day"), size, replace = TRUE),
  Return.Portfolio1 = sample(-2000:2000, size, replace = TRUE)/100000,
  Return.Portfolio2 = sample(-3000:3000, size, replace = TRUE)/100000,
  Return.Portfolio3 = sample(-4000:4000, size, replace = TRUE)/100000)

df %>% 
  group_by(Year = year(Date), Month = month(Date)) %>% 
  summarise(
    Return_P1 = prod(Return.Portfolio1 + 1)-1,
    Return_P2 = prod(Return.Portfolio2 + 1)-1,
    Return_P3 = prod(Return.Portfolio3 + 1)-1,
  )
#> `summarise()` has grouped output by 'Year'. You can override using the
#> `.groups` argument.
#> # A tibble: 25 × 5
#> # Groups:   Year [3]
#>     Year Month Return_P1 Return_P2 Return_P3
#>    <dbl> <dbl>     <dbl>     <dbl>     <dbl>
#>  1  2020     1    0.258    0.103     -0.0327
#>  2  2020     2   -0.0911  -0.175     -0.399 
#>  3  2020     3   -0.0140   0.259      0.545 
#>  4  2020     4   -0.116   -0.406      1.09  
#>  5  2020     5    0.555    0.594      0.0872
#>  6  2020     6    0.171   -0.319      0.0246
#>  7  2020     7    0.106   -0.0822    -0.398 
#>  8  2020     8   -0.271    0.239      0.608 
#>  9  2020     9   -0.126    0.131     -0.483 
#> 10  2020    10    0.406   -0.00475   -0.169 
#> # … with 15 more rows