Código Python: tabla de amortización de un crédito (descarga gratis)

Código Python: tabla de amortización de un crédito (descarga gratis)
Pedir un crédito es la parte fácil; entender cómo se reparte cada cuota es donde casi todo el mundo se pierde. Cuando el banco dice «cuota fija», uno imagina que el capital baja parejo mes a mes, y no es así: en las primeras cuotas casi todo lo que pagas es interés y apenas una parte toca el capital. De ahí esa sensación incómoda de que el crédito «no baja». Este programa en Python arma la tabla de amortización completa, mes por mes, con el saldo inicial, la cuota, el interés, el abono a capital y el saldo final, y además te dice cuánto vas a pagar en total y cuánto de ese total se va en intereses.
Sirve para tres perfiles bien concretos. Para el dueño de la pyme que está evaluando un crédito y quiere ver, antes de firmar, cuánto le cuesta de verdad el dinero. Para el contador que necesita el cuadro de amortización para registrar el interés del período por separado del abono a capital. Y para el almacenista o jefe de bodega que recibió un crédito para comprar mercancía y quiere comprobar por qué el saldo que le muestra el banco no le coincide con lo que él calculaba a mano.
El paquete viene listo para descomprimir y no pide instalar nada más: Python 3.11 o superior y ya. Dentro va el programa, el crédito de ejemplo, la salida esperada y una guía corta con las instrucciones.
Estos son los archivos que quedan al descomprimir la carpeta:
| Archivo | Para qué sirve |
|---|---|
amortizacion_credito.py | El programa completo, comentado línea por línea |
datos/credito.csv | El crédito de ejemplo: una sola fila con monto, tasa nominal anual, plazo en meses y fecha del desembolso |
salida_ejemplo.txt | La salida que debes obtener al ejecutarlo, para comparar con la tuya |
LEEME.md | Las instrucciones y los detalles del cálculo, explicados en corto |
Qué hace el programa
- Lee el archivo
datos/credito.csv, que trae una sola fila: el monto del crédito, la tasa nominal anual, el plazo en meses y la fecha del desembolso. - Convierte la tasa anual en tasa mensual: divide la tasa nominal entre cien y entre doce. Una tasa nominal anual de dieciocho por ciento queda en uno y medio por ciento al mes.
- Calcula la cuota fija con la fórmula del sistema francés y la redondea a centavos.
- Recorre los meses uno por uno: cobra el interés sobre el saldo que todavía se debe, calcula qué parte de la cuota baja el capital y deja el saldo final de ese mes.
- Ajusta la última cuota al centavo. Sin ese ajuste el saldo final quedaría en un valor diminuto distinto de cero y la tabla nunca cerraría.
- Calcula la fecha de cada vencimiento con una función propia, para no equivocarse cuando el día no existe en el mes de destino.
- Muestra el resumen con cuatro totales y guarda la tabla en
salida/amortizacion.csv, lista para abrir en Excel.
Cómo ejecutarlo
Lo primero es instalar Python 3.11 o superior desde la página oficial, marcando la casilla que agrega Python al PATH del sistema. Después descomprime el ZIP completo en una carpeta y abre una terminal dentro de esa misma carpeta: en Windows puedes escribir cmd en la barra de direcciones del explorador de archivos. Estando ahí, ejecuta el programa llamándolo por su nombre:
python amortizacion_credito.py
No hay que instalar ninguna biblioteca: el programa usa solo lo que viene con Python. Corre en menos de un segundo, muestra la tabla en pantalla y deja el archivo final en la carpeta salida. Si tu sistema no reconoce el comando python, prueba con py amortizacion_credito.py, que es la forma corta que instala Windows.
El código, explicado
Estos son los cinco pedazos que de verdad importan. Todo lo demás son detalles de lectura del archivo y de formato de columnas.
La fórmula de la cuota fija. Es la del sistema francés: la cuota es igual al monto por la tasa mensual, dividido entre uno menos el factor de descuento del plazo.
def cuota_fija(monto: Decimal, tasa: Decimal, plazo: int) -> Decimal:
"""Calcula la cuota fija del sistema francés, redondeada a centavos."""
# # Sistema francés: cuota = monto * i / (1 - (1+i)^-n). Con Decimal, (1+i)**-n
factor = (UNO + tasa) ** -plazo
return redondear(monto * tasa / (UNO - factor))
El cálculo se hace con Decimal y no con números de coma flotante, y el resultado se redondea a centavos. El detalle suena técnico y es de plata: si el monto se guardara como decimal binario, los centavos se irían corriendo cuota tras cuota y al final la suma de los abonos ya no daría exactamente el monto del crédito.
La tasa mensual. La tasa que publica el banco es nominal anual, así que el programa la divide entre cien y entre doce. Ahí está la clave de todo el ejercicio:
tasa = tasa_anual / CIEN / DOCE # # Tasa mensual = tasa nominal anual / 100 / 12
Con una tasa nominal anual de dieciocho por ciento, la tasa mensual queda en uno y medio por ciento. Aplicada todos los meses sobre el saldo que aún se debe, pesa bastante más de lo que sugiere el número anual que anuncia el banco.
El corazón del cálculo. Aquí está la razón de que el crédito parezca no bajar al principio: el interés se calcula sobre el saldo que todavía se debe, y como ese saldo es grande en los primeros meses, el interés también lo es.
for numero in range(1, plazo + 1):
interes = redondear(saldo * tasa) # # El interés se cobra sobre el saldo que aún se debe: por eso al principio pesa tanto
# # La última cuota absorbe la diferencia de centavos para que el saldo quede en cero
cuota_mes = redondear(saldo + interes) if numero == plazo else cuota
abono = redondear(cuota_mes - interes) # # Abono a capital: lo que de verdad baja la deuda (cuota - interés)
final = redondear(saldo - abono)
Lee el bloque con calma, porque resume todo el sistema. El interés del mes sale de multiplicar el saldo inicial por la tasa. La cuota menos el interés es lo que de verdad baja la deuda, y el saldo final del mes es el saldo inicial menos ese abono. La última línea del comentario es la que explica por qué el último pago casi nunca es igual a los demás.
Las fechas, sin sobresaltos. Sumar meses a una fecha parece trivial hasta que aparece un treinta y uno o un mes de febrero:
def sumar_meses(fecha: date, meses: int) -> date:
"""Suma meses a una fecha y ajusta el día al último del mes cuando no existe."""
# Se pasa el año a meses para no equivocarse al cruzar diciembre.
total = fecha.year * 12 + (fecha.month - 1) + meses
Si el día del desembolso no existe en el mes de destino, el programa toma el último día de ese mes. Así un crédito que nace un treinta y uno nunca te devuelve una fecha imposible.
Las dos comprobaciones. Cierran el ejercicio y son la parte que más te va a servir cuando cargues tus propios datos:
print(f" Suma de abonos = monto: {'CUADRA' if total_abono == monto else 'REVISAR'}")
print(f" Saldo final = 0,00: {'CUADRA' if saldo_final == 0 else 'REVISAR'}")
La primera comprobación suma todos los abonos a capital y verifica que den exactamente el monto del crédito. La segunda verifica que el saldo final quede en cero. Si alguna de las dos dijera REVISAR, algo se movió en los datos de entrada y no vale la pena seguir mirando la tabla.
Qué vas a ver en pantalla
Con el crédito de ejemplo, que es un monto de 12.000.000,00 a doce meses, el programa imprime primero las condiciones: el valor de la cuota fija y la nota de que la tasa se divide entre doce. Después viene la tabla, que es esto:
Cuota fija (sistema francés): 1.100.159,91 Nota: la tasa es nominal anual y se divide entre 12 para obtener la tasa mensual. TABLA DE AMORTIZACIÓN MES POR MES ------------------------------------------------------------------------------------------------ N.º Fecha Saldo inicial Cuota Interés Abono capital Saldo final ------------------------------------------------------------------------------------------------ 1 2026-05-01 12.000.000,00 1.100.159,91 180.000,00 920.159,91 11.079.840,09 2 2026-06-01 11.079.840,09 1.100.159,91 166.197,60 933.962,31 10.145.877,78 3 2026-07-01 10.145.877,78 1.100.159,91 152.188,17 947.971,74 9.197.906,04 4 2026-08-01 9.197.906,04 1.100.159,91 137.968,59 962.191,32 8.235.714,72 5 2026-09-01 8.235.714,72 1.100.159,91 123.535,72 976.624,19 7.259.090,53 6 2026-10-01 7.259.090,53 1.100.159,91 108.886,36 991.273,55 6.267.816,98 7 2026-11-01 6.267.816,98 1.100.159,91 94.017,25 1.006.142,66 5.261.674,32 8 2026-12-01 5.261.674,32 1.100.159,91 78.925,11 1.021.234,80 4.240.439,52 9 2027-01-01 4.240.439,52 1.100.159,91 63.606,59 1.036.553,32 3.203.886,20 10 2027-02-01 3.203.886,20 1.100.159,91 48.058,29 1.052.101,62 2.151.784,58 11 2027-03-01 2.151.784,58 1.100.159,91 32.276,77 1.067.883,14 1.083.901,44 12 2027-04-01 1.083.901,44 1.100.159,96 16.258,52 1.083.901,44 0,00 ------------------------------------------------------------------------------------------------
Mira la primera cuota: de los 1.100.159,91 que pagas, 180.000,00 se van en interés y apenas 920.159,91 bajan la deuda. En la última cuota la proporción se dio vuelta: el interés ya es de 16.258,52 y casi todo el pago es capital. Al final, el resumen te deja las cifras que importan:
RESUMEN DEL CRÉDITO ================================================================================================ Total pagado : 13.201.918,97 Total intereses: 1.201.918,97 Total abonos : 12.000.000,00 Última cuota : 1.100.159,96 Nota: la última cuota es distinta porque absorbe los centavos del redondeo. Suma de abonos = monto: CUADRA Saldo final = 0,00: CUADRA
O sea que por un crédito de 12.000.000,00 terminas pagando 13.201.918,97, de los cuales 1.201.918,97 son intereses. Y fíjate en la última cuota: vale 1.100.159,96, cinco centavos más que las otras once. No es un error del programa. Es el ajuste de centavos del que hablábamos, y es la razón por la que los bancos avisan el valor exacto del último pago en el contrato.
Errores comunes y consejos
- Si al hacer doble clic sobre el archivo la ventana se cierra de golpe, no es un fallo: el programa terminó y la consola se cerró sola. Ábrelo desde una terminal para alcanzar a leer la tabla completa.
- Si ves un error que menciona
datos/credito.csv, casi siempre es porque el ZIP se abrió dentro del visor y no se descomprimió. El programa necesita la carpetadatosal lado del archivo del programa. - En el archivo de datos escribe los números de forma simple: el monto sin separador de miles y la tasa sin el signo de porcentaje. Si escribes el monto con puntos, el programa lo va a leer mal.
- Guarda el archivo de datos siempre en UTF-8. Si lo editas y lo salvas en otro formato, los acentos de la salida se dañan y algunas columnas se ven corridas.
- Cuando cambies el monto, la tasa o el plazo, revisa el resumen: las dos comprobaciones deben decir CUADRA. Si dicen REVISAR, el dato que entró no es coherente y hay que corregirlo antes de usar las cifras.
- La tabla no reemplaza la liquidación del banco. Tu entidad puede usar otra capitalización, seguros, cuota de manejo o un período de gracia; compara línea por línea antes de dar por buena una diferencia.
- Guarda tu versión con el archivo de datos incluido. Así, cuando el banco te cambie una condición, vuelves a correr el programa y comparas las dos tablas en un minuto.
Cuándo esto no alcanza
Este programa responde una pregunta muy concreta: cómo se reparte una cuota fija entre interés y capital. Sirve perfectamente mientras el crédito sea uno, el plazo sea fijo y la tasa no se mueva. Cuando el negocio ya tiene varios créditos al tiempo, proveedores que financian a treinta, sesenta y noventa días, tasas que se revisan cada trimestre o abonos extraordinarios a mitad de camino, el archivo de texto se queda corto y la tabla deja de contar la historia completa.
Ahí es donde tiene sentido mirar un software de verdad. Kardex Tauro es un programa gratuito para ordenar el inventario y las finanzas de una pyme, y sirve justamente para eso: para cuando ya no alcanza con hojas de cálculo y scripts sueltos y necesitas que los números vivan en un solo lugar. No reemplaza a tu contador ni decide por ti; te deja las cuentas ordenadas para que la conversación con el banco empiece desde un punto claro.
Descarga el ZIP, cambia el archivo de datos por tu crédito real y compara el resultado con la liquidación del banco. Ese ejercicio de media hora te va a decir más sobre tu crédito que cualquier folleto comercial. Y si el programa te sirvió, guárdalo: cuando el crédito esté más grande, Kardex Tauro es el paso siguiente, y el mismo hábito de revisar los números te va a servir igual.