kuddlmuddl
Commander
- Registriert
- Mai 2010
- Beiträge
- 2.710
Hi,
wie schon im anderen Thread angedeutet könnte ich Hilfe bei der Web-Umsetzung eines Projektes brauchen.
Es geht um die Berechnung des optimalen Kaufzeitpunkts einer Immobilie.
Natürlich gibt es bereits Spar- und auch Tilgungs- bzw. Finanzierungsrechner im Internet. Was aber eben fehlt ist ein Programm was die verschiedenen Planer aneinander hängt um den optimalen Kaufzeitpunkts zu bestimmen.
Was die Spar- und die Tilgungsphasen angeht habe ich mich an http://www.zinsen-berechnen.de/sparrechner.php bzw. http://www.zinsen-berechnen.de/kreditrechner.php orientiert. Die Werte meiner Berechnungen stimmen in meinen Tests immer mit denen online überein.
Rückmeldung/Kritik/Hilfe erwünscht
Das ganze ist natürlich weder eine Hausaufgabe oÄ noch habe ich den Code irgendwo geklaut..
Modell
Die gesamte Prognosezeit besteht aus drei Phasen:
1) Ansparphase (vor dem Immobilenkauf in der weiterhin Miete gezahlt wird)
2) Tilgungsphase (ab dem Kauf bis zum endgültigen Abbezahlen)
3) Mietfreie Sparphase (Nach dem Abbezahlen bis zum Ende der Prognosezeit)
Die Frage, die ich beantworten wollte ist: Wie lang sollte 1) im Optimalfall sein, um am ende von 3) maximal viel Geld zu haben.
Hierzu wird einfach Monat für Monat der aktuelle Kontostand bestimmt und Kaufzeitpunkte für ganzzahlige Jahreszahlen durchgespielt
1. Output (Grafik - GnuPLOT)
2. Output (Konsole)
Code
Bugs
TODOs
Das ganze soll mit möglichst wenig Aufwand benutzbarer werden.
D.h. Web-Gui in der Parameter eingegeben werden können und Echtzeitaktualisierung der Graphen auf einer Internetseite. Am liebsten mit & Textfeldern Schiebereglern.
Außerdem wärs Interessant, wenn sich jemand mit Steuerrecht auskennt um zB auch zu erlauben aktuelles Brutto-Einkommen einzugeben anstatt Netto, um dann automatisch Lohnsteigerungen und entsprechend angepasste Lohnnebenkosten zu berücksichtigen.
edit:
Die eingegeben Daten sind natürlich rein fiktiv und wurden extra so angepasst, damit die Graphen möglichst gut aussehen.
wie schon im anderen Thread angedeutet könnte ich Hilfe bei der Web-Umsetzung eines Projektes brauchen.
Es geht um die Berechnung des optimalen Kaufzeitpunkts einer Immobilie.
Natürlich gibt es bereits Spar- und auch Tilgungs- bzw. Finanzierungsrechner im Internet. Was aber eben fehlt ist ein Programm was die verschiedenen Planer aneinander hängt um den optimalen Kaufzeitpunkts zu bestimmen.
Was die Spar- und die Tilgungsphasen angeht habe ich mich an http://www.zinsen-berechnen.de/sparrechner.php bzw. http://www.zinsen-berechnen.de/kreditrechner.php orientiert. Die Werte meiner Berechnungen stimmen in meinen Tests immer mit denen online überein.
Rückmeldung/Kritik/Hilfe erwünscht
Das ganze ist natürlich weder eine Hausaufgabe oÄ noch habe ich den Code irgendwo geklaut..
Modell
Die gesamte Prognosezeit besteht aus drei Phasen:
1) Ansparphase (vor dem Immobilenkauf in der weiterhin Miete gezahlt wird)
2) Tilgungsphase (ab dem Kauf bis zum endgültigen Abbezahlen)
3) Mietfreie Sparphase (Nach dem Abbezahlen bis zum Ende der Prognosezeit)
Die Frage, die ich beantworten wollte ist: Wie lang sollte 1) im Optimalfall sein, um am ende von 3) maximal viel Geld zu haben.
Hierzu wird einfach Monat für Monat der aktuelle Kontostand bestimmt und Kaufzeitpunkte für ganzzahlige Jahreszahlen durchgespielt
1. Output (Grafik - GnuPLOT)
Startkapital: 0
Sparrate: 1000
Tilgungsrate: 1500
Kauf nach 0 Jahren mit 0% Eigenkapital, Kontostand nach 50 Jahren -846795 => Neues Optimum (0 Jahre sparen)
Kauf nach 3 Jahren mit 9% Eigenkapital, Kontostand nach 50 Jahren -578461 => Neues Optimum (3 Jahre sparen)
Kauf nach 6 Jahren mit 18% Eigenkapital, Kontostand nach 50 Jahren -357019 => Neues Optimum (6 Jahre sparen)
Kauf nach 9 Jahren mit 26% Eigenkapital, Kontostand nach 50 Jahren -180534 => Neues Optimum (9 Jahre sparen)
Kauf nach 12 Jahren mit 35% Eigenkapital, Kontostand nach 50 Jahren -43043.8 => Neues Optimum (12 Jahre sparen)
Kauf nach 15 Jahren mit 43% Eigenkapital, Kontostand nach 50 Jahren 59742.6 => Neues Optimum (15 Jahre sparen)
Kauf nach 18 Jahren mit 50% Eigenkapital, Kontostand nach 50 Jahren 128453 => Neues Optimum (18 Jahre sparen)
Kauf nach 21 Jahren mit 58% Eigenkapital, Kontostand nach 50 Jahren 173636 => Neues Optimum (21 Jahre sparen)
Kauf nach 24 Jahren mit 65% Eigenkapital, Kontostand nach 50 Jahren 202557 => Neues Optimum (24 Jahre sparen)
Kauf nach 27 Jahren mit 72% Eigenkapital, Kontostand nach 50 Jahren 219673 => Neues Optimum (27 Jahre sparen)
Kauf nach 30 Jahren mit 79% Eigenkapital, Kontostand nach 50 Jahren 227819 => Neues Optimum (30 Jahre sparen)
Kauf nach 33 Jahren mit 86% Eigenkapital, Kontostand nach 50 Jahren 228948 => Neues Optimum (33 Jahre sparen)
Kauf nach 36 Jahren mit 93% Eigenkapital, Kontostand nach 50 Jahren 224529
Kauf nach 39 Jahren mit 99% Eigenkapital, Kontostand nach 50 Jahren 215826
Drücken Sie eine beliebige Taste . . .
Sparrate: 1000
Tilgungsrate: 1500
Kauf nach 0 Jahren mit 0% Eigenkapital, Kontostand nach 50 Jahren -846795 => Neues Optimum (0 Jahre sparen)
Kauf nach 3 Jahren mit 9% Eigenkapital, Kontostand nach 50 Jahren -578461 => Neues Optimum (3 Jahre sparen)
Kauf nach 6 Jahren mit 18% Eigenkapital, Kontostand nach 50 Jahren -357019 => Neues Optimum (6 Jahre sparen)
Kauf nach 9 Jahren mit 26% Eigenkapital, Kontostand nach 50 Jahren -180534 => Neues Optimum (9 Jahre sparen)
Kauf nach 12 Jahren mit 35% Eigenkapital, Kontostand nach 50 Jahren -43043.8 => Neues Optimum (12 Jahre sparen)
Kauf nach 15 Jahren mit 43% Eigenkapital, Kontostand nach 50 Jahren 59742.6 => Neues Optimum (15 Jahre sparen)
Kauf nach 18 Jahren mit 50% Eigenkapital, Kontostand nach 50 Jahren 128453 => Neues Optimum (18 Jahre sparen)
Kauf nach 21 Jahren mit 58% Eigenkapital, Kontostand nach 50 Jahren 173636 => Neues Optimum (21 Jahre sparen)
Kauf nach 24 Jahren mit 65% Eigenkapital, Kontostand nach 50 Jahren 202557 => Neues Optimum (24 Jahre sparen)
Kauf nach 27 Jahren mit 72% Eigenkapital, Kontostand nach 50 Jahren 219673 => Neues Optimum (27 Jahre sparen)
Kauf nach 30 Jahren mit 79% Eigenkapital, Kontostand nach 50 Jahren 227819 => Neues Optimum (30 Jahre sparen)
Kauf nach 33 Jahren mit 86% Eigenkapital, Kontostand nach 50 Jahren 228948 => Neues Optimum (33 Jahre sparen)
Kauf nach 36 Jahren mit 93% Eigenkapital, Kontostand nach 50 Jahren 224529
Kauf nach 39 Jahren mit 99% Eigenkapital, Kontostand nach 50 Jahren 215826
Drücken Sie eine beliebige Taste . . .
Code
PHP:
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
struct SparenReturn
{
double gespart;
double gezahlteSteuer;
double verbleibenderZinsgewinnFreibetrag;
};
struct Daten
{
int prognosezeit;
double kapital;
double monatsNetto;
double lebenEndEssen;
double geldProMonat; // was steht ohne Raten / Sparen / Mieten zur Verfügung? (Nach Essen und Leben und allem)
double kaltmiete;
double nebenkosten;
double warmmiete;
double sparrate;
double hausgeld; // Bei Kauf: Was wird zur Kaltmiete und den Ratenzahlungen noch fällig für "Instanthaltung"
double tilgungsrate; // Man spart also quasi kaltmiete - wohngeld
double immoPreis; // Preis der Immobilie (inkl. 4% Maklerkosten, 1,5% Notarkosten, 3,5% Grunderwerbssteuer)
double zinssatzAnlageProJahr;
double zinssatzAnlageProMonat;
double zinssatzDarlehenProJahr;
double zinssatzDarlehenProMonat;
int zinsgewinnFreibetrag; // Single: 801, Ehepaare: 1602
double zinssatzKapitalertragssteuer;
double inflation;
int kaufNachJahren;
int kaufNachJahrenStufen;
int monatsStufen;
};
SparenReturn spare(double startKapital, double sparrate, double zinssatzAnlage, int monate, int steuer, double gezahlteSteuer, int zinsgewinnFreibetragProJahr, double verbleibenderZinsgewinnFreibetrag, double zinssatzKapitalertragssteuer);
double tilge(const Daten &d, double kontostand);
void berechneKontostaende(const Daten &d, int kaufNachJahren);
void writeToFile(const Daten &d, string &s, int kaufNachJahren);
void gnuplotFile(const Daten &d);
int main(int argc, char *argv[])
{
Daten d;
d.prognosezeit = 50;
d.kapital = 0.0;
d.monatsNetto = 2700;
d.lebenEndEssen = 800; // ca. 200 Essen pP, Freizeit, Auto, urlaub, altersvorsorge, versicherungen, ...
d.geldProMonat = d.monatsNetto - d.lebenEndEssen; // was steht ohne Raten / Sparen / Mieten zur Verfügung? (Nach Essen und Leben und allem)
d.kaltmiete = 650.0;
d.nebenkosten = 250;
d.warmmiete = d.kaltmiete + d.nebenkosten;
d.sparrate = d.geldProMonat - d.warmmiete;
d.hausgeld = 150; // Bei Kauf: Was wird zur Kaltmiete und den Ratenzahlungen noch fällig für "Instanthaltung"
d.tilgungsrate = d.geldProMonat - d.hausgeld - d.nebenkosten; // Man spart also quasi kaltmiete - wohngeld
d.immoPreis = 400000; // Preis der Immobilie (inkl. 4% Maklerkosten, 1,5% Notarkosten, 3,5% Grunderwerbssteuer)
d.zinssatzAnlageProJahr = 2.5;
d.zinssatzAnlageProMonat = d.zinssatzAnlageProJahr / 12.0;
d.zinssatzDarlehenProJahr = 5.0; // ACHTUNG - HIER p.a. nominal - nicht effektiv!
d.zinssatzDarlehenProMonat = d.zinssatzDarlehenProJahr / 12.0;
d.zinsgewinnFreibetrag = 1602; // Single: 801, Ehepaare: 1602
d.zinssatzKapitalertragssteuer = 26.375;
d.inflation = 1.5;
d.kaufNachJahren = 39;
d.kaufNachJahrenStufen = 3;
d.monatsStufen = 1;
cout << "Startkapital: " << d.kapital << "\n";
cout << "Sparrate: " << d.sparrate << "\n";
cout << "Tilgungsrate: " << d.tilgungsrate << "\n\n";
int jahre = 0;
for (; jahre <= d.kaufNachJahren; jahre+=d.kaufNachJahrenStufen) {
//kaufNach(jahre, d);
berechneKontostaende(d, jahre);
}
gnuplotFile(d);
system("PAUSE");
return EXIT_SUCCESS;
}
/*
Am Anfang des Monats gibts 1x Zinsen auf die bisher liegende Summe
Danach noch + monatliche Einzahlung
*/
SparenReturn spare(
double geldAufKonto, // Wieviel liegt schon drauf?
double sparrate, // Wieviel kommt diesen Monat hinzu?
double zinssatzAnlageProMonat, // Wieviel % Gibts? zB 3% pa bedeutet 3/12
int monat, // Welcher Monat ist gerade
int steuer, // Sind Kapitalertragssteuern nötig? (1=JA, 0=NEIN)
double gezahlteSteuer, // Wieviel wurde bisher an Steuer bezahlt
int zinsgewinnFreibetragProJahr, // Wieviel Zinsertrag ist Steuerfrei (801 je Ehepartner)
double verbleibenderZinsgewinnFreibetrag, // Wieviel des Freibetrages ist dieses Jahr noch ueber
double zinssatzKapitalertragssteuer) { // Wie wird der Zinsertrag, der über Freibetrag liegt besteuert?
SparenReturn result;
result.verbleibenderZinsgewinnFreibetrag = verbleibenderZinsgewinnFreibetrag;
if (monat %12 == 0) { // Ein neues Jahr beginnt - der zinsgewinnFreibetrag steht wieder voll zur Verfuegung
result.verbleibenderZinsgewinnFreibetrag = zinsgewinnFreibetragProJahr;
}
geldAufKonto += sparrate; // Einzahlung der Rate am Monatsanfang => Wird bei Zins berücksichtigt
double zinsen = geldAufKonto * (zinssatzAnlageProMonat / 100.0); // Zinsen (vor Steuer) für geldAufKonto
double zuZahlendeSteuern = 0.0;
if (steuer) {
// 1) 0 Steuer: Diesen Monat gibts weniger Steuern als noch Freibetrag ueber ist
if (zinsen < result.verbleibenderZinsgewinnFreibetrag) {
result.verbleibenderZinsgewinnFreibetrag -= zinsen;
geldAufKonto = geldAufKonto + zinsen;
}
// 2) teil bzw. keine Steuer: Dieses Jahr hat evtl. noch Freibetrag und der Zinsgewinn diesen Monat uebersteigt ihn => Teil des Zinsgewinns (in Höhe des verbleibenderZinsgewinnFreibetrag) wird unbesteuert gutgeschrieben) & Rest der Zinsen wird versteuert (evtl alle bei 0 freiBetrag)
else if (result.verbleibenderZinsgewinnFreibetrag >= 0.0) {
geldAufKonto += result.verbleibenderZinsgewinnFreibetrag; // Rest unversteuerter Zinsen
zinsen -= result.verbleibenderZinsgewinnFreibetrag;
result.verbleibenderZinsgewinnFreibetrag = 0.0;
zuZahlendeSteuern = zinsen * zinssatzKapitalertragssteuer/100.0;
gezahlteSteuer += zuZahlendeSteuern;
zinsen = zinsen - zuZahlendeSteuern;
geldAufKonto = geldAufKonto + zinsen;
}
}
else { // Keine Steuer
geldAufKonto = geldAufKonto + zinsen;
}
/*
cout << "Monat " << monate;
cout << ", vZF " << verbleibenderZinsgewinnFreibetrag;
cout << ", Einzahlung " << sparrate;
cout << ", Zinsen " << zinsen;
cout << ", Steuer " << zuZahlendeSteuern;
cout << ", Neues Guthaben " << geldAufKonto + zinsen << "\n";
*/
result.gezahlteSteuer = gezahlteSteuer;
result.gespart = geldAufKonto;
return result;
}
double tilge(const Daten &d, double kontostand) {
double restSchuld = kontostand + d.tilgungsrate;
double zinsen = kontostand * (d.zinssatzDarlehenProMonat)/100.0;
// cout << "Schulden= " << kontostand;
// cout << ", Zinsen= " << zinsen;
// cout << ", Tilgung= " << d.tilgungsrate + zinsen << "\n";
// double restSchuld = kontostand + zinsen + d.tilgungsrate;
return restSchuld + zinsen;
}
void berechneKontostaende(const Daten &d, int kaufNachJahren) {
static int besterKaufzeitpunkt = 0;
static int kontostandDesBestenKaufzeitpunkts = -99999999;
string s;
char buffer [50];
double kontostand = d.kapital;
SparenReturn sparenResult;
for (int monat = 0; monat <= d.prognosezeit*12; ++monat) {
if (monat < kaufNachJahren*12) { // Sparphase
sparenResult = spare(kontostand, d.sparrate, d.zinssatzAnlageProMonat, monat, 1, 0.0, d.zinsgewinnFreibetrag, sparenResult.verbleibenderZinsgewinnFreibetrag, d.zinssatzKapitalertragssteuer);
kontostand = sparenResult.gespart;
}
else { // Nach Kauf: Erstmal Tilgen und danach erneut sparen
if (monat == kaufNachJahren*12) { // Kauf-Monat!
double inflationsPreisaufschlag = pow(1.0+(d.inflation / 100), kaufNachJahren) * d.immoPreis;
int eigenkapitalProzent = (int)(100.0 * kontostand / inflationsPreisaufschlag + 0.5);
cout << "Kauf nach " << kaufNachJahren << " Jahren mit " << eigenkapitalProzent << "% Eigenkapital";
//kontostand = sparenResult.gespart - inflationsPreisaufschlag;
kontostand -= inflationsPreisaufschlag;
}
if (kontostand < 0) {
kontostand = tilge(d, kontostand);
}
else { // Haus is abbezahlt - Sparen beginnt
sparenResult = spare(kontostand, d.tilgungsrate, d.zinssatzAnlageProMonat, monat-kaufNachJahren*12, 1, 0.0, d.zinsgewinnFreibetrag, sparenResult.verbleibenderZinsgewinnFreibetrag, d.zinssatzKapitalertragssteuer);
kontostand = sparenResult.gespart;
}
}
if (monat % d.monatsStufen == 0) {
// x-Wert
double x = monat / 12.0;
sprintf(buffer, "%f", x);
s += buffer;
s += " ";
// y-Wert
itoa( (int)(kontostand+0.5), buffer, 10);
s += buffer;
s += "\n";
}
}
cout << ", Kontostand nach " << d.prognosezeit << " Jahren " << kontostand;
if (kontostand > kontostandDesBestenKaufzeitpunkts) {
besterKaufzeitpunkt = kaufNachJahren;
kontostandDesBestenKaufzeitpunkts = kontostand;
cout << " => Neues Optimum (" << kaufNachJahren << " Jahre sparen)";
}
cout << "\n";
s += '\n';
writeToFile(d, s, kaufNachJahren);
}
/*
Ein String, in dem die stufenweisen Kontostaende stehen wird entsprechend benannt in eine Datei geschrieben
*/
void writeToFile(const Daten &d, string &s, int kaufNachJahren) {
string filename;
char buffer [50];
itoa(kaufNachJahren, buffer, 10);
filename += buffer;
filename += ".txt";
FILE * f;
f = fopen (filename.c_str(), "w");
if (f != NULL) {
fputs (s.c_str(),f);
fclose (f);
}
//cout << s;
}
/*
Schreibt die gnuPlot File, die alle plot-commands aller Daten enthält
*/
void gnuplotFile(const Daten &d) {
char buffer [50];
string filename;
filename += "immo.gp";
string s;
s += "reset\n";
itoa(d.prognosezeit +1, buffer, 10);
s += "set xrange [-1:";
s += buffer;
s += "]\n";
s += "set key outside\n";
s += "set zeroaxis\n";
s += "set noyzeroaxis\n";
s += "show zeroaxis\n";
s += "set xlabel 'Zeit [Jahre]'\n";
s += "set ylabel 'Guthaben [Euro]'\n\n";
for (int i = 0; i <= d.kaufNachJahren; i+=d.kaufNachJahrenStufen) {
s += "f";
itoa(i, buffer, 10);
s += buffer;
s += " = 'C:\\My Dropbox\\DevCPP\\projects\\immo\\";
s += buffer;
s += ".txt'";
s += '\n';
}
s += "\n";
s += "plot ";
for (int i = 0; i <= d.kaufNachJahren; i+=d.kaufNachJahrenStufen) {
s += "f";
itoa(i, buffer, 10);
s += buffer;
if (i < d.kaufNachJahren) {
s += " with lines linewidth 3, ";
}
}
s += " with lines linewidth 3";
FILE * f;
f = fopen (filename.c_str(), "w");
if (f != NULL) {
fputs (s.c_str(),f);
fclose (f);
}
}
Bugs
- Ungültige Parameter werden nicht abgefangen. Könnte auch von einer Gui gemacht werden.
- Einige Parameter müssten ganzzahlige Teiler anderer Parameter sein wie zB bei:
- d.kaufNachJahren = 20; d.kaufNachJahrenStufen = 4; (das zweite MUSS Teiler vom ersten sein)
- Einige Parameter müssten ganzzahlige Teiler anderer Parameter sein wie zB bei:
- d.kaufNachJahren = 20; d.kaufNachJahrenStufen = 4; (das zweite MUSS Teiler vom ersten sein)
TODOs
- Gui für Parameterwahl
- % Tilgung im ersten Monat (nach kauf) berechnen und ausgeben
- Inflation berücksichtigt bisher nur Immobilienpreis. Es fehlt: Steigerung der Lebensunterhaltskosten und steigerung der Kaltmiete + Nebenkosten + Hausgeld.
- Gehaltssteigerungen
- % Tilgung im ersten Monat (nach kauf) berechnen und ausgeben
- Inflation berücksichtigt bisher nur Immobilienpreis. Es fehlt: Steigerung der Lebensunterhaltskosten und steigerung der Kaltmiete + Nebenkosten + Hausgeld.
- Gehaltssteigerungen
Das ganze soll mit möglichst wenig Aufwand benutzbarer werden.
D.h. Web-Gui in der Parameter eingegeben werden können und Echtzeitaktualisierung der Graphen auf einer Internetseite. Am liebsten mit & Textfeldern Schiebereglern.
Außerdem wärs Interessant, wenn sich jemand mit Steuerrecht auskennt um zB auch zu erlauben aktuelles Brutto-Einkommen einzugeben anstatt Netto, um dann automatisch Lohnsteigerungen und entsprechend angepasste Lohnnebenkosten zu berücksichtigen.
edit:
Die eingegeben Daten sind natürlich rein fiktiv und wurden extra so angepasst, damit die Graphen möglichst gut aussehen.
Zuletzt bearbeitet:
