Projekt: Immobilen-Finanzierungsplaner

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)
Jeder Linie entspricht "Kauf nach x Jahren". So ist zB die Rote f0 ein Kauf mit 0% Eigenkapital und der in diesem Szenario optimale Kaufzeitpunkt wäre nach 33 Jahren Ansparzeit mit 86% Eigenkapital.
2. Output (Konsole)
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 . . .


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)

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

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:
1) Sieht wer Fehler / hat sonstige Anmerkungen / Verbesserungsvorschläge?
2) Hat jemand Interesse mitzuhelfen das Ganze online zu stellen? Ich hab von Webentwicklung 0 Ahnung.
Mir würde eine grobe Vorlage für ne Website mit wenigen Textfeldern und einem Graphen-Zeichenbereich reichen die ich dann selbst vervollständige.
3) Kennt sich wer gut genug mit Steuerrecht aus um mir zu helfen ne Kind-Planung da einzubauen? (Kinderfreibeträge, Kindergeld, Elternzeit, Brutto-Netto Rechner etc..)

Es soll einfach ein langfristiger Immo-Kauf planer sein, um Leute einfach ausprobierbar klar zu machen, dass Sätze wie
"Je früher man kauft, desto eher spart man Miete"
und
"Kaltmiete ist fast genau so hoch wie Ratenzahlung - da kann man auch direkt kaufen"
einfach Unsinn sind. Ich vermute, dass bei Eigenkapital zB <70% (oder welche Zahl auch immer genau rauskommt bei durchschnittlichem Einkommen) nur Banken an einem Kauf verdienen.
Hintergrund ist halt, dass ich immer wieder höre, wie Leute mit deutlich unter 25% Eigenkapital ne 30-35 jährige Finanzierung abschließen und am Ende dann mehr als das doppelte Zahlen, was das Haus eigtl. gekostet hat und (wie ich nach einigem rumprobieren mit meinem Programm vermute) mit längerem Mieten&Ansparen deutlich besser dastehen würden.
Nur möchten die wenigsten Menschen C++ code runterladen und die eigene Lebenssituation dort in Parameter reinkompilieren..
 
Zuletzt bearbeitet:
Ich wäre prinzipiell daran interessiert dir beim Onlinestellen des Programms zu helfen, doch ich habe da noch ein paar Fragen.

1. Welche Features soll das Ganze dann online haben? Nur das Berechnen an sich, oder sollen solche Sachen wie Datenbanken und ähnliches auch noch eingebaut werden?

2. In welcher Sprache soll es denn entwickelt werden? Ich kann dir PHP und HTML anbieten. Sollte eigentlich reichen ;)

3. Wo soll das Ganze denn gehostet werden? Hast du einen Webspace der PHP fähig ist, oder müsste man das auch noch irgendwoher bekommen?

Gruß
BlackMark
 
Ich habe mit 1. und 2. inhaltliche Probleme.
Bist Du Dir sicher, Investitionsrechnung als Wissensfach gut zu beherrschen?
Ich kann die Kurven aus Diagramm 1 überhaupt nicht halbwegs genau auswerten.

Die Frage, die ich beantworten wollte ist: Wie lang sollte 1) im Optimalfall sein, um am ende von 3) maximal viel Geld zu haben.
Ich finde, zu unsauber formuliert. Man hat ja nur die Ausgaben verglichen.
Also entweder Barwert, Summe der Ausgaben oder etwas vergleichbares, aber doch kein Geldvermögen/Immovermögen nach Ablauf der Prognosezeit!

Für 2. ist das mitentscheidende Kriterium doch der Kaufpreis / die Prognosezeit. Leider taucht die in der Auswertung aber beides gar nicht textlich auf.
 
