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
类似的现有主题大多使用股票价格而不是 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