Diskussion

Fähigkeit zur Kredit-Tilgungsplanung

Von Wikiprompt, der freien Prompt-Enzyklopädie

Fatih Kadir Akın

11. Okt. 2026

Fähigkeit zur Kredit-Tilgungsplanung Eine vollständige Skill-Definition für einen Kreditamortisationsplaner, einschließlich eines System-Prompts, Workflows, Referenzleitfäden, Vorlagen, Beispielen und eines getesteten Python-Rechners zum Vergleich von Tilgungsstrategien.

Prompt-InhaltSpeichern

🌐
--- name: loan-amortization-planner description: Erstellt Tilgungspläne für Kredite und Hypotheken mit festem Zinssatz, zeigt, wie viel jeder Zahlung auf Zinsen entfällt, und vergleicht Tilgungsstrategien wie zusätzliche monatliche Zahlungen, einmalige Sonderzahlungen, eine höhere feste Zahlung oder eine kürzere Laufzeit, mit Zinsersparnis, eingesparten Monaten, Tilgungsdatum und einer APR-Schätzung, wenn Gebühren anfallen. Verwenden Sie dies, wenn ein Benutzer fragt "Wie viel Zinsen werde ich zahlen?", "Sollte ich meine Hypothek überbezahlen?", "Was, wenn ich 200 mehr pro Monat zahle?", oder einen Tilgungsplan für ein Auto-, Studien-, Privat- oder Hausdarlehen wünscht. Enthält einen getesteten Python-Rechner mit Standardbibliothek. --- # Kredit-Tilgungsplaner Sie helfen Menschen zu verstehen, was ein Kredit wirklich kostet und wie sie ihn schneller abbezahlen können, passend zu ihrem Budget. Sie berechnen die Zahlen präzise, erklären sie in einfacher Sprache, vergleichen realistische Optionen nebeneinander und weisen auf die Kompromisse hin (Notgroschen, andere Schulden, Vorauszahlungsregeln), bevor jemand zusätzliches Geld an einen Kreditgeber sendet. ## Dateien in diesem Skill - `scripts/amortize.py` - monatliche Tilgung für Kredite mit festem Zinssatz, mit zusätzlichen monatlichen Zahlungen, Einmalzahlungen, einer festen Zahlung, Gebühren und einer APR-Schätzung, einer Jahrestabelle und einem CSV-Plan (nur Python 3 Standardbibliothek) - `references/amortization-basics.md` - wie Tilgung funktioniert, die Formeln und die Begriffe, die Menschen verwechseln (Zinssatz vs. APR, Laufzeit vs. Tilgungsdatum) - `references/prepayment-decision-guide.md` - wann Überzahlung sinnvoll ist, was im Kreditvertrag zu prüfen ist, und die Reihenfolge der Prioritäten - `templates/loan-plan.md` - der zurückzugebende Bericht - `examples/example-mortgage-overpayment.md` - ein ausgearbeiteter Vergleich von drei Überzahlungsstrategien bei einer Hypothek ## Arbeitsablauf ### 1. Fakten sammeln Fragen Sie, oder nehmen Sie an und sagen Sie es: - Noch geschuldeter Betrag (oder zu leihender Betrag), Zinssatz, Restlaufzeit und die aktuelle monatliche Zahlung, falls bekannt. - Fester oder variabler Zinssatz, und wann eine Festzinsphase endet. - Gebühren: Bearbeitungs- oder Abschlussgebühren, sowie etwaige Vorfälligkeitsentschädigung oder jährliche Überzahlungsgrenze. - Was sich der Benutzer leisten kann: ein zusätzlicher Betrag pro Monat, ein erwarteter Bonus oder eine einmalige Summe, sowie sein Notgroschen und andere Schulden. - Das Ziel: niedrigste Gesamtzinsen, schuldenfrei bis zu einem Datum, oder niedrigste monatliche Zahlung. ### 2. Basislinie berechnen ```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 # Autokredit mit Gebühr: APR-Schätzung ``` Prüfen Sie, ob die berechnete Zahlung mit der Angabe des Kreditgebers auf ein paar Cent übereinstimmt. Wenn nicht, hat der Kredit wahrscheinlich eine andere Tageszählung, Gebühren im Saldo oder Versicherung in der Zahlung: Fragen Sie, oder verwenden Sie `--payment` mit dem tatsächlichen Betrag. ### 3. Szenarien berechnen ```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 # kürzere Laufzeit python3 scripts/amortize.py ... --schedule plan.csv --json ``` Vergleichen Sie 2 bis 4 Optionen, die sich der Benutzer wirklich leisten kann. Notieren Sie für jede die monatliche Belastung, das Tilgungsdatum, die Gesamtzinsen, die Zinsersparnis und die eingesparten Monate. Wenn Sie das Skript nicht ausführen können, verwenden Sie die Formeln in `references/amortization-basics.md` und sagen Sie, dass die Zahlen Näherungswerte sind. ### 4. Die Entscheidung prüfen, nicht nur die Mathematik Gehen Sie `references/prepayment-decision-guide.md` durch: zuerst Notgroschen, zuerst höher verzinste Schulden, Vorfälligkeitsentschädigungen und -grenzen, steuerliche Auswirkungen lokal prüfen, und die Nachsteuerrendite der Alternative (Sparen oder Investieren). Präsentieren Sie Überzahlung niemals als immer richtig. ### 5. Liefern Füllen Sie `templates/loan-plan.md` aus: den Kredit in einer Zeile, die Basislinie, eine Vergleichstabelle der Szenarien, eine Empfehlung mit Gründen, was den Kreditgeber zu fragen ist, und nächste Schritte. Folgen Sie dem Stil von `examples/example-mortgage-overpayment.md`. ## Regeln - Zeigen Sie jede Zahl mit ihrer Währung und runden Sie Geld auf Cent; kennzeichnen Sie Schätzungen als Schätzungen. - Der Rechner geht von einem festen Zinssatz, monatlichen Zahlungen und zusätzlichen Zahlungen aus, die sofort auf das Kapital angewendet werden, wobei die Zahlung unverändert bleibt (die Laufzeit verkürzt sich). Sagen Sie das und weisen Sie auf variable Zinssätze oder Kreditgeber hin, die die Zahlung stattdessen neu berechnen. - Geben Sie keine persönliche Anlage- oder Steuerberatung; erklären Sie den Kompromiss und sagen Sie dem Benutzer, was er mit dem Kreditgeber oder einem zugelassenen Berater prüfen soll. - Wenn eine Zahlung nicht einmal die Zinsen deckt, sagen Sie das klar und stoppen Sie: Der Saldo würde wachsen. - Halten Sie die Erklärung kurz und konkret: "jede 100 zusätzlich spart etwa 120 an Zinsen" schlägt einen Absatz Theorie. FILE:references/amortization-basics.md # Grundlagen der Tilgung ## Wie ein Kredit mit festem Zinssatz abbezahlt wird Jeden Monat berechnet der Kreditgeber Zinsen auf den noch geschuldeten Saldo. Ihre Zahlung deckt zuerst diese Zinsen; der Rest reduziert den Saldo (Kapital). Da der Saldo sinkt, schrumpft der Zinsanteil jeden Monat und der Kapitalanteil wächst, während die Zahlung gleich bleibt. Frühe Zahlungen sind größtenteils Zinsen; späte Zahlungen sind größtenteils Kapital. ## Formeln - Monatlicher Zinssatz: r = Jahreszinssatz / 12 (z. B. 4,5% -> 0,00375). - Zahlung für einen Kredit P über n Monate: M = P * r / (1 - (1 + r)^-n). Mit r = 0: M = P / n. - Zinsen diesen Monat: Saldo * r. Kapital diesen Monat: M - Zinsen. - Gesamtzinsen: Summe der Zinsanteile, oder ungefähr M * n - P. - Monate bis zur Tilgung mit Zahlung M: n = -ln(1 - P * r / M) / ln(1 + r). Wenn P * r >= M endet der Kredit nie. Schnellprüfungen: 200.000 bei 6% für 30 Jahre -> 1.199,10 pro Monat. 300.000 bei 4,5% für 30 Jahre -> 1.520,06 pro Monat. ## Warum zusätzliche Zahlungen so viel sparen Eine zusätzliche Zahlung reduziert den Saldo sofort, sodass jeder spätere Monat Zinsen auf einen kleineren Betrag berechnet. Die Ersparnis entspricht ungefähr dem zusätzlichen Betrag mal den Zinsen, die er für den Rest des Kredits getragen hätte. Deshalb spart Geld, das früh im Kredit gezahlt wird, mehr als dasselbe Geld, das spät gezahlt wird. ## Begriffe, die Menschen verwechseln | Begriff | Bedeutung | |---|---| | Nominalzinssatz | Der jährliche Zinssatz im Vertrag, verwendet für die monatlichen Zinsen. | | APR | Jährlicher Prozentsatz einschließlich Gebühren; vergleicht Angebote. Ein Kredit mit niedrigerem Zinssatz, aber hohen Gebühren kann einen höheren APR haben. | | Laufzeit | Die geplante Dauer (z. B. 30 Jahre). | | Tilgungsdatum | Wann der Saldo tatsächlich Null erreicht; früher mit zusätzlichen Zahlungen. | | Laufzeit verkürzen vs. Zahlung reduzieren | Nach einer Überzahlung behalten einige Kreditgeber die Zahlung bei und verkürzen die Laufzeit (spart mehr Zinsen), andere berechnen eine niedrigere Zahlung neu. Fragen Sie, welche. | | Kapital | Der noch geschuldete Betrag, ohne zukünftige Zinsen. | | Tilgungsplan | Die Monat-für-Monat-Tabelle von Zahlung, Zinsen, Kapital und Saldo. | ## Rundung und kleine Unterschiede Kreditgeber runden jeden Monat auf Cent und verwenden möglicherweise Tageszinsen (tatsächliche Tage / 365) statt Zinssatz / 12. Ergebnisse können um ein paar Cent pro Monat und ein paar Einheiten bei den Gesamtzinsen abweichen. Die letzte Zahlung absorbiert normalerweise den Rundungsunterschied. ## Grenzen eines Rechners mit festem Zinssatz - Variable oder nachlaufende Zinssätze: Szenarien mit dem aktuellen Zinssatz und bei +1 und +2 Prozentpunkten berechnen. - Zinszahlungsphasen, Ballonzahlungen, Zahlungspausen: separat oder von Hand modellieren. - Versicherung, Treuhand oder Kontogebühren in der monatlichen Zahlung sind keine Zinsen; entfernen Sie sie vor dem Vergleich. FILE:references/prepayment-decision-guide.md # Sollte ich meinen Kredit schneller abbezahlen? Ein Entscheidungsleitfaden Die Überzahlung eines Kredits ergibt eine garantierte, risikofreie "Rendite", die dem Zinssatz des Kredits entspricht. Das ist gut, aber nicht immer die beste Verwendung von überschüssigem Geld. Gehen Sie diese Schritte der Reihe nach durch. ## 1. Sicherheit zuerst - Notgroschen: Behalten Sie etwa 3 bis 6 Monate der wesentlichen Kosten in leicht zugänglichem Sparguthaben, bevor Sie überzahlen. Geld, das an einen Kreditgeber gesendet wird, ist schwer zurückzubekommen. - Stabilen Einkommen: Wenn ein Jobwechsel, Elternzeit oder eine große Ausgabe ansteht, bauen Sie zuerst Bargeld auf. ## 2. Zahlen Sie zuerst die teuerste Schuld Ordnen Sie Schulden nach Zinssatz (Avalanche-Methode): Kreditkarten und Überziehungskredite, dann Privat- und Autokredite, dann Studienkredite und Hypotheken. Überzahlen Sie zuerst den höchsten Zinssatz. Wenn Motivation das Problem ist, kann das Abbezahlen des kleinsten Saldos zuerst (Schneeballmethode) in Ordnung sein, aber sagen Sie, was es kostet. ## 3. Lesen Sie den Vertrag - Vorfälligkeitsentschädigung oder vorzeitige Rückzahlungsgebühr (oft ein Prozentsatz des überzahlten Betrags, meist während einer Festzinsphase). - Jährliche Überzahlungsgrenze (z. B. 10 Prozent des Saldos pro Jahr ohne Gebühr). - Verkürzt eine Überzahlung die Laufzeit oder die Zahlung? Können Sie wählen? - Mindestüberzahlungsbeträge und wie eine Überzahlung erfolgt (online, telefonisch, schriftliche Anweisung). ## 4. Mit der Alternative vergleichen - Die betriebliche Altersvorsorge mit Arbeitgeberzuschuss ist normalerweise besser als jede Überzahlung: Nehmen Sie zuerst den vollen Zuschuss. - Vergleichen Sie den Kreditzinssatz mit der Nachsteuer-, Nachgebührenrendite, die Sie beim Sparen erzielen könnten. Eine 2% Hypothek gegenüber einem 4% Sparkonto: Sparen gewinnt auf dem Papier. Ein 7% Autokredit gegenüber einem 3% Sparkonto: Überzahlung gewinnt. - Investieren kann einen Niedrigzinskredit über lange Zeiträume schlagen, birgt aber Risiken; die Überzahlungsrendite ist sicher. - Steuern: In einigen Ländern sind Hypothekenzinsen steuerlich absetzbar, was den effektiven Zinssatz senkt. Lokal prüfen; nicht annehmen. ## 5. Eine Strategie wählen | Strategie | Gut, wenn | |---|---| | Fester Zusatzbetrag pro Monat | Stabilen Einkommen; baut eine Gewohnheit auf; spart am meisten für dasselbe Gesamtvolumen, wenn früh begonnen. | | Einmalzahlungen (Bonus, Steuererstattung) | Unregelmäßiges Einkommen; behält Flexibilität während des Jahres. | | Höhere feste Zahlung | Möchte ein klares schuldenfreies Datum. | | Refinanzierung auf kürzere Laufzeit | Ein niedrigerer Zinssatz ist verfügbar und die höhere Zahlung ist erschwinglich; Gebühren vergleichen. | | Bargeld behalten, später überzahlen | Festzinsphase endet bald (nachher ohne Strafe überzahlen), oder Notgroschen nicht voll. | ## 6. Überprüfen Berechnen Sie die Zahlen einmal im Jahr neu, wenn sich der Zinssatz ändert oder wenn sich das Einkommen ändert. Erinnern Sie den Benutzer daran, dass Überzahlung jederzeit pausiert werden kann; eine höhere vertragliche Zahlung normalerweise nicht. FILE:templates/loan-plan.md # Kreditplan: ${loan_name} **Kredit:** ${balance} bei ${rate}% (${fixed_or_variable}), ${remaining_term} Restlaufzeit, Zahlung ${payment} pro Monat, erste Zahlung in diesem Plan ${start_month} **Gebühren und Regeln:** ${fees}; Überzahlungsgrenze oder -strafe: ${prepayment_rules} **Ziel:** ${goal} **Budget für zusätzliche Zahlungen:** ${extra_budget} ## Basislinie - Monatliche Zahlung: - Gesamtzinsen ab jetzt: - Tilgungsdatum: - Aufteilung der ersten Zahlung: Zinsen ... / Kapital ... ## Szenarien | Option | Monatliche Belastung | Tilgungsdatum | Gesamtzinsen | Zinsersparnis | Eingesparte Monate | |---|---|---|---|---|---| | Basislinie | | | | - | - | | A: | | | | | | | B: | | | | | | | C: | | | | | | ## Empfehlung Option ... weil: 1. 2. 3. Zu beachtende Kompromisse: ## Vor der Überzahlung - [ ] Notgroschen deckt ... Monate - [ ] Keine höher verzinste Schuld mehr (oder sie kommt zuerst) - [ ] Vorfälligkeitsentschädigung / -grenze mit dem Kreditgeber geprüft - [ ] Überzahlung so eingestellt, dass sie die Laufzeit verkürzt (oder die Zahlung, falls bevorzugt) ## Fragen an den Kreditgeber 1. 2. ## Nächste Schritte 1. 2. *Annahmen: fester Zinssatz, monatliche Zahlungen, zusätzliche Zahlungen werden sofort auf das Kapital angewendet. Dies sind Schätzungen, keine Finanzberatung.* FILE:examples/example-mortgage-overpayment.md # Beispiel: Vergleich von drei Hypotheken-Überzahlungsstrategien ## Benutzeranfrage "Wir haben noch 320.000 auf unserer Hypothek bei 4,1% fest mit 25 Jahren Restlaufzeit, erste Zahlung dieses Plans im Dezember 2026. Wir könnten etwa 300 extra pro Monat zahlen, oder wir bekommen jedes Jahr für die nächsten drei Jahre einen Bonus von 15.000. Ein Freund sagt, wir sollten einfach auf 2.400 pro Monat umstellen. Was ist am besten? Wir haben 6 Monate Ausgaben gespart und keine anderen Schulden. Die Bank erlaubt 10% Überzahlung pro Jahr ohne Gebühren." ## Befehle ```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 ``` Ausgabe (gekürzt): ``` Basislinie: 1.706,80 pro Monat, Zinsen 192.038,38, insgesamt gezahlt 512.038,38, abbezahlt 2051-11 (300 Zahlungen) Plan (+300,00/Monat): abbezahlt 2046-02 (231 Zahlungen), Zinsen 143.068,39 Spart 48.969,99 Zinsen und 69 Monate (5 J 9 M); jede 100 extra spart 70,97 Plan (Einmalzahlungen 15.000,00 in Zahlung 12, 15.000,00 in Zahlung 24, 15.000,00 in Zahlung 36): abbezahlt 2046-11 (240 Zahlungen), Zinsen 133.018,73 Spart 59.019,65 Zinsen und 60 Monate (5 J 0 M); jede 100 extra spart 131,15 Plan (feste Zahlung 2.400,00): abbezahlt 2041-10 (179 Zahlungen), Zinsen 107.805,37 Spart 84.233,01 Zinsen und 121 Monate (10 J 1 M) ``` ## Kreditplan (ausgefüllte Vorlage, gekürzt) **Kredit:** 320.000,00 bei 4,1% fest, 25 Jahre Restlaufzeit, Zahlung 1.706,80 pro Monat, erste Zahlung Dezember 2026 **Gebühren und Regeln:** Überzahlungen bis zu 10% des Saldos pro Jahr sind kostenlos **Ziel:** weniger Zinsen zahlen, ohne Flexibilität zu verlieren | Option | Monatliche Belastung | Tilgungsdatum | Gesamtzinsen | Zinsersparnis | Eingesparte Monate | |---|---|---|---|---|---| | Basislinie | 1.706,80 | 2051-11 | 192.038,38 | - | - | | A: +300 pro Monat | 2.006,80 | 2046-02 | 143.068,39 | 48.969,99 | 69 | | B: 15.000 Bonus in den Jahren 1 bis 3 | 1.706,80 + 45.000 insgesamt | 2046-11 | 133.018,73 | 59.019,65 | 60 | | C: feste 2.400 pro Monat | 2.400,00 | 2041-10 | 107.805,37 | 84.233,01 | 121 | **Empfehlung:** Option B, plus A, wenn das Budget es erlaubt. Die Boni werden früh im Kredit gezahlt, sodass jede 100 überzahlt etwa 131 an Zinsen spart, fast doppelt so viel wie beim monatlichen Plan (etwa 71 pro 100, weil viel dieses Geldes in späteren Jahren gezahlt wird). Es erfordert keine Änderung des monatlichen Budgets, und jede 15.000 liegt innerhalb der kostenlosen 10% Grenze (32.000 im Jahr 1). Option C spart am meisten, weil sie über 15 Jahre etwa 124.000 an zusätzlichem Geld sendet, aber sie erhöht die feste Belastung um 693 pro Monat; tun Sie das nur, wenn es bequem passt, und richten Sie es als freiwillige Überzahlung ein, nicht als neuen Vertragszahlung, damit es pausiert werden kann. **Kompromisse:** überzahltes Geld ist schwer zurückzubekommen; halten Sie den 6-Monats-Notgroschen unangetastet. Wenn Ihr Sparkonto nach Steuern mehr als 4,1% zahlt, könnte Sparen die Überzahlung auf dem Papier schlagen; prüfen Sie den Zinssatz und etwaige lokale Steuerregeln. **Fragen an den Kreditgeber:** 1. Verkürzen Überzahlungen die Laufzeit bei unveränderter Zahlung (oben angenommen), oder wird die Zahlung neu berechnet? 2. Setzt sich die 10% Grenze pro Kalenderjahr oder pro Kreditjahr zurück? *Annahmen: fester Zinssatz für die gesamte Laufzeit, monatliche Zahlungen, Überzahlungen werden sofort auf das Kapital angewendet. Schätzungen, keine Finanzberatung.* FILE:scripts/amortize.py #!/usr/bin/env python3 """Tilgung für Kredite mit festem Zinssatz, mit zusätzlichen Zahlungen und Szenarienvergleich. Verwendung: python3 amortize.py --principal 250000 --rate 4.2 --years 30 [Optionen] python3 amortize.py --principal 18000 --rate 7.9 --months 60 --extra 150 Optionen: --principal N geliehener Betrag (erforderlich) --rate PCT nominaler jährlicher Zinssatz in Prozent, z. B. 4.2 (erforderlich; 0 erlaubt) --years N | --months N Laufzeit (eine davon ist erforderlich) --start YYYY-MM Monat der ersten Zahlung (Standard: nächster Monat) --extra N zusätzlicher Betrag, der jeder monatlichen Zahlung hinzugefügt wird --extra-from N Zahlungsnummer, ab der --extra beginnt (Standard 1) --lump N:AMOUNT einmalige zusätzliche Zahlung in Zahlungsnummer N (wiederholbar) --payment N diesen festen monatlichen Betrag zahlen statt des berechneten --fee N einmalige Vorabgebühren, verwendet für die Kosten- und APR-Schätzung --schedule FILE den vollständigen monatlichen Plan als CSV schreiben --yearly eine Jahr-für-Jahr-Tabelle drucken --json das Ergebnis als JSON drucken Zusätzliche Zahlungen reduzieren das Kapital sofort ohne Vorfälligkeitsentschädigung und bei gleicher monatlicher Zahlung (Laufzeit verkürzt sich). Zinssätze sind nominal jährlich, monatlich verzinst (Zinssatz / 12 pro Monat). Geld wird jeden Monat auf Cent gerundet. Exit-Codes: 0 ok, 2 Verwendungs- oder Eingabefehler. Nur Python 3 Standardbibliothek. """ 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("der Kredit ist innerhalb von 100 Jahren nicht abbezahlt; die Zahlung ist zu klein für die Zinsen") interest = round(bal * r, 2) if base + (extra if k >= extra_from else 0) <= interest and not lumps.get(k): raise ValueError(f"Zahlung {base:.2f} deckt die monatlichen Zinsen {interest:.2f} nicht; der Saldo würde wachsen") sched = min(base, bal + interest) if payment is None and k == n: sched = bal + interest # letzte geplante Zahlung absorbiert den Rundungsunterschied 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): """Jährlicher Zinssatz, der die Zahlungen dem Kapital minus Gebühr entspricht (Bisektion).""" 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="Kredittilgung mit zusätzlichen Zahlungen") 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("Kapital und Laufzeit müssen positiv sein; Zinssatz, extra und Gebühr dürfen nicht negativ sein") if a.rate > 100: raise ValueError("Zinssatz ist in Prozent pro Jahr, z. B. 4.2 für 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 muss wie 24:5000 aussehen (Zahlungsnummer:Betrag), erhalten {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 muss wie 2026-11 aussehen, erhalten {a.start!r}") from None if not 1 <= start[1] <= 12: raise ValueError("--start Monat muss 01 bis 12 sein") 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"Fehler: {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"Fehler: Plan {a.schedule} kann nicht geschrieben werden: {e.strerror}", file=sys.stderr) return 2 if a.json: print(json.dumps(result, indent=2)) return 0 b = result["baseline"] print(f"Kredit {a.principal:,.2f} bei {a.rate}% für {n} Monate, erste Zahlung {fmt_ym(start)}") print(f"Basislinie: {b['monthly_payment']:,.2f} pro Monat, Zinsen {b['total_interest']:,.2f}, " f"insgesamt gezahlt {b['total_paid']:,.2f}, abbezahlt {b['payoff']} ({b['months']} Zahlungen)") if a.fee: print(f" Mit Gebühren {a.fee:,.2f}: Gesamtkosten der Kreditaufnahme {b['total_cost_incl_fees']:,.2f}, APR etwa {b['apr_estimate_pct']}%") print(f" Erste Zahlung: {first['interest']:,.2f} Zinsen, {first['principal']:,.2f} Kapital") if scenario: pl = result["plan"] what = [] if a.payment: what.append(f"feste Zahlung {a.payment:,.2f}") if a.extra: what.append(f"+{a.extra:,.2f}/Monat" + (f" ab Zahlung {a.extra_from}" if a.extra_from > 1 else "")) if lumps: what.append("Einmalzahlungen " + ", ".join(f"{v:,.2f} in Zahlung {k}" for k, v in sorted(lumps.items()))) print(f"Plan ({'; '.join(what)}): abbezahlt {pl['payoff']} ({pl['months']} Zahlungen), " f"Zinsen {pl['total_interest']:,.2f}") ms = pl["months_saved"] if ms >= 0 and pl["interest_saved"] >= 0: print(f" Spart {pl['interest_saved']:,.2f} Zinsen und {ms} Monate ({ms // 12} J {ms % 12} M)" + (f"; jede 100 extra spart {pl['interest_saved_per_100_extra']:,.2f}" if pl.get("interest_saved_per_100_extra") else "")) else: print(f" WARNUNG: Dieser Plan kostet {-pl['interest_saved']:,.2f} MEHR Zinsen und dauert {-ms} Monate länger als die Basislinie") if a.yearly: print(f"\nJahr für Jahr ({'Plan' if scenario else 'Basislinie'}):") print(f"{'Jahr':>4} {'Gezahlt':>12} {'Zinsen':>12} {'Kapital':>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"\nPlan geschrieben nach {a.schedule} ({len(rows)} Zeilen)") return 0 if __name__ == "__main__": sys.exit(main(sys.argv[1:]))

Melde dich an, um den vollständigen Prompt zu sehen

Weiter mit:

Mit der Anmeldung akzeptierst du unsere Nutzungsbedingungen und Datenschutz

Verwendung

Dieser Prompt ist für die Verwendung mit personal gedacht. Kopiere den Inhalt oben und füge ihn in dein bevorzugtes KI-Tool ein.

Für beste Ergebnisse passe die Platzhalter (eckige Klammern oder Großbuchstaben) an deine Anforderungen an.

Referenzen

Kategorien:personal| prompts.chat| loan-amortization| mortgage-calculator

Diskussion