计算 R 的滚动投资(通过再投资回报)

时间:2021-03-03 19:30:58

标签: r loops return finance

我有一个数据框:

> 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 中执行此操作?

1 个答案:

答案 0 :(得分:0)

我们可以在进行group by操作后使用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"))
相关问题