@BlackMark
1. Welche Features soll das Ganze dann online haben? Nur das Berechnen an sich, oder sollen solche Sachen wie Datenbanken und ähnliches auch noch eingebaut werden?
Erstmal wäre ich glücklich wenn das ganze 1:1 online identisch rechnet und statt dem mühsamen Weg über GnuPlot direkt in Echtzeit Parameter-abhängig die Graphen geplottet werden.
Eine Datenbank ist hoffentlich unnötig, da die Berechnungen noch überschaubar sind. Wenn man zB Quartalsweise rechnet werden ja bei einer Prognosezeit von 40 Jahren nur 40*4=160 Messpuntke je Linie benötigt. Ka wie schnell php sowas berechnet - in C++ ist es immer unmessbar schnell.
Weitere Features wären halt wie unter TODO oder auch gerne Ideen von anderen Menschen, die sich mit dem Thema auskennen.
Ich würde also primär "unter der Haube" Erweiterungen einbauen wollen aber äußerlich nur wenige zusätzliche Parameter erlauben.
2. In welcher Sprache soll es denn entwickelt werden? Ich kann dir PHP und HTML anbieten. Sollte eigentlich reichen
Ich hab ehrlich gesagt keine Ahnung.. Dass man HTML braucht ist mir klar, aber ob die Berechnungen in php oder javascript oder ähnliches besser aufgehoben sind kann ich überhaupt nicht beurteilen. Ich würde nach einer Lib suchen, die das Graphenzeichnen vereinfacht und diese dann irgendwie versuchen einzubauen.

3. Wo soll das Ganze denn gehostet werden? Hast du einen Webspace der PHP fähig ist, oder müsste man das auch noch irgendwoher bekommen?
Ich hab so ein strato-minimal Paket mit 1er .de Domain und Space. Ob der php fähig ist weiß ich nicht / kann ich mal rauskriegen. Ich hätte jetzt einfach wie vor 10 Jahren in nem Unterordner den kram abgelegt und ne gratis .de.vu Domain (oder so) registriert um darauf zu linken. Macht man das noch so?^^


@ThomasK_7
Ich habe mit 1. und 2. inhaltliche Probleme.
Meinst du Phase1 und Phase2?
In Phase 1 rechne ich naiv mit einer langweiligen Ansparmöglichkeit wie zB Tagesgeld (2,5% pa, monatlich ausgezahlt und somit Zinseszins) die jeder mit anderen Zinssätzen ersetzen darf. Wer meint er schafft irgendwo 5% Rendite kann dies gerne als Parameter wählen. Im Falle von Aktien wäre natürlich auch die 26,375% Steuer auf Gewinne über 801 je Ehepartner anzupassen.

Bist Du Dir sicher, Investitionsrechnung als Wissensfach gut zu beherrschen?
Nein, darum frage ich hier nach Hilfe/Kritik. Ich bin Dipl. Inf., habe ein bisschen Mathe studiert und mal BWL1+VWL1 gehört.. hab also von Investitionsrechnung oder Dingen die man in einer Banklehre lernt 0 Ahnung. Trotzdem traue ich mir zu Wiki-Artikel und Dinge wie Progressive Steuersätze, Kapitalertragsfreibeträge, Kindervergünstigungen etc. in einem Programm umzusetzen.

Ich kann die Kurven aus Diagramm 1 überhaupt nicht halbwegs genau auswerten.
Meinst du damit, dass Zoom fehlt? Das liegt daran, dass ich die Daten natürlich nur abfotografiert hier poste. Ich erstelle jedesmal einen GnuPlot Graph den man beliebig Zoomen und schieben kann. So sieht man auch im Detail wie sich die verschiedenen Möglichkeiten später unterscheiden.

Oder meinst du grundsätzlich nicht lesbar?
Jede Kurve repräsentiert eine Möglichkeit, wann unter den eingegebenen Parametern (siehe Quellcode) eine Immobilie gekauft wurde. Den Zeitpunkt sieht man natürlich daran, dass die Kurve "einbricht" weil angespartes Geld ausgegeben wird.

Also entweder Barwert, Summe der Ausgaben oder etwas vergleichbares, aber doch kein Geldvermögen/Immovermögen nach Ablauf der Prognosezeit!
Ich gehe davon aus, dass die meisten Mensch die über einen Immobilenkauf nachdenken Anfangs 0 bis x Jahre sparen, tilgen und anschließend noch Geld in eine Altersvorsorge ansparen. Für welches x hier am Ende das meiste Geld vorhanden ist interessiert mich.

Für 2. ist das mitentscheidende Kriterium doch der Kaufpreis / die Prognosezeit. Leider taucht die in der Auswertung aber beides gar nicht textlich auf.
Der Kaufpreis ist für alle Graphen konstant (in diesem Fall 400.000 - wie gesagt: fiktive Werte). Allerdings berücksichtigt ich zusätzlich Inflation (hier 1,5%) die den Kaufpreis bei einer Ansparphase >0 Jahre erhöht. Ein Haus was heute 400.000 kostet und ich aber erst in 10 Jahren kaufe um bis dahin zu sparen ist natürlich bis dahin teurer geworden
Einfach nach Zinsenzins:
pow(1.0+(d.inflation / 100), kaufNachJahren) * d.immoPreis;
Die Textausgabe ist nur für die fixen Parameter und gibt das Ergebnis verschiedener Kauf-Zeitpunkte aus.
 
