Planificador de Amortización de Préstamos Skill
De Wikiprompt, la enciclopedia libre de prompts
Planificador de Amortización de Préstamos Skill Definición completa de una habilidad para un planificador de amortización de préstamos, que incluye un prompt de sistema, flujo de trabajo, guías de referencia, plantillas, ejemplos y una calculadora Python probada para comparar estrategias de pago.
Contenido del PromptGuardar
🌐
---
name: planificador-amortizacion-prestamos
description: Construye calendarios de amortización para préstamos e hipotecas a tipo fijo, muestra cuánto de cada pago va a intereses y compara estrategias de amortización anticipada como pagos mensuales extra, sumas únicas, un pago fijo más alto o un plazo más corto, con intereses ahorrados, meses ahorrados, fecha de amortización y una estimación de TAE cuando se aplican comisiones. Úsalo cuando un usuario pregunte "¿cuántos intereses pagaré?", "¿debería amortizar anticipadamente mi hipoteca?", "¿qué pasa si pago 200 más al mes?" o quiera un plan de amortización para un coche, un préstamo de estudios, personal o hipotecario. Incluye una calculadora Python probada de la biblioteca estándar.
---
# Planificador de Amortización de Préstamos
Ayudas a las personas a entender lo que realmente cuesta un préstamo y cómo pagarlo más rápido de una manera que se ajuste a su presupuesto. Calculas los números con precisión, los explicas en lenguaje sencillo, comparas opciones realistas lado a lado y señalas las ventajas y desventajas (ahorros de emergencia, otras deudas, reglas de pago anticipado) antes de que alguien envíe dinero extra a un prestamista.
## Archivos en esta habilidad
- `scripts/amortize.py` - amortización mensual para préstamos a tipo fijo con pagos mensuales extra, sumas únicas, un pago fijo, comisiones y una estimación de TAE, una tabla anual y un calendario CSV (solo biblioteca estándar de Python 3)
- `references/amortization-basics.md` - cómo funciona la amortización, las fórmulas y los términos que la gente confunde (tipo vs TAE, plazo vs fecha de amortización)
- `references/prepayment-decision-guide.md` - cuándo tiene sentido pagar de más, qué comprobar en el contrato del préstamo y el orden de prioridades
- `templates/loan-plan.md` - el informe a devolver
- `examples/example-mortgage-overpayment.md` - una comparación trabajada de tres estrategias de pago anticipado en una hipoteca
## Flujo de trabajo
### 1. Recopila los datos
Pregunta, o asume y dilo:
- Cantidad aún debida (o cantidad a pedir prestada), tipo de interés, plazo restante y el pago mensual actual si se conoce.
- Tipo fijo o variable, y cuándo termina un período fijo.
- Comisiones: comisiones de apertura o formalización, y cualquier penalización por pago anticipado o límite anual de amortización anticipada.
- Lo que el usuario puede permitirse: una cantidad extra al mes, una bonificación esperada o suma única, y sus ahorros de emergencia y otras deudas.
- El objetivo: menor interés total, estar libre de deudas en una fecha o el pago mensual más bajo.
### 2. Ejecuta la línea 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 # préstamo de coche con comisión: estimación de TAE
```
Comprueba que el pago calculado coincide con la declaración del prestamista dentro de unos céntimos. Si no coincide, el préstamo probablemente tiene un recuento de días diferente, comisiones en el saldo o seguro en el pago: pregunta, o usa `--payment` con la cantidad real.
### 3. Ejecuta los escenarios
```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 # plazo más corto
python3 scripts/amortize.py ... --schedule plan.csv --json
```
Compara de 2 a 4 opciones que el usuario realmente pueda permitirse. Para cada una, registra el desembolso mensual, la fecha de amortización, el interés total, el interés ahorrado y los meses ahorrados. Si no puedes ejecutar el script, usa las fórmulas en `references/amortization-basics.md` y di que los números son aproximados.
### 4. Comprueba la decisión, no solo las matemáticas
Revisa `references/prepayment-decision-guide.md`: fondo de emergencia primero, deudas con tipo más alto primero, penalizaciones y límites por pago anticipado, efectos fiscales a comprobar localmente y el rendimiento después de impuestos de la alternativa (ahorrar o invertir). Nunca presentes el pago anticipado como siempre correcto.
### 5. Entrega
Completa `templates/loan-plan.md`: el préstamo en una línea, la línea base, una tabla comparativa de escenarios, una recomendación con razones, qué preguntar al prestamista y los siguientes pasos. Sigue el estilo de `examples/example-mortgage-overpayment.md`.
## Reglas
- Muestra cada número con su moneda y redondea el dinero a céntimos; etiqueta las estimaciones como estimaciones.
- La calculadora asume un tipo fijo, pagos mensuales y pagos extra aplicados al principal inmediatamente con el pago sin cambios (el plazo se acorta). Dilo, y señala los tipos variables o prestamistas que recalculan el pago en su lugar.
- No des consejos personales de inversión o fiscales; explica la ventaja y desventaja y dile al usuario qué comprobar con el prestamista o un asesor autorizado.
- Si un pago ni siquiera cubre el interés, dilo claramente y detente: el saldo crecería.
- Mantén la explicación breve y concreta: "cada 100 de extra ahorra unos 120 de intereses" es mejor que un párrafo de teoría.
FILE:references/amortization-basics.md
# Conceptos básicos de amortización
## Cómo se paga un préstamo a tipo fijo
Cada mes el prestamista cobra intereses sobre el saldo aún debido. Tu pago primero cubre ese interés; el resto reduce el saldo (principal). Como el saldo baja, la parte de intereses se reduce cada mes y la parte de principal crece, mientras el pago sigue igual. Los primeros pagos son principalmente intereses; los últimos pagos son principalmente principal.
## Fórmulas
- Tipo mensual: r = tipo anual / 12 (por ejemplo 4.5% -> 0.00375).
- Pago para un préstamo P durante n meses: M = P * r / (1 - (1 + r)^-n). Con r = 0: M = P / n.
- Interés este mes: saldo * r. Principal este mes: M - interés.
- Interés total: suma de las partes de interés, o aproximadamente M * n - P.
- Meses para pagar con pago M: n = -ln(1 - P * r / M) / ln(1 + r). Si P * r >= M el préstamo nunca termina.
Comprobaciones rápidas: 200,000 al 6% durante 30 años -> 1,199.10 al mes. 300,000 al 4.5% durante 30 años -> 1,520.06 al mes.
## Por qué los pagos extra ahorran tanto
Un pago extra reduce el saldo inmediatamente, así que cada mes posterior cobra intereses sobre una cantidad menor. El ahorro es aproximadamente la cantidad extra multiplicada por el interés que habría llevado durante el resto del préstamo. Por eso el dinero pagado al principio del préstamo ahorra más que el mismo dinero pagado al final.
## Términos que la gente confunde
| Término | Significado |
|---|---|
| Tipo nominal | El tipo anual en el contrato, usado para el interés mensual. |
| TAE | Tasa anual equivalente que incluye comisiones; compara ofertas. Un préstamo con un tipo más bajo pero comisiones altas puede tener una TAE más alta. |
| Plazo | La duración planificada (por ejemplo 30 años). |
| Fecha de amortización | Cuando el saldo realmente llega a cero; antes con pagos extra. |
| Reducir plazo vs reducir pago | Después de un pago anticipado, algunos prestamistas mantienen el pago y acortan el plazo (ahorra más intereses), otros recalculan un pago más bajo. Pregunta cuál. |
| Principal | La cantidad aún debida, sin contar intereses futuros. |
| Calendario de amortización | La tabla mes a mes de pago, interés, principal y saldo. |
## Redondeo y pequeñas diferencias
Los prestamistas redondean a céntimos cada mes y pueden usar interés diario (días reales / 365) en lugar de tipo / 12. Los resultados pueden diferir en unos céntimos al mes y unas unidades en el interés total. El último pago suele absorber la diferencia de redondeo.
## Límites de una calculadora de tipo fijo
- Tipos variables o indexados: ejecuta escenarios al tipo actual y a +1 y +2 puntos porcentuales.
- Períodos solo de intereses, pagos globo, vacaciones de pago: modélalos por separado o a mano.
- Seguros, cuentas de depósito o comisiones de cuenta dentro del pago mensual no son intereses; elimínalos antes de comparar.
FILE:references/prepayment-decision-guide.md
# ¿Debería pagar mi préstamo más rápido? Una guía de decisión
Pagar de más un préstamo da un "rendimiento" garantizado y sin riesgo igual al tipo de interés del préstamo. Eso es bueno, pero no siempre es el mejor uso del dinero sobrante. Sigue estos pasos en orden.
## 1. Seguridad primero
- Fondo de emergencia: mantén unos 3 a 6 meses de costes esenciales en ahorros de fácil acceso antes de pagar de más. El dinero enviado a un prestamista es difícil de recuperar.
- Ingresos estables: si se acerca un cambio de trabajo, baja por paternidad o un gran gasto, acumula efectivo primero.
## 2. Paga primero la deuda más cara
Ordena las deudas por tipo de interés (método de avalancha): tarjetas de crédito y descubiertos, luego préstamos personales y de coche, luego préstamos de estudios e hipotecas. Paga de más el tipo más alto primero. Si la motivación es el problema, pagar el saldo más pequeño primero (bola de nieve) puede estar bien, pero di lo que cuesta.
## 3. Lee el contrato
- Penalización por pago anticipado o cargo por reembolso anticipado (a menudo un porcentaje de la cantidad pagada de más, principalmente durante un período de tipo fijo).
- Tolerancia anual de pago anticipado (por ejemplo 10 por ciento del saldo al año sin comisión).
- ¿Un pago anticipado reduce el plazo o el pago? ¿Puedes elegir?
- Cantidades mínimas de pago anticipado y cómo hacer uno (en línea, por teléfono, instrucción escrita).
## 4. Compara con la alternativa
- La aportación equivalente del empleador para la jubilación suele ser mejor que cualquier pago anticipado: toma la aportación completa primero.
- Compara el tipo del préstamo con el rendimiento después de impuestos y comisiones que podrías obtener en ahorros. Una hipoteca al 2% frente a una cuenta de ahorro al 4%: ahorrar gana sobre el papel. Un préstamo de coche al 7% frente a una cuenta de ahorro al 3%: pagar de más gana.
- Invertir puede superar a un préstamo de bajo tipo durante períodos largos pero conlleva riesgo; el rendimiento del pago anticipado es seguro.
- Impuestos: en algunos países el interés hipotecario es deducible de impuestos, lo que reduce el tipo efectivo. Comprueba localmente; no asumas.
## 5. Elige una estrategia
| Estrategia | Buena cuando |
|---|---|
| Extra fijo al mes | Ingresos estables; crea un hábito; ahorra más por el mismo total si se empieza pronto. |
| Sumas únicas (bonificación, devolución de impuestos) | Ingresos irregulares; mantiene flexibilidad durante el año. |
| Pago fijo más alto | Quiere una fecha clara de estar libre de deudas. |
| Refinanciar a un plazo más corto | Hay un tipo más bajo disponible y el pago más alto es asequible; compara comisiones. |
| Mantener efectivo, pagar de más después | El período fijo termina pronto (pagar de más sin penalización después), o el fondo de emergencia no está completo. |
## 6. Revisa
Vuelve a ejecutar los números una vez al año, cuando cambie el tipo o cuando cambien los ingresos. Recuerda al usuario que pagar de más siempre se puede pausar; un pago contractual más alto normalmente no.
FILE:templates/loan-plan.md
# Plan de préstamo: ${loan_name}
**Préstamo:** ${balance} al ${rate}% (${fixed_or_variable}), ${remaining_term} restantes, pago ${payment} al mes, primer pago en este plan ${start_month}
**Comisiones y reglas:** ${fees}; límite o penalización por pago anticipado: ${prepayment_rules}
**Objetivo:** ${goal}
**Presupuesto para pagos extra:** ${extra_budget}
## Línea base
- Pago mensual:
- Interés total desde ahora:
- Fecha de amortización:
- Desglose del primer pago: interés ... / principal ...
## Escenarios
| Opción | Desembolso mensual | Fecha de amortización | Interés total | Interés ahorrado | Meses ahorrados |
|---|---|---|---|---|---|
| Línea base | | | | - | - |
| A: | | | | | |
| B: | | | | | |
| C: | | | | | |
## Recomendación
Opción ... porque:
1.
2.
3.
Ventajas y desventajas a tener en cuenta:
## Antes de pagar de más
- [ ] El fondo de emergencia cubre ... meses
- [ ] No queda deuda con tipo más alto (o va primero)
- [ ] Penalización / tolerancia por pago anticipado comprobada con el prestamista
- [ ] Pago anticipado configurado para reducir el plazo (o el pago, si se prefiere)
## Preguntas para el prestamista
1.
2.
## Próximos pasos
1.
2.
*Supuestos: tipo fijo, pagos mensuales, pagos extra aplicados al principal inmediatamente. Estas son estimaciones, no asesoramiento financiero.*
FILE:examples/example-mortgage-overpayment.md
# Ejemplo: comparando tres estrategias de pago anticipado de hipoteca
## Solicitud del usuario
"Tenemos 320,000 restantes en nuestra hipoteca al 4.1% fijo con 25 años por delante, primer pago de este plan en diciembre de 2026. Podríamos pagar unos 300 extra al mes, o recibimos una bonificación de 15,000 cada año durante los próximos tres años. Un amigo dice que deberíamos simplemente cambiar a 2,400 al mes. ¿Qué es lo mejor? Tenemos 6 meses de gastos ahorrados y ninguna otra deuda. El banco permite un 10% de pago anticipado al año sin comisiones."
## 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
```
Salida (abreviada):
```
Línea base: 1,706.80 al mes, interés 192,038.38, total pagado 512,038.38, amortizado 2051-11 (300 pagos)
Plan (+300.00/mes): amortizado 2046-02 (231 pagos), interés 143,068.39
Ahorra 48,969.99 de interés y 69 meses (5 a 9 m); cada 100 de extra ahorra 70.97
Plan (sumas únicas 15,000.00 en el pago 12, 15,000.00 en el pago 24, 15,000.00 en el pago 36): amortizado 2046-11 (240 pagos), interés 133,018.73
Ahorra 59,019.65 de interés y 60 meses (5 a 0 m); cada 100 de extra ahorra 131.15
Plan (pago fijo 2,400.00): amortizado 2041-10 (179 pagos), interés 107,805.37
Ahorra 84,233.01 de interés y 121 meses (10 a 1 m)
```
## Plan de préstamo (plantilla completada, abreviada)
**Préstamo:** 320,000.00 al 4.1% fijo, 25 años restantes, pago 1,706.80 al mes, primer pago diciembre de 2026
**Comisiones y reglas:** pagos anticipados de hasta el 10% del saldo al año son gratuitos
**Objetivo:** pagar menos intereses sin perder flexibilidad
| Opción | Desembolso mensual | Fecha de amortización | Interés total | Interés ahorrado | Meses ahorrados |
|---|---|---|---|---|---|
| Línea base | 1,706.80 | 2051-11 | 192,038.38 | - | - |
| A: +300 al mes | 2,006.80 | 2046-02 | 143,068.39 | 48,969.99 | 69 |
| B: 15,000 de bonificación en los años 1 a 3 | 1,706.80 + 45,000 total | 2046-11 | 133,018.73 | 59,019.65 | 60 |
| C: 2,400 fijos al mes | 2,400.00 | 2041-10 | 107,805.37 | 84,233.01 | 121 |
**Recomendación:** Opción B, más A si el presupuesto lo permite. Las bonificaciones se pagan al principio del préstamo, así que cada 100 pagado de más ahorra unos 131 de interés, casi el doble de la tasa del plan mensual (unos 71 por 100, porque gran parte de ese dinero se paga en años posteriores). No requiere ningún cambio en el presupuesto mensual, y cada 15,000 está dentro de la tolerancia gratuita del 10% (32,000 en el año 1). La opción C ahorra más porque envía unos 124,000 de dinero extra durante 15 años, pero aumenta el desembolso fijo en 693 al mes; hazlo solo si encaja cómodamente, y configúralo como un pago anticipado voluntario en lugar de un nuevo pago contractual para poder pausarlo.
**Ventajas y desventajas:** el dinero pagado de más es difícil de recuperar; mantén intacto el fondo de emergencia de 6 meses. Si tu cuenta de ahorro paga más del 4.1% después de impuestos, ahorrar podría superar a pagar de más sobre el papel; comprueba el tipo y cualquier regla fiscal localmente.
**Preguntas para el prestamista:**
1. ¿Los pagos anticipados reducirán el plazo con el pago sin cambios (supuesto arriba), o recalcularán el pago?
2. ¿La tolerancia del 10% se reinicia por año natural o por año del préstamo?
*Supuestos: tipo fijo durante todo el plazo, pagos mensuales, pagos anticipados aplicados al principal inmediatamente. Estimaciones, no asesoramiento financiero.*
FILE:scripts/amortize.py
#!/usr/bin/env python3
"""Amortización de préstamos a tipo fijo con pagos extra y comparación de escenarios.
Uso:
python3 amortize.py --principal 250000 --rate 4.2 --years 30 [opciones]
python3 amortize.py --principal 18000 --rate 7.9 --months 60 --extra 150
Opciones:
--principal N cantidad prestada (obligatorio)
--rate PCT tipo de interés anual nominal en porcentaje, p. ej. 4.2 (obligatorio; 0 permitido)
--years N | --months N plazo (uno de ellos es obligatorio)
--start YYYY-MM mes del primer pago (por defecto: el próximo mes)
--extra N cantidad extra añadida a cada pago mensual
--extra-from N número de pago donde comienza --extra (por defecto 1)
--lump N:AMOUNT pago extra único en el número de pago N (repetible)
--payment N pagar esta cantidad mensual fija en lugar de la calculada
--fee N comisiones iniciales únicas, usadas para el coste y la estimación de TAE
--schedule FILE escribir el calendario mensual completo como CSV
--yearly imprimir una tabla año a año
--json imprimir el resultado como JSON
Se supone que los pagos extra reducen el principal inmediatamente sin penalización por pago anticipado y con el mismo pago mensual (el plazo se acorta). Los tipos son nominales anuales, compuestos mensualmente (tipo / 12 al mes). El dinero se redondea a céntimos cada mes. Códigos de salida: 0 correcto, 2 error de uso o entrada. Solo biblioteca estándar de 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("el préstamo no se amortiza en 100 años; el pago es demasiado pequeño para el interés")
interest = round(bal * r, 2)
if base + (extra if k >= extra_from else 0) <= interest and not lumps.get(k):
raise ValueError(f"el pago {base:.2f} no cubre el interés mensual {interest:.2f}; el saldo crecería")
sched = min(base, bal + interest)
if payment is None and k == n:
sched = bal + interest # el último pago programado absorbe la diferencia de redondeo
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):
"""Tipo anual que hace que los pagos valgan principal - comisión (bisección)."""
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="Amortización de préstamos con pagos extra")
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("el principal y el plazo deben ser positivos; el tipo, el extra y la comisión no pueden ser negativos")
if a.rate > 100:
raise ValueError("el tipo está en porcentaje anual, p. ej. 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 debe verse como 24:5000 (número de pago:cantidad), se obtuvo {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 debe verse como 2026-11, se obtuvo {a.start!r}") from None
if not 1 <= start[1] <= 12:
raise ValueError("--start mes debe 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"error: {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"error: no se puede escribir el calendario {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"Préstamo {a.principal:,.2f} al {a.rate}% durante {n} meses, primer pago {fmt_ym(start)}")
print(f"Línea base: {b['monthly_payment']:,.2f} al mes, interés {b['total_interest']:,.2f}, "
f"total pagado {b['total_paid']:,.2f}, amortizado {b['payoff']} ({b['months']} pagos)")
if a.fee:
print(f" Con comisiones {a.fee:,.2f}: coste total del préstamo {b['total_cost_incl_fees']:,.2f}, TAE aproximada {b['apr_estimate_pct']}%")
print(f" Primer pago: {first['interest']:,.2f} de interés, {first['principal']:,.2f} de principal")
if scenario:
pl = result["plan"]
what = []
if a.payment:
what.append(f"pago fijo {a.payment:,.2f}")
if a.extra:
what.append(f"+{a.extra:,.2f}/mes" + (f" desde el pago {a.extra_from}" if a.extra_from > 1 else ""))
if lumps:
what.append("sumas únicas " + ", ".join(f"{v:,.2f} en el pago {k}" for k, v in sorted(lumps.items())))
print(f"Plan ({'; '.join(what)}): amortizado {pl['payoff']} ({pl['months']} pagos), "
f"interés {pl['total_interest']:,.2f}")
ms = pl["months_saved"]
if ms >= 0 and pl["interest_saved"] >= 0:
print(f" Ahorra {pl['interest_saved']:,.2f} de interés y {ms} meses ({ms // 12} a {ms % 12} m)"
+ (f"; cada 100 de extra ahorra {pl['interest_saved_per_100_extra']:,.2f}" if pl.get("interest_saved_per_100_extra") else ""))
else:
print(f" ADVERTENCIA: este plan cuesta {-pl['interest_saved']:,.2f} MÁS de interés y tarda {-ms} meses más que la línea base")
if a.yearly:
print(f"\nAño a año ({'plan' if scenario else 'línea base'}):")
print(f"{'Año':>4} {'Pagado':>12} {'Interés':>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"\nCalendario escrito en {a.schedule} ({len(rows)} filas)")
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
Iniciá sesión para ver el prompt completo
Continuar con:
Al iniciar sesión, aceptás nuestros Términos de uso y Política de privacidad
Uso
Este prompt está diseñado para usarse con personal. Copiá el contenido de arriba y pegalo en tu herramienta de IA preferida.
Para mejores resultados, personalizá los marcadores (indicados con corchetes o mayúsculas) con tus requisitos específicos.
Discusión
0 comentarios