Modelagem de sistemas de amortização de dívida em R

2025-04-26,-Modelagem-de-sistemas-de-amortização-de-divida-em-R.knit

Este documento apresenta a modelagem e a simulação de diferentes sistemas de amortização de dívidas, com o objetivo de ilustrar suas principais características, a evolução dos saldos devedores e o comportamento das prestações ao longo do tempo. A construção dos fluxos financeiros considera valores nominais, a aplicação de taxas de juros efetivas e, em alguns casos, a adoção de mecanismos de correção monetária periódica.

Os resultados de cada simulação são organizados na forma de séries temporais, permitindo uma análise detalhada da dinâmica de pagamento associada a cada sistema.

Os sistemas de amortização abordados neste trabalho são:

  • Sistema Price (Sistema Francês de Amortização);
  • Sistema de Amortização Constante (SAC), sem carência;
  • Sistema de Amortização Constante (SAC), com carência inicial;
  • Sistema SAC Corrigido, com aplicação de correção monetária;
  • Sistema SAC parametrizado, com carência e correção, representando contratos como o BNDES;
  • Modelo de pagamentos semestrais, utilizado em contratos internacionais, exemplificado pelo contrato BID.

1. Sistema Price

O Sistema Price, também denominado Sistema Francês de Amortização, é caracterizado pelo pagamento de prestações constantes ao longo de todo o contrato. A cada vencimento, a parcela de juros é calculada sobre o saldo devedor do período anterior, enquanto a parcela de amortização corresponde à diferença entre o valor fixo da prestação e os juros incidentes. Ao longo do tempo, a participação dos juros nas prestações diminui gradativamente, enquanto a parcela de amortização aumenta, promovendo a redução progressiva do saldo devedor.

# Carregar pacotes necessários
library(mondate)
library(xts)

# Definições iniciais
PV <- 116000                 # Valor presente
i <- (1.1102)^(1/12) - 1      # Taxa de juros mensal
TR <- (1.00)^(1/12) - 1       # Correção monetária (neste caso, zero)
n <- 156                     # Número de períodos (meses)

# Inicializar vetores
Juros <- Amort <- Prest <- Saldo <- rep(0, n)

# Cálculo do 1º mês
Prest[1] <- PV * (i * (1 + i)^n) / ((1 + i)^n - 1)
Juros[1] <- PV * i * (1 + TR)
Amort[1] <- Prest[1] - Juros[1]
Saldo[1] <- PV - Amort[1]

# Cálculo dos demais meses
for (t in 2:n) {
  Prest[t] <- Saldo[t - 1] * (i * (1 + i)^(n - t + 1)) / ((1 + i)^(n - t + 1) - 1)
  Juros[t] <- Saldo[t - 1] * i * (1 + TR)
  Amort[t] <- Prest[t] - Juros[t]
  Saldo[t] <- Saldo[t - 1] - Amort[t]
}

# Construir data.frame
Price_df <- round(data.frame(
  Amortizacao = Amort,
  Juros = Juros,
  Prestacao = Prest,
  Saldo_Devedor = Saldo
), 2)

# Criar índice de datas
datas <- seq(as.Date("2022-01-01"), by = "month", length.out = n)

# Converter para xts
Price_xts <- xts(Price_df, order.by = datas)

# Exibir resultado
Price_xts
##            Amortizacao   Juros Prestacao Saldo_Devedor
## 2022-01-01      350.91 1014.97   1365.88     115649.09
## 2022-02-01      353.98 1011.90   1365.88     115295.11
## 2022-03-01      357.08 1008.80   1365.88     114938.03
## 2022-04-01      360.20 1005.68   1365.88     114577.83
## 2022-05-01      363.35 1002.53   1365.88     114214.47
## 2022-06-01      366.53  999.35   1365.88     113847.94
## 2022-07-01      369.74  996.14   1365.88     113478.20
## 2022-08-01      372.98  992.90   1365.88     113105.22
## 2022-09-01      376.24  989.64   1365.88     112728.98
## 2022-10-01      379.53  986.35   1365.88     112349.45
##        ...                                            
## 2034-03-01     1251.93  113.96   1365.88      11771.94
## 2034-04-01     1262.88  103.00   1365.88      10509.06
## 2034-05-01     1273.93   91.95   1365.88       9235.13
## 2034-06-01     1285.08   80.80   1365.88       7950.05
## 2034-07-01     1296.32   69.56   1365.88       6653.73
## 2034-08-01     1307.66   58.22   1365.88       5346.07
## 2034-09-01     1319.10   46.78   1365.88       4026.97
## 2034-10-01     1330.65   35.23   1365.88       2696.32
## 2034-11-01     1342.29   23.59   1365.88       1354.03
## 2034-12-01     1354.03   11.85   1365.88          0.00

