R语言 计算多个滞后值的乘积

yi0zb3m4  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(172)

我有以下类型的数据框架,其中的日期可能不平衡,并且在RETURN列中可能有一些缺失的数据:
| 日期|代码|退货|
| - ------|- ------|- ------|
| 二零零零年一月一日|资产_1| -0.02 |
| 二零零零年二月一日|资产_1|0.02分|
| 二零零零年三月一日|资产_1|0.01分|
| 二零零零年四月一日|资产_1|0.02分|
| 二零零零年五月一日|资产_1|0.03分|
| 二零零零年六月一日|资产_1| -0.02 |
| 二零零零年七月一日|资产_1|0.05分|
| 二零零零年八月一日|资产_1| -0.04 |
| 二零零零年九月一日|资产_1| -0.02 |
| 二零零零年十月一日|资产_1|无|
| 二○ ○ ○年十一月一日|资产_1|0.05分|
| 二零零零年十二月一日|资产_1|0.03分|
| 二零零零年三月一日|资产_2|不适用|
| 二零零零年四月一日|资产_2| -0.02 |
| 二零零零年五月一日|资产_2|不适用|
| 二零零零年六月一日|资产_2| -0.03 |
| 二零零零年七月一日|资产_2|0.05分|
| 二零零零年八月一日|资产_2|0.02分|
| 二零零零年九月一日|资产_2| -0.03 |
| 二零零零年十月一日|资产_2|0.04|
| 二○ ○ ○年十一月一日|资产_2|0.04|
| 二零零零年十二月一日|资产_2|0.04|
| 二零零一年一月一日|资产_2| -0.03 |
我想计算每项资产从T - 12到T - 2的累计回报。因此,以2001-01-01为例,累计回报将是从2000-01-01到2000-11-01,并将其添加到新列中。
因此,对于2001年1月1日的ASSET_1,我得到的值为0.98 * 1.02 * 1.01 * 1.02 * 1.03 * 0.98 * 1.05 * 0.96 * 0.98 * 1.00 * 1.05 - 1 = 0.08
如果无法计算此类回报(NA值或没有足够的时间来计算此类数字),则累计回报将为NA。
如果不创建一堆滞后(返回)列,我就无法解决这个问题。有更简单的方法吗?

bwitn5fc

bwitn5fc1#

一个快速而粗略的解决方案(假设时间上没有间隙)是计算cumprod的累积乘积,然后对每个资产仅延迟第13行或更多行(T0):

  1. library("dplyr")
  2. library("magrittr")
  3. library("tibble")
  4. data <-
  5. structure(list(DATE = structure(c(10957, 10988, 11017, 11048,
  6. 11078, 11109, 11139, 11170,
  7. 11201, 11231, 11262, 11292, 11323,
  8. 11017, 11048, 11078, 11109, 11139,
  9. 11170, 11201, 11231, 11262,
  10. 11292, 11323), class = "Date"),
  11. CODE = c("ASSET_1", "ASSET_1", "ASSET_1", "ASSET_1", "ASSET_1",
  12. "ASSET_1", "ASSET_1", "ASSET_1", "ASSET_1", "ASSET_1",
  13. "ASSET_1", "ASSET_1", "ASSET_1",
  14. "ASSET_2", "ASSET_2", "ASSET_2",
  15. "ASSET_2", "ASSET_2", "ASSET_2", "ASSET_2", "ASSET_2",
  16. "ASSET_2", "ASSET_2", "ASSET_2"),
  17. RETURN = c(-0.02, 0.02, 0.01, 0.02, 0.03, -0.02, 0.05, -0.04,
  18. -0.02, 0, 0.05, 0.03, 0.01, NA, -0.02, NA, -0.03, 0.05, 0.02,
  19. -0.03, 0.04, 0.04, 0.04, -0.03)),
  20. class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -24L))
  21. want <-
  22. data %>%
  23. group_by(CODE) %>%
  24. arrange(DATE, .by_group = TRUE) %>%
  25. mutate(row_in_g = seq_len(n())) %>%
  26. mutate(cumulative_return = if_else(row_in_g >= 13,
  27. lag(cumprod(RETURN + 1), 2) - 1,
  28. NA_real_)) %>%
  29. select(-row_in_g) %>%
  30. ungroup()

