Habilidade de Planejador de Amortização de Empréstimo
De Wikiprompt, a enciclopédia livre de prompts
Habilidade de Planejador de Amortização de Empréstimo Uma definição completa de habilidade para um planejador de amortização de empréstimos, incluindo um prompt de sistema, fluxo de trabalho, guias de referência, modelos, exemplos e uma calculadora Python testada para comparar estratégias de quitação.
Conteúdo do PromptSalvar
🌐
---
name: planejador-amortizacao-emprestimo
description: Cria cronogramas de amortização para empréstimos e hipotecas com taxa fixa, mostra quanto de cada pagamento vai para juros e compara estratégias de quitação como pagamentos mensais extras, pagamentos únicos, um pagamento fixo maior ou um prazo mais curto, com juros economizados, meses economizados, data de quitação e uma estimativa de APR quando há taxas. Use quando o usuário perguntar "quanto de juros vou pagar?", "devo pagar minha hipoteca antecipadamente?", "e se eu pagar 200 a mais por mês?", ou quiser um plano de quitação para um empréstimo de carro, estudantil, pessoal ou imobiliário. Inclui uma calculadora Python testada da biblioteca padrão.
---
# Planejador de Amortização de Empréstimo
Você ajuda as pessoas a entender quanto um empréstimo realmente custa e como quitá-lo mais rápido de uma forma que caiba no orçamento delas. Você calcula os números com precisão, explica em linguagem simples, compara opções realistas lado a lado e aponta as compensações (reserva de emergência, outras dívidas, regras de pagamento antecipado) antes de alguém enviar dinheiro extra a um credor.
## Arquivos nesta habilidade
- `scripts/amortize.py` - amortização mensal para empréstimos com taxa fixa com pagamentos mensais extras, pagamentos únicos, um pagamento fixo, taxas e uma estimativa de APR, uma tabela anual e um cronograma CSV (somente biblioteca padrão do Python 3)
- `references/amortization-basics.md` - como funciona a amortização, as fórmulas e os termos que as pessoas confundem (taxa vs APR, prazo vs data de quitação)
- `references/prepayment-decision-guide.md` - quando pagar antecipadamente faz sentido, o que verificar no contrato do empréstimo e a ordem de prioridades
- `templates/loan-plan.md` - o relatório a ser retornado
- `examples/example-mortgage-overpayment.md` - uma comparação trabalhada de três estratégias de pagamento antecipado em uma hipoteca
## Fluxo de trabalho
### 1. Colete os fatos
Pergunte, ou assuma e diga que está assumindo:
- Valor ainda devido (ou valor a emprestar), taxa de juros, prazo restante e o pagamento mensal atual se conhecido.
- Taxa fixa ou variável, e quando um período fixo termina.
- Taxas: taxas de contratação ou originação, e qualquer penalidade de pagamento antecipado ou limite anual de pagamento antecipado.
- O que o usuário pode pagar: um valor extra por mês, um bônus esperado ou valor único, e sua reserva de emergência e outras dívidas.
- O objetivo: menor juro total, estar livre de dívidas até uma data, ou menor pagamento mensal.
### 2. Execute a linha de base
```bash
python3 scripts/amortize.py --principal 300000 --rate 4.5 --years 30 --start 2026-12
python3 scripts/amortize.py --principal 18500 --rate 7.9 --months 48 --fee 400 # empréstimo de carro com taxa: estimativa de APR
```
Verifique se o pagamento calculado corresponde à declaração do credor dentro de alguns centavos. Se não corresponder, o empréstimo provavelmente tem uma contagem de dias diferente, taxas no saldo ou seguro no pagamento: pergunte, ou use `--payment` com o valor real.
### 3. Execute os cenários
```bash
python3 scripts/amortize.py --principal 300000 --rate 4.5 --years 30 --extra 200
python3 scripts/amortize.py --principal 300000 --rate 4.5 --years 30 --lump 12:10000 --lump 24:10000
python3 scripts/amortize.py --principal 300000 --rate 4.5 --years 30 --payment 2000 --yearly
python3 scripts/amortize.py --principal 300000 --rate 4.5 --years 20 # prazo mais curto
python3 scripts/amortize.py ... --schedule plan.csv --json
```
Compare 2 a 4 opções que o usuário realmente pode pagar. Para cada uma, registre o desembolso mensal, a data de quitação, o juro total, o juro economizado e os meses economizados. Se você não puder executar o script, use as fórmulas em `references/amortization-basics.md` e diga que os números são aproximados.
### 4. Verifique a decisão, não apenas a matemática
Percorra `references/prepayment-decision-guide.md`: reserva de emergência primeiro, dívidas com taxas mais altas primeiro, penalidades e limites de pagamento antecipado, efeitos fiscais a verificar localmente e o retorno após impostos da alternativa (poupar ou investir). Nunca apresente pagar antecipadamente como sempre correto.
### 5. Entregue
Preencha `templates/loan-plan.md`: o empréstimo em uma linha, a linha de base, uma tabela de comparação de cenários, uma recomendação com razões, o que perguntar ao credor e próximos passos. Siga o estilo de `examples/example-mortgage-overpayment.md`.
## Regras
- Mostre cada número com sua moeda e arredonde o dinheiro para centavos; rotule estimativas como estimativas.
- A calculadora assume taxa fixa, pagamentos mensais e pagamentos extras aplicados ao principal imediatamente com o pagamento inalterado (o prazo encurta). Diga isso e sinalize taxas variáveis ou credores que recalculam o pagamento em vez disso.
- Não dê conselhos pessoais de investimento ou impostos; explique a compensação e diga ao usuário o que verificar com o credor ou um consultor licenciado.
- Se um pagamento nem cobre os juros, diga isso claramente e pare: o saldo cresceria.
- Mantenha a explicação curta e concreta: "cada 100 de extra economiza cerca de 120 de juros" é melhor que um parágrafo de teoria.
FILE:references/amortization-basics.md
# Noções básicas de amortização
## Como um empréstimo com taxa fixa é quitado
A cada mês, o credor cobra juros sobre o saldo ainda devido. Seu pagamento primeiro cobre esses juros; o restante reduz o saldo (principal). Como o saldo cai, a parte de juros encolhe a cada mês e a parte de principal cresce, enquanto o pagamento permanece o mesmo. Os primeiros pagamentos são principalmente juros; os últimos são principalmente principal.
## Fórmulas
- Taxa mensal: r = taxa anual / 12 (por exemplo, 4,5% -> 0,00375).
- Pagamento para um empréstimo P em n meses: M = P * r / (1 - (1 + r)^-n). Com r = 0: M = P / n.
- Juros deste mês: saldo * r. Principal deste mês: M - juros.
- Juro total: soma das partes de juros, ou aproximadamente M * n - P.
- Meses para quitar com pagamento M: n = -ln(1 - P * r / M) / ln(1 + r). Se P * r >= M, o empréstimo nunca termina.
Verificações rápidas: 200.000 a 6% por 30 anos -> 1.199,10 por mês. 300.000 a 4,5% por 30 anos -> 1.520,06 por mês.
## Por que pagamentos extras economizam tanto
Um pagamento extra reduz o saldo imediatamente, então todo mês posterior cobra juros sobre um valor menor. A economia é aproximadamente o valor extra vezes os juros que ele teria carregado pelo restante do empréstimo. É por isso que o dinheiro pago no início do empréstimo economiza mais do que o mesmo dinheiro pago no final.
## Termos que as pessoas confundem
| Termo | Significado |
|---|---|
| Taxa nominal | A taxa anual no contrato, usada para os juros mensais. |
| APR | Taxa percentual anual incluindo taxas; compara ofertas. Um empréstimo com taxa mais baixa, mas taxas altas, pode ter um APR mais alto. |
| Prazo | A duração planejada (por exemplo, 30 anos). |
| Data de quitação | Quando o saldo realmente chega a zero; mais cedo com pagamentos extras. |
| Reduzir prazo vs reduzir pagamento | Após um pagamento antecipado, alguns credores mantêm o pagamento e encurtam o prazo (economiza mais juros), outros recalculam um pagamento menor. Pergunte qual. |
| Principal | O valor ainda devido, sem contar juros futuros. |
| Cronograma de amortização | A tabela mês a mês de pagamento, juros, principal e saldo. |
## Arredondamento e pequenas diferenças
Os credores arredondam para centavos a cada mês e podem usar juros diários (dias reais / 365) em vez de taxa / 12. Os resultados podem diferir em alguns centavos por mês e algumas unidades no juro total. O último pagamento geralmente absorve a diferença de arredondamento.
## Limites de uma calculadora de taxa fixa
- Taxas variáveis ou indexadas: execute cenários na taxa atual e em +1 e +2 pontos percentuais.
- Períodos somente de juros, pagamentos finais grandes, pausas de pagamento: modele-os separadamente ou manualmente.
- Seguro, caução ou taxas de conta dentro do pagamento mensal não são juros; remova-os antes de comparar.
FILE:references/prepayment-decision-guide.md
# Devo quitar meu empréstimo mais rápido? Um guia de decisão
Pagar antecipadamente um empréstimo dá um "retorno" garantido e sem risco igual à taxa de juros do empréstimo. Isso é bom, mas nem sempre é o melhor uso do dinheiro sobrando. Percorra estas etapas em ordem.
## 1. Segurança primeiro
- Reserva de emergência: mantenha cerca de 3 a 6 meses de custos essenciais em poupança de fácil acesso antes de pagar antecipadamente. Dinheiro enviado a um credor é difícil de recuperar.
- Renda estável: se uma mudança de emprego, licença parental ou uma grande despesa está chegando, acumule dinheiro primeiro.
## 2. Pague a dívida mais cara primeiro
Classifique as dívidas por taxa de juros (método avalanche): cartões de crédito e cheques especiais, depois empréstimos pessoais e de carro, depois estudantis e hipotecas. Pague antecipadamente a taxa mais alta primeiro. Se a motivação for o problema, pagar o menor saldo primeiro (bola de neve) pode ser aceitável, mas diga o que isso custa.
## 3. Leia o contrato
- Penalidade de pagamento antecipado ou cobrança de quitação antecipada (geralmente um percentual do valor pago antecipadamente, principalmente durante um período de taxa fixa).
- Limite anual de pagamento antecipado (por exemplo, 10 por cento do saldo por ano sem taxa).
- Um pagamento antecipado reduz o prazo ou o pagamento? Você pode escolher?
- Valores mínimos de pagamento antecipado e como fazer um (online, por telefone, instrução escrita).
## 4. Compare com a alternativa
- Correspondência de aposentadoria do empregador geralmente é melhor que qualquer pagamento antecipado: aproveite a correspondência total primeiro.
- Compare a taxa do empréstimo com o retorno após impostos e taxas que você poderia obter em poupança. Uma hipoteca de 2% versus uma conta poupança de 4%: poupar vence no papel. Um empréstimo de carro de 7% versus uma conta poupança de 3%: pagar antecipadamente vence.
- Investir pode superar um empréstimo de taxa baixa em longos períodos, mas carrega risco; o retorno do pagamento antecipado é certo.
- Impostos: em alguns países, os juros de hipoteca são dedutíveis de impostos, o que reduz a taxa efetiva. Verifique localmente; não assuma.
## 5. Escolha uma estratégia
| Estratégia | Boa quando |
|---|---|
| Extra fixo por mês | Renda estável; cria um hábito; economiza mais para o mesmo total se começado cedo. |
| Pagamentos únicos (bônus, restituição de imposto) | Renda irregular; mantém flexibilidade durante o ano. |
| Pagamento fixo maior | Quer uma data clara de quitação de dívida. |
| Refinanciar para prazo mais curto | Uma taxa mais baixa está disponível e o pagamento maior é acessível; compare taxas. |
| Manter dinheiro, pagar antecipadamente depois | Período fixo terminando em breve (pagamento antecipado sem penalidade depois), ou reserva de emergência não está completa. |
## 6. Revise
Reexecute os números uma vez por ano, quando a taxa mudar ou quando a renda mudar. Lembre ao usuário que pagar antecipadamente sempre pode ser pausado; um pagamento contratual maior geralmente não pode.
FILE:templates/loan-plan.md
# Plano de empréstimo: ${loan_name}
**Empréstimo:** ${balance} a ${rate}% (${fixed_or_variable}), ${remaining_term} restantes, pagamento ${payment} por mês, primeiro pagamento neste plano ${start_month}
**Taxas e regras:** ${fees}; limite ou penalidade de pagamento antecipado: ${prepayment_rules}
**Objetivo:** ${goal}
**Orçamento para pagamentos extras:** ${extra_budget}
## Linha de base
- Pagamento mensal:
- Juro total a partir de agora:
- Data de quitação:
- Divisão do primeiro pagamento: juros ... / principal ...
## Cenários
| Opção | Desembolso mensal | Data de quitação | Juro total | Juro economizado | Meses economizados |
|---|---|---|---|---|---|
| Linha de base | | | | - | - |
| A: | | | | | |
| B: | | | | | |
| C: | | | | | |
## Recomendação
Opção ... porque:
1.
2.
3.
Compensações a ter em mente:
## Antes de pagar antecipadamente
- [ ] Reserva de emergência cobre ... meses
- [ ] Nenhuma dívida com taxa mais alta restante (ou ela vem primeiro)
- [ ] Penalidade / limite de pagamento antecipado verificado com o credor
- [ ] Pagamento antecipado configurado para reduzir o prazo (ou pagamento, se preferido)
## Perguntas para o credor
1.
2.
## Próximos passos
1.
2.
*Suposições: taxa fixa, pagamentos mensais, pagamentos extras aplicados ao principal imediatamente. Estas são estimativas, não aconselhamento financeiro.*
FILE:examples/example-mortgage-overpayment.md
# Exemplo: comparando três estratégias de pagamento antecipado de hipoteca
## Solicitação do usuário
"Temos 320.000 restantes em nossa hipoteca a 4,1% fixo com 25 anos restantes, primeiro pagamento deste plano em dezembro de 2026. Poderíamos pagar cerca de 300 extras por mês, ou recebemos um bônus de 15.000 a cada ano pelos próximos três anos. Um amigo diz que deveríamos simplesmente mudar para 2.400 por mês. O que é melhor? Temos 6 meses de despesas economizados e nenhuma outra dívida. O banco permite 10% de pagamento antecipado por ano sem taxas."
## Comandos
```bash
python3 scripts/amortize.py --principal 320000 --rate 4.1 --years 25 --start 2026-12
python3 scripts/amortize.py --principal 320000 --rate 4.1 --years 25 --start 2026-12 --extra 300
python3 scripts/amortize.py --principal 320000 --rate 4.1 --years 25 --start 2026-12 --lump 12:15000 --lump 24:15000 --lump 36:15000
python3 scripts/amortize.py --principal 320000 --rate 4.1 --years 25 --start 2026-12 --payment 2400
```
Saída (resumida):
```
Linha de base: 1.706,80 por mês, juros 192.038,38, total pago 512.038,38, quitado em 2051-11 (300 pagamentos)
Plano (+300,00/mês): quitado em 2046-02 (231 pagamentos), juros 143.068,39
Economiza 48.969,99 de juros e 69 meses (5 a 9 m); cada 100 de extra economiza 70,97
Plano (pagamentos únicos 15.000,00 no pagamento 12, 15.000,00 no pagamento 24, 15.000,00 no pagamento 36): quitado em 2046-11 (240 pagamentos), juros 133.018,73
Economiza 59.019,65 de juros e 60 meses (5 a 0 m); cada 100 de extra economiza 131,15
Plano (pagamento fixo 2.400,00): quitado em 2041-10 (179 pagamentos), juros 107.805,37
Economiza 84.233,01 de juros e 121 meses (10 a 1 m)
```
## Plano de empréstimo (modelo preenchido, resumido)
**Empréstimo:** 320.000,00 a 4,1% fixo, 25 anos restantes, pagamento 1.706,80 por mês, primeiro pagamento dezembro de 2026
**Taxas e regras:** pagamentos antecipados até 10% do saldo por ano são gratuitos
**Objetivo:** pagar menos juros sem perder flexibilidade
| Opção | Desembolso mensal | Data de quitação | Juro total | Juro economizado | Meses economizados |
|---|---|---|---|---|---|
| Linha de base | 1.706,80 | 2051-11 | 192.038,38 | - | - |
| A: +300 por mês | 2.006,80 | 2046-02 | 143.068,39 | 48.969,99 | 69 |
| B: bônus de 15.000 nos anos 1 a 3 | 1.706,80 + 45.000 total | 2046-11 | 133.018,73 | 59.019,65 | 60 |
| C: fixo de 2.400 por mês | 2.400,00 | 2041-10 | 107.805,37 | 84.233,01 | 121 |
**Recomendação:** Opção B, mais A se o orçamento permitir. Os bônus são pagos no início do empréstimo, então cada 100 pago antecipadamente economiza cerca de 131 de juros, quase o dobro da taxa do plano mensal (cerca de 71 por 100, porque muito desse dinheiro é pago em anos posteriores). Não requer mudança no orçamento mensal, e cada 15.000 está dentro do limite gratuito de 10% (32.000 no ano 1). A Opção C economiza mais porque envia cerca de 124.000 de dinheiro extra ao longo de 15 anos, mas aumenta o desembolso fixo em 693 por mês; faça isso somente se couber confortavelmente, e configure como um pagamento antecipado voluntário em vez de um novo pagamento contratual para que possa ser pausado.
**Compensações:** dinheiro pago antecipadamente é difícil de recuperar; mantenha a reserva de emergência de 6 meses intocada. Se sua conta poupança paga mais de 4,1% após impostos, poupar pode superar pagar antecipadamente no papel; verifique a taxa e quaisquer regras fiscais localmente.
**Perguntas para o credor:**
1. Os pagamentos antecipados reduzirão o prazo com o pagamento inalterado (assumido acima), ou recalcularão o pagamento?
2. O limite de 10% reinicia por ano civil ou por ano do empréstimo?
*Suposições: taxa fixa para todo o prazo, pagamentos mensais, pagamentos antecipados aplicados ao principal imediatamente. Estimativas, não aconselhamento financeiro.*
FILE:scripts/amortize.py
#!/usr/bin/env python3
"""Amortização de empréstimo com taxa fixa com pagamentos extras e comparação de cenários.
Uso:
python3 amortize.py --principal 250000 --rate 4.2 --years 30 [opções]
python3 amortize.py --principal 18000 --rate 7.9 --months 60 --extra 150
Opções:
--principal N valor emprestado (obrigatório)
--rate PCT taxa de juros anual nominal em percentual, ex. 4.2 (obrigatório; 0 permitido)
--years N | --months N prazo (um deles é obrigatório)
--start YYYY-MM mês do primeiro pagamento (padrão: próximo mês)
--extra N valor extra adicionado a cada pagamento mensal
--extra-from N número do pagamento onde --extra começa (padrão 1)
--lump N:AMOUNT pagamento extra único no número de pagamento N (repetível)
--payment N pague este valor mensal fixo em vez do calculado
--fee N taxas únicas iniciais, usadas para o custo e estimativa de APR
--schedule FILE escreva o cronograma mensal completo como CSV
--yearly imprima uma tabela ano a ano
--json imprima o resultado como JSON
Assume-se que pagamentos extras reduzem o principal imediatamente sem penalidade de
pagamento antecipado e com o mesmo pagamento mensal (o prazo encurta). As taxas são anuais
nominais, compostas mensalmente (taxa / 12 por mês). O dinheiro é arredondado para centavos a cada mês.
Códigos de saída: 0 ok, 2 erro de uso ou entrada. Somente biblioteca padrão do Python 3.
"""
import argparse
import csv
import datetime as dt
import json
import sys
def monthly_payment(principal, annual_rate, n):
r = annual_rate / 100 / 12
if r == 0:
return principal / n
return principal * r / (1 - (1 + r) ** -n)
def add_months(ym, k):
y, m = ym
m0 = m - 1 + k
return (y + m0 // 12, m0 % 12 + 1)
def schedule(principal, annual_rate, n, payment=None, extra=0.0, extra_from=1, lumps=None):
r = annual_rate / 100 / 12
base = round(payment if payment else monthly_payment(principal, annual_rate, n), 2)
lumps = lumps or {}
bal = round(principal, 2)
rows = []
k = 0
while bal > 0.005:
k += 1
if k > 1200:
raise ValueError("o empréstimo não é quitado em 100 anos; o pagamento é pequeno demais para os juros")
interest = round(bal * r, 2)
if base + (extra if k >= extra_from else 0) <= interest and not lumps.get(k):
raise ValueError(f"o pagamento {base:.2f} não cobre os juros mensais {interest:.2f}; o saldo cresceria")
sched = min(base, bal + interest)
if payment is None and k == n:
sched = bal + interest # o último pagamento programado absorve a diferença de arredondamento
ext = min(extra if k >= extra_from else 0.0, max(bal + interest - sched, 0))
lump = min(lumps.get(k, 0.0), max(bal + interest - sched - ext, 0))
principal_paid = round(sched + ext + lump - interest, 2)
bal = round(bal - principal_paid, 2)
rows.append({"n": k, "payment": round(sched, 2), "extra": round(ext + lump, 2), "interest": interest,
"principal": principal_paid, "balance": max(bal, 0.0)})
return base, rows
def summarize(rows):
return {"months": len(rows), "total_interest": round(sum(x["interest"] for x in rows), 2),
"total_paid": round(sum(x["payment"] + x["extra"] for x in rows), 2),
"total_extra": round(sum(x["extra"] for x in rows), 2)}
def apr_estimate(principal, fee, payment, n):
"""Taxa anual que torna os pagamentos equivalentes ao principal - taxa (bissecção)."""
target = principal - fee
lo, hi = 0.0, 1.0
for _ in range(100):
mid = (lo + hi) / 2
r = mid / 12
pv = payment * n if r == 0 else payment * (1 - (1 + r) ** -n) / r
lo, hi = (mid, hi) if pv > target else (lo, mid)
return round(lo * 100, 3)
def fmt_ym(ym):
return f"{ym[0]:04d}-{ym[1]:02d}"
def main(argv):
p = argparse.ArgumentParser(add_help=True, description="Amortização de empréstimo com pagamentos extras")
p.add_argument("--principal", type=float, required=True)
p.add_argument("--rate", type=float, required=True)
g = p.add_mutually_exclusive_group(required=True)
g.add_argument("--years", type=float)
g.add_argument("--months", type=int)
p.add_argument("--start")
p.add_argument("--extra", type=float, default=0.0)
p.add_argument("--extra-from", type=int, default=1)
p.add_argument("--lump", action="append", default=[])
p.add_argument("--payment", type=float)
p.add_argument("--fee", type=float, default=0.0)
p.add_argument("--schedule")
p.add_argument("--yearly", action="store_true")
p.add_argument("--json", action="store_true")
try:
a = p.parse_args(argv)
except SystemExit as e:
return 0 if e.code == 0 else 2
try:
n = a.months if a.months else round(a.years * 12)
if a.principal <= 0 or n <= 0 or a.rate < 0 or a.extra < 0 or a.fee < 0:
raise ValueError("principal e prazo devem ser positivos; taxa, extra e taxa não podem ser negativos")
if a.rate > 100:
raise ValueError("a taxa é em percentual ao ano, ex. 4.2 para 4,2%")
lumps = {}
for item in a.lump:
num, _, amt = item.partition(":")
try:
if not num.isdigit():
raise ValueError
value = float(amt)
except ValueError:
raise ValueError(f"--lump deve parecer 24:5000 (número do pagamento:valor), obtido {item!r}") from None
lumps[int(num)] = lumps.get(int(num), 0.0) + value
if a.start:
try:
y, m = a.start.split("-")
start = (int(y), int(m))
except ValueError:
raise ValueError(f"--start deve parecer 2026-11, obtido {a.start!r}") from None
if not 1 <= start[1] <= 12:
raise ValueError("o mês de --start deve ser 01 a 12")
else:
t = dt.date.today()
start = add_months((t.year, t.month), 1)
base_pay, base_rows = schedule(a.principal, a.rate, n, payment=None)
scenario = bool(a.extra or lumps or a.payment)
pay, rows = schedule(a.principal, a.rate, n, payment=a.payment, extra=a.extra,
extra_from=a.extra_from, lumps=lumps) if scenario else (base_pay, base_rows)
except ValueError as e:
print(f"erro: {e}", file=sys.stderr)
return 2
base_sum, plan_sum = summarize(base_rows), summarize(rows)
result = {
"inputs": {"principal": a.principal, "annual_rate_pct": a.rate, "term_months": n, "first_payment": fmt_ym(start),
"extra_monthly": a.extra, "extra_from_payment": a.extra_from, "lumps": lumps, "fixed_payment": a.payment, "fees": a.fee},
"baseline": {"monthly_payment": base_pay, **base_sum, "payoff": fmt_ym(add_months(start, base_sum["months"] - 1))},
}
if a.fee:
result["baseline"]["apr_estimate_pct"] = apr_estimate(a.principal, a.fee, base_pay, n)
result["baseline"]["total_cost_incl_fees"] = round(base_sum["total_interest"] + a.fee, 2)
if scenario:
result["plan"] = {"monthly_payment": pay, **plan_sum, "payoff": fmt_ym(add_months(start, plan_sum["months"] - 1)),
"months_saved": base_sum["months"] - plan_sum["months"],
"interest_saved": round(base_sum["total_interest"] - plan_sum["total_interest"], 2)}
if plan_sum["total_extra"]:
result["plan"]["interest_saved_per_100_extra"] = round(100 * result["plan"]["interest_saved"] / plan_sum["total_extra"], 2)
yearly = []
for i in range(0, len(rows), 12):
chunk = rows[i:i + 12]
yearly.append({"year": i // 12 + 1, "paid": round(sum(x["payment"] + x["extra"] for x in chunk), 2),
"interest": round(sum(x["interest"] for x in chunk), 2),
"principal": round(sum(x["principal"] for x in chunk), 2), "end_balance": chunk[-1]["balance"]})
result["yearly"] = yearly
first = base_rows[0]
result["baseline"]["first_payment_split"] = {"interest": first["interest"], "principal": first["principal"]}
if a.schedule:
try:
with open(a.schedule, "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["n", "month", "payment", "extra", "interest", "principal", "balance"])
for x in rows:
w.writerow([x["n"], fmt_ym(add_months(start, x["n"] - 1)), f"{x['payment']:.2f}", f"{x['extra']:.2f}",
f"{x['interest']:.2f}", f"{x['principal']:.2f}", f"{x['balance']:.2f}"])
except OSError as e:
print(f"erro: não foi possível escrever o cronograma {a.schedule}: {e.strerror}", file=sys.stderr)
return 2
if a.json:
print(json.dumps(result, indent=2))
return 0
b = result["baseline"]
print(f"Empréstimo {a.principal:,.2f} a {a.rate}% por {n} meses, primeiro pagamento {fmt_ym(start)}")
print(f"Linha de base: {b['monthly_payment']:,.2f} por mês, juros {b['total_interest']:,.2f}, "
f"total pago {b['total_paid']:,.2f}, quitado em {b['payoff']} ({b['months']} pagamentos)")
if a.fee:
print(f" Com taxas {a.fee:,.2f}: custo total do empréstimo {b['total_cost_incl_fees']:,.2f}, APR cerca de {b['apr_estimate_pct']}%")
print(f" Primeiro pagamento: {first['interest']:,.2f} de juros, {first['principal']:,.2f} de principal")
if scenario:
pl = result["plan"]
what = []
if a.payment:
what.append(f"pagamento fixo {a.payment:,.2f}")
if a.extra:
what.append(f"+{a.extra:,.2f}/mês" + (f" a partir do pagamento {a.extra_from}" if a.extra_from > 1 else ""))
if lumps:
what.append("pagamentos únicos " + ", ".join(f"{v:,.2f} no pagamento {k}" for k, v in sorted(lumps.items())))
print(f"Plano ({'; '.join(what)}): quitado em {pl['payoff']} ({pl['months']} pagamentos), "
f"juros {pl['total_interest']:,.2f}")
ms = pl["months_saved"]
if ms >= 0 and pl["interest_saved"] >= 0:
print(f" Economiza {pl['interest_saved']:,.2f} de juros e {ms} meses ({ms // 12} a {ms % 12} m)"
+ (f"; cada 100 de extra economiza {pl['interest_saved_per_100_extra']:,.2f}" if pl.get("interest_saved_per_100_extra") else ""))
else:
print(f" AVISO: este plano custa {-pl['interest_saved']:,.2f} MAIS de juros e leva {-ms} meses a mais que a linha de base")
if a.yearly:
print(f"\nAno a ano ({'plano' if scenario else 'linha de base'}):")
print(f"{'Ano':>4} {'Pago':>12} {'Juros':>12} {'Principal':>12} {'Saldo':>12}")
for y in yearly:
print(f"{y['year']:>4} {y['paid']:>12,.2f} {y['interest']:>12,.2f} {y['principal']:>12,.2f} {y['end_balance']:>12,.2f}")
if a.schedule:
print(f"\nCronograma escrito em {a.schedule} ({len(rows)} linhas)")
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
Entre para ver o prompt completo
Continuar com:
Ao entrar, você concorda com nossos Termos de uso e Política de privacidade
Uso
Este prompt foi projetado para uso com personal. Copie o conteúdo acima e cole na sua ferramenta de IA preferida.
Para melhores resultados, personalize os marcadores (indicados por colchetes ou maiúsculas) com seus requisitos específicos.
Discussão
0 comentários