Kredit-Tilgungspläne mit Python und numpy/pandas erstellen

Als der Kauf unserer Wohnung anstand, wollte ich die entsprechende Angebote der Banken nachrechnen und habe mir ein Python-Skript geschrieben, das die entsprechenden Berechnungen vornimmt. Berücksichtigt werden dabei auch Sondertilgungen im Dezember eines Jahres sowie eine Wartezeit von n Jahren ohne Sondertilgung.

Hier jetzt das Skript:

# -*- coding: utf-8 -*-
 
import pandas as pd
import numpy as np
 
 
def berechne_jaehrliche_Annuitaet(kreditsumme, nominalzins_prozent, tilgungssatz_prozent):
    """ Berechnet die _jährliche_ Annuität.
        Jährliche_Rate = (nominalzins + tilgungssatz) * Kreditsumme
        Quelle: https://de.wikipedia.org/wiki/Annuit%C3%A4tendarlehen
    """ 
 
    zinssatz = nominalzins_prozent / 100
    tilgung = tilgungssatz_prozent / 100
    return round(kreditsumme * (zinssatz + tilgung), 2)
 
 
def berechne_monatliche_Annuitaet(kreditsumme, nominalzins_prozent, tilgungssatz_prozent):
    """ Berechnet die _monatliche_ Annuität.
        Jährliche_Rate = (nominalzins + tilgungssatz) * Kreditsumme
        Monatliche_Rate = Jährliche_Rate / 12
    """ 
 
    zinssatz = nominalzins_prozent / 100
    tilgung = tilgungssatz_prozent / 100
    return round(kreditsumme * (zinssatz + tilgung) / 12, 2)
 
def tilgungsplan_df(kreditsumme, nominalzins_prozent, tilgungssatz_prozent, sondert, wartezeit, monate):
    """ 
        Gibt DataFrame der monatlichen Tilgungen zurück
 
        "monate" für wieviele Monate wird der Tilgungsplan erstellt
        "sondert" Betrag der jährlichen Sondertilgung
        "wartezeit" Anzahl der Jahre ohne Sondertilgung
    """
 
    df = pd.DataFrame()
    restschuld = kreditsumme # Am Anfang entspricht die Restschuld der Kreditsumme
    zinssatz = nominalzins_prozent / 100
    tilgung = tilgungssatz_prozent / 100
 
    annuitaet = berechne_monatliche_Annuitaet(kreditsumme, nominalzins_prozent, tilgungssatz_prozent)
    zinsen = 0
 
    for j in range(1,monate+1):
        # Split der Annuität in ihre Komponenten Zinslast und Tilgung
        zinsen = restschuld * zinssatz / 12 
        # Wenn Restschuld kleiner Annuität, dann wird die komplette 
        # Restschuld getilgt
        tilgung = restschuld if restschuld < annuitaet else annuitaet - zinsen    
 
        anfangsschuld = restschuld
        jahr = ((j-1) // 12) + 1 # in welchem Monat befinden wir uns
 
        # Sondertilgungen im Dezember eines Jahres, wenn wir 
        # nicht in der Wartezeit sind
        if j % 12 == 0 and anfangsschuld > 0 and jahr > wartezeit:
            sondertilgung = sondert
        else:
            sondertilgung = 0
 
        # Restschuld_neu = Restschuld_alt minus Tilgung minus Sondertilgung
        restschuld = restschuld - tilgung - sondertilgung
 
        # Dataframe befüllen
        df = df.append({'Monat': j, 'Jahr': jahr,'Anfangsschuld': anfangsschuld, 
        'Zinsen':zinsen, 'Tilgung': tilgung, 'Sondertilgung': sondertilgung,
        'Restschuld': restschuld}, ignore_index=True)    
 
    # Indikatorspalte, "1" wenn der Kredit noch nicht abbezahlt ist, sonst "0"
    df['Indikator'] = np.where(df['Anfangsschuld']>0, 1, 0)
    # Umsortieren der Spalten
    df = df[['Monat', 'Jahr', 'Anfangsschuld', 'Zinsen', 'Tilgung', 'Sondertilgung', 'Restschuld', 'Indikator']]
 
    # Runden auf 2 Nachkommastellen
    for i in ['Anfangsschuld', 'Zinsen', 'Tilgung', 'Restschuld']:
        df[i] = df[i].apply(lambda x: round(x, 2))    
 
    # Monat als Index nutzen
    df.set_index('Monat', inplace=True)
    return df
 
print(berechne_jaehrliche_Annuitaet(200000, 2.0, 3.0), 'jährliche Annuität')
print(berechne_monatliche_Annuitaet(200000, 2.0, 3.0), 'monatliche Annuität')
 
tilgungsplan = tilgungsplan_df(200000, 2.0, 3.0, 5000, 0, 200)
#Wie lange läuft der Kredit
print('Gesamtlaufzeit:', round(tilgungsplan['Indikator'].sum(),1), 'Monate')
 
tilgungsplan.to_excel('tilgungsplan_gesamt.xlsx')

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website