2. Sistema SAC (sem carência)

O Sistema de Amortização Constante (SAC) é caracterizado pela realização de pagamentos periódicos com parcelas de amortização fixas e valores de prestação decrescentes ao longo do tempo. Em cada período, a parcela destinada à amortização do saldo devedor permanece constante, enquanto a parcela de juros é calculada sobre o saldo remanescente, resultando na redução gradual do valor total pago a cada mês. Esse sistema é amplamente utilizado em financiamentos de longo prazo, pois proporciona uma diminuição progressiva do encargo financeiro para o devedor.

# Carregar pacotes necessários
library(mondate)
library(xts)

# Definições iniciais
PV <- 116000                 # Valor presente
i <- (1.1102)^(1/12) - 1      # Taxa de juros mensal
n <- 156                     # Número de períodos (meses)

# Inicializar vetores
Amort <- rep(PV / n, n)
Juros <- Prest <- Saldo <- rep(0, n)

# Cálculo do 1º mês
Juros[1] <- PV * i
Prest[1] <- Juros[1] + Amort[1]
Saldo[1] <- PV - Amort[1]

# Cálculo dos demais meses
for (t in 2:n) {
  Juros[t] <- i * Saldo[t - 1]
  Saldo[t] <- Saldo[t - 1] - Amort[t]
  Prest[t] <- Juros[t] + Amort[t]
}

# Construir data.frame
SAC_sem_carencia_df <- round(data.frame(
  Amortizacao = Amort,
  Juros = Juros,
  Prestacao = Prest,
  Saldo_Devedor = Saldo
), 2)

# Criar índice de datas
datas <- seq(as.Date("2022-01-01"), by = "month", length.out = n)

# Converter para xts
SAC_sem_carencia_xts <- xts(SAC_sem_carencia_df, order.by = datas)

# Exibir resultado
SAC_sem_carencia_xts
##            Amortizacao   Juros Prestacao Saldo_Devedor
## 2022-01-01      743.59 1014.97   1758.56     115256.41
## 2022-02-01      743.59 1008.46   1752.05     114512.82
## 2022-03-01      743.59 1001.96   1745.55     113769.23
## 2022-04-01      743.59  995.45   1739.04     113025.64
## 2022-05-01      743.59  988.94   1732.53     112282.05
## 2022-06-01      743.59  982.44   1726.03     111538.46
## 2022-07-01      743.59  975.93   1719.52     110794.87
## 2022-08-01      743.59  969.43   1713.02     110051.28
## 2022-09-01      743.59  962.92   1706.51     109307.69
## 2022-10-01      743.59  956.41   1700.00     108564.10
##        ...                                            
## 2034-03-01      743.59   65.06    808.65       6692.31
## 2034-04-01      743.59   58.56    802.15       5948.72
## 2034-05-01      743.59   52.05    795.64       5205.13
## 2034-06-01      743.59   45.54    789.13       4461.54
## 2034-07-01      743.59   39.04    782.63       3717.95
## 2034-08-01      743.59   32.53    776.12       2974.36
## 2034-09-01      743.59   26.02    769.61       2230.77
## 2034-10-01      743.59   19.52    763.11       1487.18
## 2034-11-01      743.59   13.01    756.60        743.59
## 2034-12-01      743.59    6.51    750.10          0.00

3. Sistema SAC (com carência)

# Carregar pacotes necessários
library(mondate)
library(xts)