其中:

  1. > print(data, n = 30)
  2. # A tibble: 24 x 3
  3. DATE CODE RETURN
  4. <date> <chr> <dbl>
  5. 1 2000-01-01 ASSET_1 -0.02
  6. 2 2000-02-01 ASSET_1 0.02
  7. 3 2000-03-01 ASSET_1 0.01
  8. 4 2000-04-01 ASSET_1 0.02
  9. 5 2000-05-01 ASSET_1 0.03
  10. 6 2000-06-01 ASSET_1 -0.02
  11. 7 2000-07-01 ASSET_1 0.05
  12. 8 2000-08-01 ASSET_1 -0.04
  13. 9 2000-09-01 ASSET_1 -0.02
  14. 10 2000-10-01 ASSET_1 0
  15. 11 2000-11-01 ASSET_1 0.05
  16. 12 2000-12-01 ASSET_1 0.03
  17. 13 2001-01-01 ASSET_1 0.01
  18. 14 2000-03-01 ASSET_2 NA
  19. 15 2000-04-01 ASSET_2 -0.02
  20. 16 2000-05-01 ASSET_2 NA
  21. 17 2000-06-01 ASSET_2 -0.03
  22. 18 2000-07-01 ASSET_2 0.05
  23. 19 2000-08-01 ASSET_2 0.02
  24. 20 2000-09-01 ASSET_2 -0.03
  25. 21 2000-10-01 ASSET_2 0.04
  26. 22 2000-11-01 ASSET_2 0.04
  27. 23 2000-12-01 ASSET_2 0.04
  28. 24 2001-01-01 ASSET_2 -0.03
  29. >
  30. > print(want, n = 30)
  31. # A tibble: 24 x 4
  32. DATE CODE RETURN cumulative_return
  33. <date> <chr> <dbl> <dbl>
  34. 1 2000-01-01 ASSET_1 -0.02 NA
  35. 2 2000-02-01 ASSET_1 0.02 NA
  36. 3 2000-03-01 ASSET_1 0.01 NA
  37. 4 2000-04-01 ASSET_1 0.02 NA
  38. 5 2000-05-01 ASSET_1 0.03 NA
  39. 6 2000-06-01 ASSET_1 -0.02 NA
  40. 7 2000-07-01 ASSET_1 0.05 NA
  41. 8 2000-08-01 ASSET_1 -0.04 NA
  42. 9 2000-09-01 ASSET_1 -0.02 NA
  43. 10 2000-10-01 ASSET_1 0 NA
  44. 11 2000-11-01 ASSET_1 0.05 NA
  45. 12 2000-12-01 ASSET_1 0.03 NA
  46. 13 2001-01-01 ASSET_1 0.01 0.0782
  47. 14 2000-03-01 ASSET_2 NA NA
  48. 15 2000-04-01 ASSET_2 -0.02 NA
  49. 16 2000-05-01 ASSET_2 NA NA
  50. 17 2000-06-01 ASSET_2 -0.03 NA
  51. 18 2000-07-01 ASSET_2 0.05 NA
  52. 19 2000-08-01 ASSET_2 0.02 NA
  53. 20 2000-09-01 ASSET_2 -0.03 NA
  54. 21 2000-10-01 ASSET_2 0.04 NA
  55. 22 2000-11-01 ASSET_2 0.04 NA
  56. 23 2000-12-01 ASSET_2 0.04 NA
  57. 24 2001-01-01 ASSET_2 -0.03 NA
展开查看全部

相关问题