【问题标题】:Calculating rolling investment in R (by reinvesting returns)计算 R 的滚动投资(通过再投资回报)
【发布时间】:2021-06-02 10:19:21
【问题描述】:

我有一个数据框:

> df
    date group return
1 197501     A  1.020
2 197502     A  1.050
3 197503     A  1.031
4 197504     A  0.970
5 197501     B  0.990
6 197502     B  1.023
7 197503     B  1.040
8 197504     B  1.050

我想创建一个新列“inv”来指示我的投资增长,即我在 197501 投资了 1,000,000,然后我需要计算我的投资回报(加上上个月的回报)。此外,我有组,这意味着每次新组开始时,第一行应该从 1,000,000 * return 开始。

这意味着:

在第 1 行,我想要

1,000,000 * 1.020 = 1,020,000 

然后我想要在第 2 行

1,020,000 * 1.050 = 1,071,000

等等

在第 5 行(b 组)我想要

1,000,000 * 0.990 = 990,000

在第 6 行(b 组)我想要

990,000 * 1.023 = 1,012,770

等等

最终结果应该是这样的:

    date group return        inv
1 197501     A  1.020 1020000.00
2 197502     A  1.050 1071000.00
3 197503     A  1.031 1104201.00
4 197504     A  0.970 1071075.97
5 197501     B  0.990  990000.00
6 197502     B  1.023 1012770.00
7 197503     B  1.040 1053281.80
8 197504     B  1.050 1105945.84

如何在 R 中做到这一点?

【问题讨论】:

    标签: r loops return finance


    【解决方案1】:

    进行分组操作后我们可以使用cumprod

    library(dplyr)
    df1 <- df %>% 
             group_by(group) %>%
             mutate(inv = 1000000 *cumprod(return)) %>%
             ungroup
    

    -输出

    df1
    # A tibble: 8 x 4
    #    date group return      inv
    #   <int> <chr>  <dbl>    <dbl>
    #1 197501 A       1.02 1020000 
    #2 197502 A       1.05 1071000.
    #3 197503 A       1.03 1104201 
    #4 197504 A       0.97 1071075.
    #5 197501 B       0.99  990000 
    #6 197502 B       1.02 1012770 
    #7 197503 B       1.04 1053281.
    #8 197504 B       1.05 1105945.
    

    或者使用base R

    df$inv <- with(df, 1000000 * ave(return, group, FUN = cumprod))
    

    数据

    df <- structure(list(date = c(197501L, 197502L, 197503L, 197504L, 197501L, 
    197502L, 197503L, 197504L), group = c("A", "A", "A", "A", "B", 
    "B", "B", "B"), return = c(1.02, 1.05, 1.031, 0.97, 0.99, 1.023, 
    1.04, 1.05)), class = "data.frame", row.names = c("1", "2", "3", 
    "4", "5", "6", "7", "8"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-27
      • 2018-02-19
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多