# Definições iniciais
PV <- 116000                 # Valor presente
i <- (1.1102)^(1/12) - 1      # Taxa de juros mensal
n <- 156                     # Número de períodos (meses)
c <- 6                       # Carência de 6 meses

# Inicializar vetores
Amort <- Juros <- Prest <- Saldo <- rep(0, n)

# Cálculo
for (t in 1:n) {
  Juros[t] <- ifelse(t == 1, PV * i, i * Saldo[t - 1])
  Amort[t] <- ifelse(t <= c, 0, PV / (n - c))
  Saldo[t] <- ifelse(t == 1, PV - Amort[t], Saldo[t - 1] - Amort[t])
  Prest[t] <- Juros[t] + Amort[t]
}

# Construir data.frame
SAC_com_carencia_df <- round(data.frame(
  Amortizacao = Amort,
  Juros = Juros,
  Prestacao = Prest,
  Saldo_Devedor = Saldo
), 2)

# Criar índice de datas
datas <- seq(as.Date("2022-01-01"), by = "month", length.out = n)

# Converter para xts
SAC_com_carencia_xts <- xts(SAC_com_carencia_df, order.by = datas)

# Exibir resultado
SAC_com_carencia_xts
##            Amortizacao   Juros Prestacao Saldo_Devedor
## 2022-01-01        0.00 1014.97   1014.97     116000.00
## 2022-02-01        0.00 1014.97   1014.97     116000.00
## 2022-03-01        0.00 1014.97   1014.97     116000.00
## 2022-04-01        0.00 1014.97   1014.97     116000.00
## 2022-05-01        0.00 1014.97   1014.97     116000.00
## 2022-06-01        0.00 1014.97   1014.97     116000.00
## 2022-07-01      773.33 1014.97   1788.30     115226.67
## 2022-08-01      773.33 1008.20   1781.54     114453.33
## 2022-09-01      773.33 1001.44   1774.77     113680.00
## 2022-10-01      773.33  994.67   1768.00     112906.67
##        ...                                            
## 2034-03-01      773.33   67.66    841.00       6960.00
## 2034-04-01      773.33   60.90    834.23       6186.67
## 2034-05-01      773.33   54.13    827.47       5413.33
## 2034-06-01      773.33   47.37    820.70       4640.00
## 2034-07-01      773.33   40.60    813.93       3866.67
## 2034-08-01      773.33   33.83    807.17       3093.33
## 2034-09-01      773.33   27.07    800.40       2320.00
## 2034-10-01      773.33   20.30    793.63       1546.67
## 2034-11-01      773.33   13.53    786.87        773.33
## 2034-12-01      773.33    6.77    780.10          0.00

4. Sistema SAC Corrido (com indexação)

# Carregar pacotes necessários
library(mondate)
library(xts)

# Definições iniciais
PV <- 116000                 # Valor presente
i <- (1.1102)^(1/12) - 1      # Taxa de juros mensal
TR <- (1.03)^(1/12) - 1       # Correção monetária mensal
n <- 156                     # Número de períodos (meses)

# Inicializar vetores
Amort <- rep(PV / n, n)
Juros <- Prest <- Saldo <- rep(0, n)

# Cálculo do 1º mês
Juros[1] <- PV * i * (1 + TR)
Saldo[1] <- (PV - Amort[1]) * (1 + TR)
Prest[1] <- Juros[1] + Amort[1]

# Cálculo dos demais meses
for (t in 2:n) {
  Juros[t] <- Saldo[t - 1] * i * (1 + TR)
  Saldo[t] <- (Saldo[t - 1] - Amort[t]) * (1 + TR)
  Prest[t] <- Juros[t] + Amort[t]
}

# Ajuste final: zerar saldo residual
Saldo[n] <- 0

# Construir data.frame
SAC_corrigido_df <- round(data.frame(
  Amortizacao = Amort,
  Juros = Juros,
  Prestacao = Prest,
  Saldo_Devedor = Saldo
), 2)

# Criar índice de datas
datas <- seq(as.Date("2022-01-01"), by = "month", length.out = n)

# Converter para xts
SAC_corrigido_xts <- xts(SAC_corrigido_df, order.by = datas)

