Criar tabela financiamento price

Estou fazendo no R as tabelas de financiamento pelo sistema sac e price, o código do sistema sac consegui fazer:

#codigo para sac---------------------------------------------
library(tidyverse)

sac ← function(pv, i, n) {

tibble(“periodo” = 1:n, “amortização” = pv/n) %>%
mutate(“saldo_devedor” = pv-(periodo*amortização),
“juros” = (saldo_devedor + amortização)*i,
“prestação” = amortização + juros) %>%
rbind(c(0,0,pv,0)) %>%
arrange(periodo)
}

sac(pv = 100, i = 0.05, n = 5) #i está em decimal, isto é, 5/100
#--------------------------------------------------

Já pelo sistema price não estou obtendo êxito,
Segue abaixo um modelo feito no Excel (sem preconceito rsrs) para exemplificar

image

Na coluna juros, na célula D3 eu preciso multiplicar pelo que está na célula E2 e não consegui, segue também a tabela com os valores esperados pelo exemplo.
Agradeço quem puder auxiliar na construção do código.

Puxa, tive q dar uma boa estudada, difícil! Segue 3 soluções: uma na mão e duas por funções prontas.
O desafio foi escrever a lógica do “saldo_devedor” que no caso da tabela PRICE, não dá pra escrever em função das infos da própria linha, tem que fazer um acumulado.

Veja se isso aí tá legal…

library(tidyverse)
library(purrr)

# Função própria
price <- function(pv, i, n) {
    prestação <- pv*i/(1 - (1 + i)^(-n))
    periodo = 1:n
    
    # E2 - C3 ---> 
    # E2 - B3 - D3 ---> 
    # E2 - PRESTACAO - i*E2 ----> 
    # E2*(1 - i) - PRESTACAO
    
    saldo_dev_t <- function(saldo_dev_t_menos_um, p) saldo_dev_t_menos_um*(1 + i) - prestação 
    
    tibble(
        saldo_devedor = accumulate(periodo, saldo_dev_t, .init = pv), # <--- saldo devedor
        juros = lag(saldo_devedor, default = 0)*i,
        prestação = c(0, rep(prestação, n)),
        amortização = prestação - juros,
        periodo = c(0, periodo)
    )
}

price(i = 0.05, n = 5, pv = 100) 
#> # A tibble: 6 x 5
#>   saldo_devedor juros prestação amortização periodo
#>           <dbl> <dbl>     <dbl>       <dbl>   <dbl>
#> 1      1.00e+ 2  0          0           0         0
#> 2      8.19e+ 1  5         23.1        18.1       1
#> 3      6.29e+ 1  4.10      23.1        19.0       2
#> 4      4.29e+ 1  3.15      23.1        20.0       3
#> 5      2.20e+ 1  2.15      23.1        21.0       4
#> 6      1.31e-13  1.10      23.1        22.0       5

# pacote {capitalR}
library(capitalR)
capitalR::schedule(r = 0.05, n = 5, pv = 100) 
#>   Period Payment Cum.Pmt Interest Cum.Int Principal Cum.Prin Rem.Bal
#> 1      0     0.0     0.0     0.00    0.00      0.00     0.00  100.00
#> 2      1    23.1    23.1     5.00    5.00     18.10    18.10   81.90
#> 3      2    23.1    46.2     4.10    9.10     19.00    37.10   62.90
#> 4      3    23.1    69.3     3.15   12.25     19.95    57.05   42.95
#> 5      4    23.1    92.4     2.15   14.40     20.95    78.00   22.00
#> 6      5    23.1   115.5     1.10   15.50     22.00   100.00    0.00

# pacote {FinancialMath}
FinancialMath::amort.table(Loan = 100, n = 5,i = 0.05)
#> $Schedule
#>   Payment Interest Paid Principal Paid Balance
#> 1    23.1          5.00          18.10   81.90
#> 2    23.1          4.10          19.00   62.90
#> 3    23.1          3.15          19.95   42.95
#> 4    23.1          2.15          20.95   22.00
#> 5    23.1          1.10          22.00    0.00
#> 
#> $Other
#>                Details
#> Loan            100.00
#> Total Paid      115.49
#> Total Interest   15.49
#> Eff Rate          0.05

Created on 2021-01-12 by the reprex package (v0.3.0)

Excelente, resolveu o problema, vou utilizar a primeira opção com purrr::accumulate pois abre a opção de acrescentar novas colunas caso necessário, preciso aprofundar mais em purrr. Vlw

1 curtida