Ich will mein Depot selbst auswerten, statt mich auf die Zahlen meines Brokers zu verlassen. Bau mir dafür eine Seite, die einen Transaktions-Export einliest und daraus Bestände, Einstand, realisierte Gewinne und die echte Rendite rechnet. Alles läuft bei mir auf dem Rechner, nichts wird hochgeladen. Frag mich zuerst aus — einzeln, nicht als Liste: 1. Welchen Broker oder welche App ich benutze, und ob ich einen Export der einzelnen Buchungen bekomme oder nur eine Liste der aktuellen Positionen. 2. Lass dir die ersten Zeilen des Exports zeigen und benenne die Spalten, die du gefunden hast. Rate sie nicht. 3. Seit wann ich investiere und ob Positionen dabei sind, die ich schon wieder verkauft habe. 4. Was ich sehen will: nur die Zahlen, oder auch Verläufe und Verteilungen. 5. Ob ich Kurse aus dem Netz nachladen will oder mit den Kursen aus dem Export arbeite. Verlang die Buchungen, nicht die Positionsliste. Eine Positionsliste ist eine Momentaufnahme: Bei geschlossenen Positionen stehen Kaufpreis und Erlös dort meist auf null, und daraus lässt sich keine Rendite rechnen. Die Buchungen enthalten jeden Vorgang. Gibt es partout nur Positionen, sag mir deutlich, welche Auswertungen dadurch unmöglich werden. Bau in zwei Stufen, und zwar in dieser Reihenfolge: erst den Rechenteil, dann die Anzeige. Zeig mir den Rechenteil und lass ihn mich prüfen, bevor du eine einzige Grafik baust. Zahlen, die falsch sind, sehen in einem schönen Diagramm genauso überzeugend aus wie richtige. TEIL 1 — DER RECHENTEIL Diese Punkte sind nicht verhandelbar. Jeder davon ist ein Fehler, den man sonst macht: Sortier die Buchungen nach Datum, bevor du irgendetwas rechnest. Exporte kommen oft in umgekehrter oder gemischter Reihenfolge, und jede Abrechnung nach Reihenfolge hängt daran. Splits sind kein Bestandszuwachs. In vielen Exporten steht eine Split-Zeile mit einer Anzahl, die das Verhältnis meint und nicht die Stückzahl. Buchst du sie als Zugang, hast du plötzlich Papiere, die es nie gab. Der Test dafür: Wenn eine Split-Zeile auf einer Position steht, die längst verkauft war, kann es kein Zugang sein. Frag mich, wie Splits in meinem Export aussehen, und behandle sie ausdrücklich. Rechne mit Beträgen, nicht mit Vorzeichen aus dem Export. Manche Broker schreiben Käufe mit negativem Preis, andere mit negativer Anzahl, wieder andere nur im Betrag. Nimm für Stückzahl und Preis den Betrag ohne Vorzeichen und leite die Richtung aus der Art der Buchung ab. Das Vorzeichen des Geldbetrags behältst du — daran hängt die Renditerechnung. Runde winzige Restbestände weg. Sparpläne mit Bruchstücken hinterlassen in verkauften Positionen Reste von tausendstel Stück. Ohne Schwelle erscheinen sie als Geisterpositionen im Depot. Alles unter einem millionstel Stück gilt als null. Realisierte Gewinne nach FIFO. Führ je Papier eine Liste der Kauf-Tranchen mit Stückzahl und Preis. Bei einem Verkauf bediene die älteste zuerst. Was übrig bleibt, ergibt gleichzeitig den gewichteten Einstand der offenen Position — rechne ihn nicht getrennt, sonst laufen die beiden Zahlen auseinander. Die Rendite geldgewichtet, über den internen Zinsfuß. Nimm alle Geldbewegungen mit ihrem Datum, häng den heutigen Depotwert als letzte Zahlung an und such die Verzinsung, bei der die Summe null ergibt. Such sie durch Intervallhalbierung, nicht über das Newton-Verfahren: Bei unregelmäßigen Zahlungsströmen konvergiert Newton unzuverlässig. Prüf vorher, ob überhaupt ein Vorzeichenwechsel vorliegt, und gib sonst ehrlich nichts zurück statt einer erfundenen Zahl. Sag mir dazu, warum diese Rendite von der einfachen Prozentrechnung abweicht. Sie ist die einzige, die geschlossene Positionen und den Zeitpunkt der Einzahlungen berücksichtigt — und genau deshalb sieht sie oft schlechter aus als die Zahl in der Broker-App. Trau den Feldern des Exports nicht blind. Region, Branche und Anlageklasse sind erfahrungsgemäß unbrauchbar gepflegt. Wenn ich nach Themen gruppieren will, bau eine eigene Zuordnungstabelle, in der ich jedem Papier von Hand ein Thema gebe. Fehlt ein Papier darin, zeig eine sichtbare Warnung, statt es stillschweigend zu unterschlagen. Vergleich die Kurse. Weicht der Kurs aus dem Export um mehr als 15 Prozent vom aktuellen Börsenkurs ab, markier die Zeile. Exportkurse sind nachweislich manchmal grob falsch. TEIL 2 — DIE PROBE Bevor du weiterbaust: Rekonstruier aus den Buchungen die heutigen Bestände und stell sie meiner Positionsliste gegenüber. Sag mir, wie viele von wie vielen exakt übereinstimmen, und geh jeder Abweichung einzeln nach. Erst wenn ich das gesehen habe, ist der Rechenteil fertig. TEIL 3 — DIE ANZEIGE Halt sie schlicht. Kennzahlen oben, darunter Tabelle und Verläufe. Wenn du eine Wertkurve zeichnest und keine historischen Kurse hast, sag das dazu. Zwischen zwei Transaktionspreisen zu interpolieren ergibt einen richtigen Verlauf, aber falsche Zwischenstände — schreib es an die Grafik, statt es zu verschweigen. Verankere den letzten Punkt am aktuellen Depotwert, damit das Ende stimmt. Lizenz CC BY 4.0 · Vincent Weber · vwincenzo.com Wenn ich zwei Strategien vergleiche, nenn mir zuerst die Streuung und dann den Unterschied. Bei üblichen Monatsschwankungen braucht es einen sehr großen Vorsprung, damit ein Ergebnis nach einem Jahr überhaupt belastbar ist. Ein Zwischenstand von ein paar Prozentpunkten sieht nach Ergebnis aus und ist keines. Sag das ausdrücklich, statt einen Sieger auszurufen. TEIL 4 — WIE ES LÄUFT Alles bleibt auf meinem Rechner. Die Datei mit meinen Buchungen wird nirgends hochgeladen. Wenn Kurse nachgeladen werden, gehen ausschließlich Börsenkürzel nach draußen, niemals Bestände oder Beträge. Braucht die Lösung einen kleinen lokalen Server, dann nur auf dem eigenen Rechner erreichbar, nicht im Netzwerk. Nimm einen festen Port, keinen zufälligen: Der Browser hängt seinen Speicher an die Adresse samt Portnummer, ein wechselnder Port bedeutet bei jedem Start einen leeren Zustand. TEIL 5 — ZUM DOPPELKLICKEN Ein Befehl im Terminal ist eine Hürde, und eine Auswertung, die ich monatlich aufrufe, darf keine haben. Bau mir einen Starter zum Anklicken, für Mac und für Windows. Auf dem Mac ist eine App nur ein Ordner mit fester Struktur. Kein Xcode, keine Übersetzung, keine Signatur: Name.app/Contents/Info.plist Name.app/Contents/MacOS/start ← ein Shell-Skript Name.app/Contents/Resources/icon.icns Drei Dinge gehen dabei schief, sag sie mir dazu: Der Finder vererbt den PATH der Kommandozeile nicht. Ein blosses "python3" im Skript greift ins Leere, obwohl derselbe Befehl im Terminal funktioniert — das ist der Fehler, bei dem man am längsten sucht, weil er sich nur beim Doppelklick zeigt. Geh stattdessen eine Liste fester Pfade durch und nimm den ersten, der existiert. Das Skript muss im Vordergrund laufen. Schickst du den Server in den Hintergrund und lässt das Skript enden, verschwindet das Symbol sofort aus dem Dock und die App gilt als beendet. Das Skript braucht das Ausführungsrecht, sonst weigert sich der Finder. Nenn mir den Befehl dafür. Findet das Skript kein Python, zeig einen echten Hinweis in einem Fenster statt still zu scheitern. Ein Doppelklick, bei dem nichts passiert, ist der schlechteste Fehler von allen — man weiß nicht einmal, ob man richtig geklickt hat. Unter Windows genügt eine Startdatei neben den anderen Dateien: erst ins eigene Verzeichnis wechseln, dann den Windows-Starter "py" bevorzugen und auf "python" zurückfallen. Fehlt beides, eine verständliche Meldung und eine Pause, damit das Fenster nicht sofort zuklappt. Eine solche Startdatei kann kein eigenes Symbol tragen — erklär mir, wie ich über eine Verknüpfung eines vergebe. Gib mir das Ganze als EINEN Block zum Einfügen, nicht als drei Dateien zum Abtippen: ein Befehl, der die Ordner anlegt, die Dateien schreibt und das Ausführungsrecht setzt. Drei Dateien in zwei Unterordner zu legen ist die Stelle, an der die meisten aufgeben — nicht das Skript selbst. Achte dabei auf die Anführungszeichen um die Ende-Markierung der Textblöcke. Ohne sie ersetzt die Shell beim Schreiben alles, was nach einer Variablen aussieht, durch ihren gerade gültigen Wert. Herauskommt ein Starter, in dem statt der Pfadberechnung schon ein fester Pfad steht — er funktioniert dann nur auf diesem einen Rechner und nur in diesem Moment, und man sieht dem Ergebnis nicht an, warum. Frag mich nach einem Bild für das Symbol. Ohne eines startet die App mit dem leeren Standardsymbol, und das sieht aus wie etwas Halbfertiges. - Sag mir, was du brauchst: ein quadratisches Bild, mindestens 512 Pixel. - Auf dem Mac rechnest du daraus die Größen, die ein Symbolordner verlangt, und wandelst ihn in die Symboldatei um. Beide Werkzeuge dafür liegen auf jedem Mac, es muss nichts installiert werden. - Trag den Namen in die Info.plist ein — ohne Dateiendung, das ist dort so üblich. - Sag mir, was ich tue, wenn das alte Symbol hängen bleibt. macOS merkt sich Symbole und zeigt eine Änderung nicht immer sofort. - Für Windows brauche ich dasselbe Bild als Symboldatei, und dazu den Weg, wie ich sie einer Verknüpfung zuweise. Habe ich kein Bild, frag nicht weiter nach: Erzeug ein schlichtes selbst — ein Buchstabe oder ein Zeichen auf einfarbigem Grund. Lieber ein einfaches Symbol als gar keines. Sag mir zum Schluss, warum dieser Starter nur funktioniert, weil er bei mir auf dem Rechner entsteht: Eine unsignierte App aus dem Netz bekommt vom Browser eine Quarantäne-Markierung und wird blockiert. Dieselbe App, hier erzeugt, trägt die Markierung nicht und startet sofort. Weitergeben lässt sie sich deshalb nicht — wer sie auch will, nimmt diesen Prompt. Wenn du fertig bist, gib mir: ## Der Rechenteil ## Die Probe gegen meine Positionsliste ## Die Anzeige ## Der Starter zum Doppelklicken ## Was die Zahlen NICHT können Der letzte Abschnitt ist Pflicht. Schreib hinein, welche Kennzahl auf einer Schätzung beruht, wo interpoliert wird, und was ich nicht aus diesen Zahlen ableiten sollte. Zum Schluss: Sag mir in drei Sätzen, welche Eigenheit meines Exports dir am ehesten noch Ärger machen wird.