Дисконтирование будущих денежных потоков - PullRequest
0 голосов
/ 04 февраля 2019

У меня возникли проблемы с дисконтированием денежных потоков по счету в определенном состоянии с использованием пакета R's 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.

Я хотел бы рассчитать дисконтированные будущие денежные потоки, используя пакет dplyr в R, на каждую дату наблюдения с использованием ставки, применимой к конкретному периоду.

Желаемый результат должен быть следующим:


| 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))* (3) = 50 + 40 /(1.11)

(4) = 30 + 40 /(1.1) + 50 / enj(1.102)(1.1) coming

(5) =40 + 50 / (1.102)

Можно ли достичь желаемого результата с помощью синтаксиса dplyr?

Некоторые дополнительные вопросы, связанные с проблемой:

  • Кодрешение должно быть общим, то есть разные учетные записи могут иметь разную структуру
  • Набор данных, который я использую, относительно большой (поэтому) я бы хотел избежать циклов (если это возможно).
  • каждый«Открытая» стадия не зависит от следующей стадии, как показано в иллюстративном примере.Другими словами, денежные потоки периода 7 - 9 не будут учитываться для 1-го этапа «Открыто» в течение периода 1-4.

Буду признателен за любой совет / пример кода.

Заранее спасибо!


Обновление:

Структура данных:

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))

1 Ответ

0 голосов
/ 04 февраля 2019

Вот решение, использующее 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...