Zuletzt bearbeitet:
Wenn's sehr benutzterfreundlich sein soll, würde ich es in reinem Javascript implementieren. Mit dem canvas Element und einer entsprechenden Bibliothek ala
http://code.google.com/p/flot/
ist interaktives diagrammzeichen mit angemessenem Aufwand realisierbar. Reinzoomen oder Punkte auswählen etc. ist ein echter Mehrwert gegenüber einer auf dem Server gerenderten Variante.
 
Erstmal wäre ich glücklich wenn das ganze 1:1 online identisch rechnet und statt dem mühsamen Weg über GnuPlot direkt in Echtzeit Parameter-abhängig die Graphen geplottet werden.
Das ist machbar und sollte gar nicht mal so schwer sein.
Ka wie schnell php sowas berechnet - in C++ ist es immer unmessbar schnell.
Da PHP auf dem Server läuft und dessen Rechenleistung verwendet kommt das auf die Geschwindigkeit des Servers an, aber wenn ich mir deinen Code so ansehe denke ich nicht, dass es da Probleme geben könnte.
Ich würde nach einer Lib suchen, die das Graphenzeichnen vereinfacht und diese dann irgendwie versuchen einzubauen.
Das geht mit PHP sehr gut, weil es dort viele Bibliotheken gibt die sowas machen. Das Einfachste wären die Google Chart Tools
Ob der php fähig ist weiß ich nicht / kann ich mal rauskriegen. Ich hätte jetzt einfach wie vor 10 Jahren in nem Unterordner den kram abgelegt und ne gratis .de.vu Domain (oder so) registriert um darauf zu linken. Macht man das noch so?
Das solltest du so schnell wie möglich rauskriegen, denn ohne PHP wird das schwer. Javascript ist für solche Berechnungen etwas zu schwach, es würde zwar funktionieren, aber mit PHP ist man viel besser dran. Das mit der Domain funktioniert auch heute noch und wenn dich die .de.vu Domain nicht stört kannst du das auch ruhig so machen.

Also ich würde dir bei deinem Vorhaben gerne helfen, vorallem das mit den Graphen habe ich noch nie gemacht und das würde mich schon interessieren.

Gruß
BlackMark
 
BlackMark schrieb:
Javascript ist für solche Berechnungen etwas zu schwach, es würde zwar funktionieren, aber mit PHP ist man viel besser dran.

Das ist ein Witz oder?
Die Berechnungen packt JavaScript locker, ironischerweise ist Google's V8 JavaScript Engine sogar in einigen Teilen deutlich schneller als PHP.

Nachtrag: Ich entwickle sowohl in PHP als auch JavaScript, nur als Info damit es nicht als Fanboy-Bashing abgestempelt wird ;)
 
Bitte keine Performance-Diskussion.. wird beides schon reichen denke ich. Man könnte auch viel bei den Berechnungen an sich optimieren, da viele Zahlen redundant berechnet werden.
Ich hab das günstigste von http://www.strato.de/hosting/basic-hosting/ also wohl kein PHP wie es aussieht? (Siehe "Profi-Features"). Kann man denn dann Javascript nutzen?
 
Ja kann man, das läuft clientseitig, muss also nur der Browser unterstützen, und das tun die schon lange.

Edit: Hätte auch den Vorteil, dass direkt beim Eintippen die neuen Berechnungen erscheinen würden und man nicht erst die Eingaben absenden muss.
 
Zuletzt bearbeitet:
Ich meinte mit 1. und 2. genau die Punkte die Du unter #1 damit auch bezeichnet hast und nicht 1) und 2) .

In Deiner Rechnung werden Miete und Tilgung angesetzt, beides Geldleistungen an Dritte, zum Ende weist Du dem Interessenten einen Geldbetrag aus, welcher dieser nach Ende der Prognosezeit haben soll. Das geht so nicht!

