Loan calculator in Python
Loan calculator in Python
Today I was working on a prototype and needed to create the code to create a loan projection. Here you have a simple code for doing it including some elements like subsidy over interest and capital payments. In addition insurance payments are change based on inflation rates and with a lag in time. The code also includes the creation of a excel as an output in which I have set style for column names, values and the insertion of a graph.
Python
from array import array
import numpy as np
import pandas as pan
from xlsxwriter.workbook import Workbook
from xlsxwriter.utility import xl_range, xl_rowcol_to_cell
monto = 2442900
descuento = 14620.62
plazo = 180 # Term
tasa = 0.113 # interest rate
life_insurance_rate = 0.6
damage_insurance_rate = 0.275
comision = 'Financiada'
comision_ini = 0.015 # fee
valor_vivienda = monto # House value
seg_vida = monto / 1000 * life_insurance_rate
seg_danos = monto / 1000 * damage_insurance_rate * 1.16
pago_req = np.pmt(tasa / 12, plazo, -monto, when='end')
pago_total = pago_req + seg_danos + seg_vida
if comision == 'Financiada':
comision_ini = monto * 0.015
else:
comision_ini = 0.0
balance = monto + comision_ini
interes_req = 0.0
capital_acre = 0.0
capital_apoyo = 0.0
capital = 0.0
apoyo = 0.0
data = np.zeros((360, 10))
data[0][9] = monto
for i in range(1, plazo + 1):
data[i][0] = i
data[i][1] = balance * tasa / 12 # interes requerido
data[i][2] = balance # Saldo inicial
# Calculo de seguros
if i == 60:
first_amount_5years = balance
if i == 120:
first_amount_10years = balance
if i > 59 and i < 119:
seg_vida = first_amount_5years / 1000 * life_insurance_rate
seg_danos = valor_vivienda * 0.85 * (1 + 0.03 * 1.5) ** 5 / 1000 * damage_insurance_rate * 1.16
elif i >= 119:
seg_vida = first_amount_10years / 1000 * life_insurance_rate
seg_danos = valor_vivienda * 0.85 * (1 + 0.03 * 1.5) ** 10 / 1000 * damage_insurance_rate * 1.16
if balance <= 0:
seg_vida = 0.0
seg_danos = 0.0
# Calculo de intereses
interes_per = balance * tasa / 12
interes_acre = balance * 0.01 / 12
interes_apoyo = interes_per - interes_acre
# Calculo de capital
capital_acre = min(
balance,
pago_req - interes_per + descuento - interes_acre - (pago_req - interes_per) - seg_vida - seg_danos
)
capital_apoyo = max(0, min(pago_req - interes_per - capital_acre, balance - interes_acre))
capital = capital_acre + capital_apoyo
balance = max(0, balance - capital)
apoyo = interes_apoyo + capital_apoyo
data[i][3] = capital
data[i][4] = interes_acre
data[i][5] = apoyo
data[i][6] = seg_vida
data[i][7] = seg_danos
data[i][8] = interes_per + capital + seg_danos + seg_vida
data[i][9] = balance
# output to a csv file
file = open('tabla.csv', 'w+')
file.write('Periodo,Interes requerido, Saldo inicial, Capital, Interes Acreditado, Apoyo, Seg. Vida, Seg. Danos, Pago Total, Saldo Final')
for row in data:
file.write('\n')
for value in row:
file.write(str(value) + ',')
file.close()
# output to an excel file
wb = Workbook('Amortizacion.xlsx')
encabezado = wb.add_format({'bold': True, 'font_name': 'Calibri', 'font_size': 12, 'bottom': 1})
number_format = wb.add_format({'num_format': '#,##0.00'})
sheet = wb.add_worksheet('Tabla_de_amortizacion')
sheet.set_column(0, 29, 10)
sheet.set_zoom(80)
sheet.hide_gridlines(3)
sheet.write_string(2, 0, 'Periodo', encabezado)
sheet.write_string(2, 1, 'Interes requerido', encabezado)
sheet.write_string(2, 2, 'Saldo Inicial', encabezado)
sheet.write_string(2, 3, 'Capital', encabezado)
sheet.write_string(2, 4, 'Interes Acreditado', encabezado)
sheet.write_string(2, 5, 'Apoyo', encabezado)
sheet.write_string(2, 6, 'Seg. Vida', encabezado)
sheet.write_string(2, 7, 'Seg. Danos', encabezado)
sheet.write_string(2, 8, 'Pago Total', encabezado)
sheet.write_string(2, 9, 'Saldo Final', encabezado)
ld = len(data)
for row in range(0, ld):
v = data[row]
j = 0
for col in v:
sheet.write_number(row + 3, j, max(col, 0), number_format)
j += 1
chart = wb.add_chart({'type': 'line'})
chart.add_series({
'name': 'Capital',
'values': '=Tabla_de_amortizacion!$D$4:$D$' + str(plazo + 3),
'line': {'color': '#2e9fff'}
})
chart.add_series({
'name': 'Interes Acr.',
'values': '=Tabla_de_amortizacion!$E$4:$E$' + str(plazo + 3),
'line': {'color': '#000072'}
})
chart.add_series({
'name': 'Apoyo',
'values': '=Tabla_de_amortizacion!$F$4:$F$' + str(plazo + 3),
'line': {'color': '#9BBB59'}
})
chart.add_series({
'name': 'Seg. Vida',
'values': '=Tabla_de_amortizacion!$G$4:$G$' + str(plazo + 3),
'line': {'color': '#E46C0A'}
})
chart.add_series({
'name': 'Seg. Danos',
'values': '=Tabla_de_amortizacion!$H$4:$H$' + str(plazo + 3),
'line': {'color': '#00FF00'}
})
chart.add_series({
'name': 'Pago Total',
'values': '=Tabla_de_amortizacion!$I$4:$I$' + str(plazo + 3),
'line': {'color': '#38C99E'}
})
chart.set_legend({'position': 'bottom'})
chart.set_size({'width': 720, 'height': 576})
chart.set_chartarea({'border': {'none': True}, 'fill': {'color': 'white'}})
sheet.insert_chart('L4', chart)
wb.close()
FinancePythonTSA