# Exibir resultado
SAC_corrigido_xts
##            Amortizacao   Juros Prestacao Saldo_Devedor
## 2022-01-01      743.59 1017.47   1761.06     115540.66
## 2022-02-01      743.59 1013.44   1757.03     115080.19
## 2022-03-01      743.59 1009.40   1752.99     114618.59
## 2022-04-01      743.59 1005.36   1748.95     114155.85
## 2022-05-01      743.59 1001.30   1744.89     113691.96
## 2022-06-01      743.59  997.23   1740.82     113226.93
## 2022-07-01      743.59  993.15   1736.74     112760.76
## 2022-08-01      743.59  989.06   1732.65     112293.43
## 2022-09-01      743.59  984.96   1728.55     111824.95
## 2022-10-01      743.59  980.85   1724.44     111355.32
##        ...                                            
## 2034-03-01      743.59  310.43   1054.02      34733.58
## 2034-04-01      743.59  304.66   1048.25      34073.82
## 2034-05-01      743.59  298.87   1042.46      33412.43
## 2034-06-01      743.59  293.07   1036.66      32749.41
## 2034-07-01      743.59  287.26   1030.85      32084.76
## 2034-08-01      743.59  281.43   1025.02      31418.46
## 2034-09-01      743.59  275.58   1019.17      30750.52
## 2034-10-01      743.59  269.72   1013.31      30080.94
## 2034-11-01      743.59  263.85   1007.44      29409.70
## 2034-12-01      743.59  257.96   1001.55          0.00

5. Sistema SAC com função - Correção e Carência (Exemplo BNDES)

calculate_sac <- function(ano_base, ano_final, carencia, P, i) {
  n <- ceiling(as.numeric((as.Date(ano_final) - as.Date(ano_base)) / 30.4375))
  
  Juros <- Amort <- Prest <- Saldo <- rep(0, n)
  Amort[(carencia + 1):n] <- P / (n - carencia)
  
  Juros[1] <- P * i
  Prest[1] <- Juros[1] + Amort[1]
  Saldo[1] <- P - Amort[1]
  
  for (t in 2:n) {
    Juros[t] <- i * Saldo[t - 1]
    Saldo[t] <- Saldo[t - 1] - Amort[t]
    Prest[t] <- Juros[t] + Amort[t]
  }
  
  dates <- seq(as.Date(ano_base), by = "month", length.out = n)
  result <- round(data.frame(Juros, Amortizacao = Amort, Prestacao = Prest, Saldo_Devedor = Saldo), 2)
  
  xts(result, order.by = dates)
}

resultado_c1410 <- calculate_sac(
  ano_base = as.mondate("2022-01-01"),
  ano_final = as.mondate("2031-12-15"),
  carencia = 1,
  P = 36921.46996,
  i = (1.08)^(1/12) - 1
)

resultado_c1410
##             Juros Amortizacao Prestacao Saldo_Devedor
## 2022-01-01 237.55        0.00    237.55      36921.47
## 2022-02-01 237.55      310.26    547.82      36611.21
## 2022-03-01 235.56      310.26    545.82      36300.94
## 2022-04-01 233.56      310.26    543.83      35990.68
## 2022-05-01 231.57      310.26    541.83      35680.41
## 2022-06-01 229.57      310.26    539.83      35370.15
## 2022-07-01 227.57      310.26    537.84      35059.88
## 2022-08-01 225.58      310.26    535.84      34749.62
## 2022-09-01 223.58      310.26    533.84      34439.35
## 2022-10-01 221.58      310.26    531.85      34129.09
##        ...                                           
## 2031-03-01  19.96      310.26    330.23       2792.38
## 2031-04-01  17.97      310.26    328.23       2482.12
## 2031-05-01  15.97      310.26    326.23       2171.85
## 2031-06-01  13.97      310.26    324.24       1861.59
## 2031-07-01  11.98      310.26    322.24       1551.32
## 2031-08-01   9.98      310.26    320.25       1241.06
## 2031-09-01   7.99      310.26    318.25        930.79
## 2031-10-01   5.99      310.26    316.25        620.53
## 2031-11-01   3.99      310.26    314.26        310.26
## 2031-12-01   2.00      310.26    312.26          0.00