Deine Rechnungen enthalten noch einen weiteren schwerwiegenden Denkfehler. Da Darlehenszinsen regelmäßig höher sind als Sparzinsen, ist häufig jede Finanzierung nach einer langen Ansparphase in Summe teurer als der sofortige Kauf auf Kredit. Der Kaufinteressent verliert in der Ansparphase die Zinsdifferenz von Guthaben- zu Kreditzins, je länger die Ansparphase, umso mehr in Summe. Nun variiert die Länge der Tilgungsphase je nach Ansparsumme und damit auch die Aufwendungen für diese Phase 2. Je mehr man angespart hat, umso kürzer die Tilgungsphase 2. Die Tilgungsphase hast Du im Bsp. mit 1500 € angesetzt, die Ansparphase mit 1000 € = 1,5 zu 1. Je nach Höhe des einzugebenden Hauskaufpreises und der vom Interessenten einzugebenden Geldbetrages für Spar- und Tilgungsphase wird sich die Dauer der Phase 1 und 2 errechnen und damit erst die Entscheidung fallen, welche Variante günstiger ist. Ich kann mir aber jetzt auf die Schnelle nicht vorstellen, dass Deine oben dargestellten Beispielergebnisse sachlich richtig sind.

Du bräuchtest meines Erachtens folgende Eingabewerte der Interessierten:
Kaufpreis Haus
Zinssatz Ansparphase
Zinssatz Tilgungsphase
monatl. Rate Ansparphase
monatl. Rate Tilgungsphase
(Dauer Prognosezeit) kann entfallen

Mir ist immer noch unklar, wie in aus obigem Graf in 1. für f0 nach 33 Jahren ein Optimum erkennbar sein soll. Gleiches betrifft sinngemäß alle Grafen aus 1.
 
Habs mal auf javascript portiert, mit dem Teil der Konsolenausgabe. Performance: mal so gar kein Problem.
Einfach zip entpacken und index.htm öffnen.
 
Die Berechnungen packt JavaScript locker, ironischerweise ist Google's V8 JavaScript Engine sogar in einigen Teilen deutlich schneller als PHP.
Das kommt immer drauf an wie schnell jetzt der Server auf dem PHP läuft ist und wie schnell der PC des Clients ist, der JavaScript ausführen muss. Meistens ist es aber so, dass der Server mehr Rechenleistung zur Verfügung hat wie ein Client. Ich gehe immer vom "worst case client" aus, also sagen wir mal ein Handy. Dann ist PHP sicherlich schneller als JavaScript. Aber lassen wir das wirklich mit den Performance-Diskussionen, ich wollte mich nur rechtfertigen ;)

Wenn PHP nicht in Frage kommt, dann werde ich leider nicht helfen können, weil ich nicht mit JavaScript entwickle und ich möchte mich auch nicht erst einarbeiten.

Gruß
BlackMark
 
@ThomasK_7
Erstmal danke für deine Hinweise, ich hatte sehr gehofft dass sich auch wer beteiligt, der nicht nur was zum programmier-technischen Aspekt sagen kann.
Du bräuchtest meines Erachtens folgende Eingabewerte der Interessierten:
Kaufpreis Haus
Zinssatz Ansparphase
Zinssatz Tilgungsphase
monatl. Rate Ansparphase
monatl. Rate Tilgungsphase
Deine vorgeschlagenen Parameter (Eingabewerte) sind bereits alle im Rechner drin - und viele mehr. Ich arbeite auch bereits mit unterschiedlichen Zinssätzen. Diese sind beide unabhängig voneinander wählbar. In obigem Beispiel ist der Anspar-Zins 2,5 pa effektiv und der Darlehens-Zins 5.0 pa nominal gewählt.
Ich hab hier mal alle im Rechner verwendeten Daten aus dem Quellcode rauskopiert:
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;

Deine Rechnungen enthalten noch einen weiteren schwerwiegenden Denkfehler. Da Darlehenszinsen regelmäßig höher sind als Sparzinsen, ist häufig jede Finanzierung nach einer langen Ansparphase in Summe teurer als der sofortige Kauf auf Kredit. Der Kaufinteressent verliert in der Ansparphase die Zinsdifferenz von Guthaben- zu Kreditzins, je länger die Ansparphase, umso mehr in Summe.
Teurer? Verliert? Ich hätte jetzt gesagt der Sparer gewinnt - anstatt dass er verliert, wenn er nicht sofort kauft? Es geht doch so weit, dass sich ein Kauf nur bei beinahe 100% Eigenkapital lohnt, weil (unrealistisch) hohe Zinsen dafür sorgen, dass ein Käufer gerade mal die Zinszahlungen schafft und nie tilgt.

