【问题标题】:Discounting Future Cash Flows贴现未来现金流
【发布时间】:2019-02-04 11:06:02
【问题描述】:

我在使用 R 的 dplyr 包对特定状态下的账户现金流进行贴现时遇到了一些麻烦。

对于我的例子,我们假设一个账户的数据集如下:

+--------+--------+-------+-----------+--+
| PERIOD | STAGE  | RATE  | CASH FLOW |  |
+--------+--------+-------+-----------+--+
|      1 | Open   | 10%   |       100 |  |
|      2 | Open   | 10.5% |       120 |  |
|      3 | Open   | 10%   |        50 |  |
|      4 | Open   | 11%   |        40 |  |
|      5 | Closed | 10%   |         0 |  |
|      6 | Closed | 11%   |         0 |  |
|      7 | Open   | 11%   |        30 |  |
|      8 | Open   | 10%   |        40 |  |
|      9 | Open   | 10.2% |        50 |  |
+--------+--------+-------+-----------+--+

帐户在 1-4 和 7-9 期间处于“打开”阶段。

我想使用 R 中的 dplyr 包计算贴现的未来现金流,在每个观察日期使用适用于特定时期的利率。

想要的结果应该如下:


| PERIOD | STAGE  | RATE  | CASH FLOW | PV of Cash Flows  |
|--------|--------|-------|-----------|-------------------|
|      1 | Open   | 10%   |       100 | 279.3797 (1)      |
|      2 | Open   | 10.5% |       120 | 198.5124 (2)      |
|      3 | Open   | 10%   |        50 | 86.036 (3)        |
|      4 | Open   | 11%   |        40 | 40                |
|      5 | Closed | 10%   |         0 | NA                |
|      6 | Closed | 11%   |         0 | NA                |
|      7 | Open   | 11%   |        30 | 107.6109 (4)      |
|      8 | Open   | 10%   |        40 | 85,37205 (5)      |
|      9 | Open   | 10.2% |        50 | 50                |

地点:

(1) = 100 + 120 /(1.105) + 50 /{(1.1)(1.105)} + 40 /{(1.11)(1.1)(1.105)}

(2) = 120 + 50 /(1.1) + 40 /{(1.11)(1.1)}

(3) = 50 + 40 /(1.11)

(4) = 30 + 40 /(1.1) + 50 /{(1.102)(1.1)}

(5) = 40 + 50 / (1.102)

使用 dplyr 语法是否可以达到预期的效果?

与该问题相关的一些其他问题:

  • 代码解决方案必须是通用的,即不同的账户可能有不同的结构
  • 我使用的数据集比较大(因此)我想避免循环(如果可能的话)。
  • 每个“打开”阶段都独立于下一个阶段,如说明性示例所示。换言之,在第 1-4 期的第一个“开放”阶段,将不考虑第 7-9 期的现金流量。

如果有任何建议/示例代码,我将不胜感激。

提前致谢!


更新:

数据结构:

structure(list(Period = 1:9, Stage = structure(c(2L, 2L, 2L, 
2L, 1L, 1L, 2L, 2L, 2L), .Label = c("Close", "Open"), class = "factor"), 
    Rate = c(0.1, 0.105, 0.1, 0.11, 0.1, 0.11, 0.11, 0.1, 0.102
    ), Cash_flow = c(100, 120, 50, 40, 0, 0, 30, 40, 50)), class = "data.frame", row.names = c(NA, 
-9L))

【问题讨论】:

  • 你试过什么?您能否使用dput() 以可重现的格式共享数据?
  • 我在原帖中添加了数据结构。目前,我不知道如何在不使用循环贴现剩余观察值的情况下使用未来每个时间段的利率和现金流量来处理此问题。

标签: r dplyr


【解决方案1】:

这是一个使用dplyr 混合少量data.table 的解决方案:

library(dplyr)
data %>% 
  arrange(-Period) %>%
  group_by(stage_nr = data.table::rleid(Stage)) %>% 
  mutate(pv_cf = Cash_flow + cumsum(lag(Cash_flow, default = 0) / (1 + lag(Rate, default = 0)))) %>%
  arrange(Period)

  Period Stage  Rate Cash_flow PV_cf stage_nr pv_cf
   <int> <fct> <dbl>     <dbl> <dbl>    <int> <dbl>
1      1 Open  0.1         100 290.         3 290. 
2      2 Open  0.105       120 201.         3 201. 
3      3 Open  0.1          50  86.0        3  86.0
4      4 Open  0.11         40  40          3  40  
5      5 Close 0.1           0   0          2   0  
6      6 Close 0.11          0   0          2   0  
7      7 Open  0.11         30 112.         1 112. 
8      8 Open  0.1          40  85.4        1  85.4
9      9 Open  0.102        50  50          1  50  

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    相关资源
    最近更新 更多