6. Contratos Internacionais - Pagamentos Semestrais (Exemplo BID)

Em contratos internacionais de financiamento, como aqueles firmados com organismos multilaterais, é comum a adoção de sistemas de pagamento semestrais. Nesse modelo, os juros são calculados com base no saldo devedor existente a cada semestre, e as amortizações ocorrem de forma periódica, reduzindo gradativamente o montante principal da dívida. Entre os pagamentos, o saldo devedor permanece constante. Essa estrutura proporciona previsibilidade aos fluxos financeiros do devedor e facilita a gestão do serviço da dívida ao longo do período contratual.

calculate_c1343 <- function(ano_base, ano_final, P, i, mes_primeiro_pagamento = 6) {
  n <- ceiling(as.numeric(ano_final - ano_base))
  numero_semestres <- round(ceiling(as.numeric(ano_final - ano_base)) / 12 * 2, 0)
  seq_pgtos <- seq(from = mes_primeiro_pagamento, to = n, by = 6)
  
  Juros <- Amort <- Prest <- Saldo <- rep(0, n)
  Saldo[1] <- P
  
  for (t in 1:n) {
    if (t %in% seq_pgtos) {
      Amort[t] <- P / numero_semestres
      SaldoAnt <- ifelse(t == mes_primeiro_pagamento, Saldo[1], Saldo[t - 6])
      Juros[t] <- i * SaldoAnt
      Saldo[t] <- SaldoAnt - Amort[t]
      Prest[t] <- Juros[t] + Amort[t]
    } else if (t > 1) {
      Saldo[t] <- Saldo[t - 1]
    }
  }
  
  dates <- seq(as.Date(ano_base), by = "month", length.out = n)
  result <- round(data.frame(Juros, Amortizacao = Amort, Prestacao = Prest, Saldo_Devedor = Saldo), 2)
  
  xts(result, order.by = dates)
}

resultado_c1343 <- calculate_c1343(
  ano_base = as.mondate("2022-01-01"),
  ano_final = as.mondate("2031-12-31"),
  P = 251122.50,
  i = 2.65 / 200,
  mes_primeiro_pagamento = 6
)

resultado_c1343
##              Juros Amortizacao Prestacao Saldo_Devedor
## 2022-01-01    0.00        0.00      0.00     251122.50
## 2022-02-01    0.00        0.00      0.00     251122.50
## 2022-03-01    0.00        0.00      0.00     251122.50
## 2022-04-01    0.00        0.00      0.00     251122.50
## 2022-05-01    0.00        0.00      0.00     251122.50
## 2022-06-01 3327.37    12556.12  15883.50     238566.38
## 2022-07-01    0.00        0.00      0.00     238566.38
## 2022-08-01    0.00        0.00      0.00     238566.38
## 2022-09-01    0.00        0.00      0.00     238566.38
## 2022-10-01    0.00        0.00      0.00     238566.38
##        ...                                            
## 2031-03-01    0.00        0.00      0.00      25112.25
## 2031-04-01    0.00        0.00      0.00      25112.25
## 2031-05-01    0.00        0.00      0.00      25112.25
## 2031-06-01  332.74    12556.12  12888.86      12556.12
## 2031-07-01    0.00        0.00      0.00      12556.12
## 2031-08-01    0.00        0.00      0.00      12556.12
## 2031-09-01    0.00        0.00      0.00      12556.12
## 2031-10-01    0.00        0.00      0.00      12556.12
## 2031-11-01    0.00        0.00      0.00      12556.12
## 2031-12-01  166.37    12556.12  12722.49          0.00
Facebook
LinkedIn
Telegram
WhatsApp
Email

Nova Política Fiscal em 100 dias

2025-04-15,-Nova-Politica-Fiscal-em-100-dias.knit 1 – Estruturação do Plano de Equilíbrio Financeiro O Plano de Equilíbrio Financeiro, atualmente em execução no Município de

Leia mais »
plugins premium WordPress
error: O conteúdo é protegido!!
Rolar para cima