Nun variiert die Länge der Tilgungsphase je nach Ansparsumme und damit auch die Aufwendungen für diese Phase 2. Je mehr man angespart hat, umso kürzer die Tilgungsphase 2. Die Tilgungsphase hast Du im Bsp. mit 1500 € angesetzt, die Ansparphase mit 1000 € = 1,5 zu 1.
Ja, das ergibt sich aus den eingegebenen Kosten für Wohngeld, Nebenkosten, Kaltmiete und Monatlich verfügbarem Netto-Einkommen. Wie ich diese Werte zueinander in Verbindung setze steht in dem obigen Zitat zu den verwendeten Daten.
Im Gegensatz zum Mieten hat ein Käufer eben neben seinen Sparrate noch Kaltmiete-Hausgeld zur Verfügung was in der Summe dann für die Tilgung verwendet werden kann.

Je nach Höhe des einzugebenden Hauskaufpreises und der vom Interessenten einzugebenden Geldbetrages für Spar- und Tilgungsphase wird sich die Dauer der Phase 1 und 2 errechnen und damit erst die Entscheidung fallen, welche Variante günstiger ist. Ich kann mir aber jetzt auf die Schnelle nicht vorstellen, dass Deine oben dargestellten Beispielergebnisse sachlich richtig sind.
Die von mir verwendeten Parameter sind so gewählt, dass die Graphen alle Fälle abdecken: Den Ruin, der bei einem sofortigen Kauf eintritt (f0) da so eine Person die Zins-Zahlung nie schafft.
Mein Programm findet dort ein Optimum, weil es die ERSTE der probierten Möglichkeiten ist. Diese stellt gegenüber garkeiner Lösung immer erstmal ein Optimum dar.
Das tatsächliche Optimum was den Namen auch verdient ist genau genommen nur das, was als letztes gefunden wurde. In meinem obigen Beispiel also der Fall: Kauf nach 33 Jahren mit 86% Eigenkapital.
Ich gebe zu, die Formulierung der Textausgabe ist etwas verwirrend...
Einfach gesagt ist 33 am besten, weil eben der Graph f33 am Ende den höchsten y-Wert erreicht.

Mir ist immer noch unklar, wie in aus obigem Graf in 1. für f0 nach 33 Jahren ein Optimum erkennbar sein soll. Gleiches betrifft sinngemäß alle Grafen aus 1.
Ich hoffe das Missverständnis ist geklärt.
f0 ist der Fall, dass nach 0 Jahren sparen gekauft wird und stellt bis dahin unter allen probierten Möglichkeiten die beste dar. (Zu dem Zeitpunkt der Berechnung ist es das einzige und damit auch automatisch beste Szenario. Schon beim probieren von f3 ist f0 nur noch die 2. beste und f3 ist das neue Optimum).
Erst bei einer Ansparphase von 15 Jahren (f15) ist man nach 50 Jahren Schuldenfrei (die brauen Linie durchstößt für x < 50 die Achse)

@BlackMark
Trotzdem danke fürs Angebot :)

@geisterfahrer
Vielen Dank! Das sieht ja schonmal sehr interessant aus - erstaunlich wie ähnlich der Code bleiben konnte :) Sieht garnicht so schlimm aus wie ich dachte ;)
Wie krieg ich jetzt noch nen Graphen auf die Website? Von mir aus mit dem von dir vorgeschlagenen Graphen-Toolkit. Client-Seitig berechnet wäre mir auch am liebsten.
Und Textfelder? Eins reicht als Beispiel wie ich die Daten aus dem Textfeld in die JS Berechnungen einbeziehe - die restlichen kann ich ja dann machen.
 
Zuletzt bearbeitet:
Ich hab da mal was schnell zusammengeswurschtelt:

Ich hab den Quellcode aus folgendem Beispiel 'geklaut':
http://people.iola.dk/olau/flot/examples/interacting.html

Bis auf zwei/drei Stellen um die Daten für den Plot zusammenstellen, ist der Quellcode noch einigermaßen gleichgeblieben.
Außerdem hab ich zwei Beispieleingabefelder hinzugefügt um Kaltmiete/Immobilienpreis einzugeben. Lässt sich jedenfalls alles hübscher machen, sowohl vom Quellcode/Bedienung. Naja, will ja niemanden arbeitslos machen... zudem habe ich selber damit noch nie was gemacht.
 
TE schrieb:
Teurer? Verliert? Ich hätte jetzt gesagt der Sparer gewinnt - anstatt dass er verliert, wenn er nicht sofort kauft?
Das trifft nur für die Fälle zu, in denen der Geldbetrag der Kaltmiete (650€) geringer ist als der Geldbetrag der Zinsdifferenz von Darlehens- zu Sparzins (2,5%).
Der genau hierzu passende sofortige/zukünftige Kaufpreiswert ist schwierig zu ermitteln wegen der Steuerproblematik und den unterschiedlichen Finanzierungslaufzeiten. Ist der sofortige Kaufpreis niedriger als ? ? €, so kann der Interessent den Zinsdifferenzbetrag von Darlehens- zu Sparzins aus der ersparten Kaltmiete begleichen – ein sofortiger Kauf wäre dann günstiger.
Bei zu finanzierenden 400.000 € sofortigem Kaufpreis würde der Interessent aber gar keine herkömmliche Hypothekenfinanzierung bekommen, da 5% + 1% Tilgung = 6% = 2.000 € Monatsrate bedeuten, aber nur 1650 € maximale Rate zur Verfügung stehen (650 € Kaltmiete+ 1000 € Sparrate) und damit nur max. 330.000 € sofortiger Kaufpreis mit rd. 37 Jahren Kreditlaufzeit finanzierbar wären. Für solche Fälle ist es interessant, dem Interessenten ein Sparziel zu geben, welches Du mit Deiner Seite darstellen möchtest.
Du solltest aber die Inflationserwartung beiderseitig einpreisen, bei den Einnahmen (Lohn), wie auch den Ausgaben (Hauskaufpreis). Dabei kann/sollte für beide Seiten ein unterschiedlicher Eingabewert möglich sein.
Ich bezweifle weiterhin stark, ob in Deinem Beispiel die Dauer von 33 Jahren Ansparphase die objektiv richtige Lösung ist. Da sich mir aus den bisher preisgegebenen Daten aber nicht Deine Detailrechnungen erschließen, kann ich nicht weiter konkret werden.
Bin heute ganztägig am Stausee und damit afk. :D
 
Wenn du noch Webspace brauchst schreib mich mal an, ich hab noch jede Menge freien Platz.
Mitarbeiten würde ich eventuell auch, habe aber nicht soo viel Zeit da bald Prüfungsphase.
 
Finde das Projekt eine super Idee und es echt super wenn man den Immobilienkauf damit vernünftig ausrechnen kann.

lg
 
@geisterfahrer
Das ist ja cool, genau sowas hatte ich mir hier erhofft durch meinen Thread. Dankeschön! Ich werde sobald wie möglich (ziehe gerad um...) die restlichen Parameter ins html einbauen und alles Hochladen. Dann kann auch jeder mal mit realistischeren Zahlen rumprobieren.

@Backslash
Danke fürs Angebot! Eigtl sollte bei meinem Strato-Paket noch 99% frei sein.. aber ka ob das dort alles so einfach funktioniert, wie ich mir das denke ;) Ich komm drauf zurück falls nötig.

@ThomasK_7
Der genau hierzu passende sofortige/zukünftige Kaufpreiswert ist schwierig zu ermitteln wegen der Steuerproblematik und den unterschiedlichen Finanzierungslaufzeiten.
Wieviel Haus man sich leisten kann, soll mein Programm nicht beantworten. Hierfür gibt es glaube ich schon einige gute Rechner, wie zB http://www.zinsen-berechnen.de/hypothekenrechner.php
Ich wollte eher wissen: Wenn man sich für einen Hauspreis entschieden hat: Nach wieviel Ansarzeit sollte man optimal mit der Tilgung beginnen.

Ist der sofortige Kaufpreis niedriger als ? ? €, so kann der Interessent den Zinsdifferenzbetrag von Darlehens- zu Sparzins aus der ersparten Kaltmiete begleichen – ein sofortiger Kauf wäre dann günstiger.
Bei zu finanzierenden 400.000 € sofortigem Kaufpreis würde der Interessent aber gar keine herkömmliche Hypothekenfinanzierung bekommen, da 5% + 1% Tilgung = 6% = 2.000 € Monatsrate bedeuten, aber nur 1650 € maximale Rate zur Verfügung stehen (650 € Kaltmiete+ 1000 € Sparrate) und damit nur max. 330.000 € sofortiger Kaufpreis mit rd. 37 Jahren Kreditlaufzeit finanzierbar wären.
Jo.. ich gehe genau genommen nicht von Tilgungsrate = Sparrate + Kaltmiete aus sondern habe noch zusätzlich sogenanntes "Hausgeld" als Parameter zugelassen: Sobald man Immo-Besitzer ist fallen ja angeblich zusätzliche Kosten für Instandhaltung / Sanierung oder auch Gehweg-Verschönerung / Regenrinnen etc an wo man dann zwangs-Beteiligt wird. Wer möchte kann den Betrag natürlich auf 0 setzen.
In obigem Beispiel ergibt sich daher für die Tilgungsrate 1500 aus 1000(Sparen) + 650(Kaltmiete) - 150(Hausgeld).
Einen ganz wichtigen Punkt sprichst du natürlich an: Wer schon viel Eigenkapital hat bekommt idR auch bessere Darlehenszinsen - aber wie soll ich das einbauen? Ich fand es besser dem Benutzer des Programms die Entscheidung zu lassen seinen von der Bank angebotenen Darlehens-Zins einzugeben. Dass der für den Fall von 0% Eigenkapital sicher nicht beibehalten wird ist dann Problem des Benutzers.. Ich kann den tatsächlichen Wert ja nicht bestimmen. Für sowas haben Banken sicher hoch-komplizierte Kunden-Ratings in die so ziemlich ALLES einfließt.
Was du mit 5% + 1% ansprichst ist einer meiner TODO Punkte. Ich möchte im ersten Tilgungs-Monat bestimmen, wieviel % des Geldes für Zinsen und wieviel schon für Tilgung aufgewendet wird.
Kommt, sobald ich Zeit habe..
Du solltest aber die Inflationserwartung beiderseitig einpreisen, bei den Einnahmen (Lohn), wie auch den Ausgaben (Hauskaufpreis). Dabei kann/sollte für beide Seiten ein unterschiedlicher Eingabewert möglich sein.
ist auch eins der TODOs. Inflation beeinflusst bisher NUR den Immo-Preis. Es fehlt natürlich Nebenkosten - inflationsbereinigte Mietpreis-Erhöhung, inflationsbedingt steigende Lebenskosten und natürlich Gehaltserhöhungen.. werde ich alles noch einbauen - ist nicht schwer.
Ich bezweifle weiterhin stark, ob in Deinem Beispiel die Dauer von 33 Jahren Ansparphase die objektiv richtige Lösung ist. Da sich mir aus den bisher preisgegebenen Daten aber nicht Deine Detailrechnungen erschließen, kann ich nicht weiter konkret werden.
Ich verstehe deine Skepsis, da 33 Jahre Sparen und 86% Eigenkapital natürlich verrückte Werte sind. Dies liegt aber daran, dass ich absichtlich zur Veranschauung des Programms Parameter so gewählt habe, wie sicher niemand lebt. Welche Familie kauft schon ein 400.000 Haus wenn die nächsten 50 Jahre das Familien-Monats-Netto-Einkommen "nur" genau 2700 beträgt. Ich stells bald online und dann kannst du gern mit realistischeren Parametern rumprobieren.
Ich bin schon am überlegen, ob ich die Graphen-Linien an der Stelle abbreche, wo sie die x-Achse durchstoßen. Dann beantwortet der Rechner nur noch die Frage: "Mit wie lange sparen, habe ich eine Immo am schnellsten abbezahlt."
Ich persönlich finde aber auch die Phase danach interessant: Das mietfreie weiter sparen.
Es kann sich nämlich je nach Parametern auch ergeben, dass ein Leben lang mieten am besten ist. (Wenn zB die Miete unrealistisch niedrig und der Darlehenszins wie auch Kaufpreis extrem hoch sind.)
Die genauen Berechnungen stehen natürlich im Quelltext .. wenn ich noch mehr Faktoren wie Inflation oder so berücksichtige kann ichs ja auch mal in nicht-C++ bzw. nicht-Javascript hinschreiben.
 
Zuletzt bearbeitet:
Zurück
Oben