Tool zur steuerlich korrekten Gewinnberechnung in DE mit Portfolio Performance-Exporten
Hauptentwickler: Nico Spohrer
Du hast dein Wertpapier-Depot in Portfolio Performance gepflegt und möchtest
- eine bestimmte Menge an steuerpflichtigen Kapitalerträgen realisieren, bspw. zur Nutzung des Sparer-Pauschbetrags oder Grundfreibetrags im Rahmen der Günstigerprüfung
- die nach FIFO zuerst zu verkaufenden Chargen pro Wertpapier und Depot identifizieren
- den effektiven steuerlichen Anschaffungspreis pro Charge herausfinden
- die genaue steuerliche Auswirkung von Vorabpauschalen beim Verkauf von Fonds wie ETFs berechnen
- die Teilfreistellung von Aktien- und Mischfonds beim Verkauf berücksichtigen
- eine Entnahme aus einem von mehreren Depots vornehmen und dabei möglichst wenig steuerpflichtige Erträge realisieren, um die Kapitalertragsteuer (+ Soli + ggf. Kirchensteuer) zu minimieren
- Teildepotüberträge zur FIFO-Optimierung durchführen
pyfifovap ist ein Werkzeug zur Planung, nicht zur Erstellung von Steuererklärungen oder Performance-Berechnung im Nachgang. Es erzeugt eine XLSX-Datei, die mit LibreOffice Calc/Excel/Google Sheets geöffnet werden und für weitere Berechnungen genutzt werden kann.
Die Berechnung des steuerpflichtigen Gewinns folgt den üblichen Regeln von Kapitalerträgen und kann Vorabpauschalen ( ggf.) und Teilfreistellungen (ggf.) für alle noch unverkauften Anteile berücksichtigen. Für die Berechnung der darauf fälligen Steuer wird angenommen, dass auf den Gewinn Kapitalertragsteuer + Soli + Kirchensteuer (ggf.) gezahlt werden muss. Falls im persönlichen Fall bspw. ein ausreichend großer Verlusttopf oder freier Sparer-Pauschbetrag vorhanden ist, wäre die zu zahlende Steuer jedoch möglicherweise null. Ähnlich verhält es sich bei der Nutzung des Grundfreibetrags im Rahmen der Günstigerprüfung. Für solche Anwendungsfälle muss also logischerweise der KESt-pflichtige Gewinn betrachtet werden.
pyfifovap erzeugt eine große XLSX-Datei mit Übersichten und einem Tab je Wertpapier und je Depot (Beispiel-XLSX). Dort sind alle Chargen berücksichtigt, die noch nicht (vollständig) verkauft oder zu anderen Depots übertragen wurden.
Übersichts-Tab
Im Folgenden ein Beispiel für ETF-Anteile, für die schon in mehreren Jahren eine Vorabpauschale angefallen ist und für die eine Teilfreistellung von 30% gilt:
Alle Chargen eines Wertpapiers bei einem Broker
Beim alleinigen Verkauf der ersten Charge sollten in diesem Beispiel ca. 18,65 EUR an Steuern abgezogen werden (erste Zeile, letzte Spalten). In der letzten Zeile rechts sieht man, dass für diese Charge ein negativer Kapitalertrag bestimmt wurde, der zu einer kleinen Steuererstattung führen sollte, weil in den vorherigen Chargen bereits Gewinne aufgelaufen sind.
Mit --gewinne-vorhanden kann auch die Annahme getroffen werden, dass praktisch "unendlich" Gewinne des entsprechenden
Typs im Kalenderjahr vorhanden sind, die mit Verlusten verrechnet werden könnten.
Jeglicher Verkauf von Verlust-Chargen wird dann zu einer Steuererstattung (Steuer < 0) führen, unabhängig davon, ob nach
FIFO ältere Chargen mit Gewinnen vorhanden sind.
- Alle relevanten Buchungen sind in Portfolio Performance eingepflegt
- Die Basiswährung in Portfolio Performance ist EUR (Wertpapiere notiert in Fremdwährungen werden jedoch prinzipiell auch unterstützt)
- Es geht um KESt-pflichtige Wertpapiere wie Fonds/ETFs oder Aktien mit hinterlegter ISIN
- Dir ist klar, dass dieses Werkzeug Fehler beinhalten kann und keine Steuerberatung darstellt
- Du bist steuerpflichtig in Deutschland :)
- Du kannst ein Python-Skript starten
Grundlegend:
- Portfolio Performance öffnen
- Unter "Alle Buchungen" -> "Daten exportieren" (ganz rechts) einen CSV-Export der Buchungen erstellen
- Unter "Alle Wertpapiere" -> "Daten exportieren" (ganz rechts) einen CSV-Export der Wertpapiere erstellen.
- Aus diesem Export wird die Zuordnung der Wertpapiere über die ISIN aufgebaut und der aktuelle Kurs für die Gewinnberechnung gelesen
- pyfifovap herunterladen und ggf. benötigte Bibliotheken installieren (z. B.
pip3 install -r requirements.txt) - pyfifovap ausführen und eine große XLSX-Datei als Ergebnis erhalten:
$ ./main.py --buchungen Alle_Buchungen.csv --wertpapiere "Wertpapiere_(Standard).csv"
Generiere Ergebnis-XLSX-Datei Ergebnisse.xlsx...- Der erste Versuch ist fertig! Hier sind ggf. jedoch Teilfreistellung und Vorabpauschalen noch nicht berücksichtigt. Dies kann konfiguriert werden.
- Die Hilfeseite
--helpbetrachten schadet auch nicht!
Alternativ können Beispiel-Daten genutzt werden:
$ ./main.py -b Beispiele/Alle_Buchungen.csv -w "Beispiele/Wertpapiere_(Standard).csv"pyfifovap ordnet Buchungen, Wertpapiere, Teilfreistellung und Vorabpauschalen über die ISIN zu (nicht über den Namen). Das ist robust gegenüber abweichenden oder geänderten Wertpapier-Namen - z. B. wenn dasselbe Wertpapier bei verschiedenen Brokern unterschiedlich benannt ist.
- Der Wertpapier-Export (
-w/--wertpapiere) ist erforderlich und ist die zentrale Quelle für die ISINs (und liefert die aktuellen Kurse). Die ISIN je Buchung wird per eindeutigem Namensabgleich aus dieser Datei ermittelt. - Enthält der Buchungs-Export selbst eine ISIN-Spalte, wird diese nur zur Kontrolle mit der Wertpapier-Datei abgeglichen; bei einem Widerspruch bricht das Programm ab.
- Wertpapiere, für die keine ISIN in der Wertpapier-Datei gefunden wird (z. B. Kryptowährungen ohne ISIN), werden mit einer Warnung ignoriert.
- Auch in
etf_metadaten.csvundetf_vorabpauschalen.csverfolgt die Zuordnung über die ISIN; Einträge ohne ISIN werden ignoriert. Der dort angegebene Name dient nur der Anzeige.
Zur korrekten Berechnung bereits versteuerter Vorabpauschalen muss pyfifovap pro Wertpapier und Jahr (jedoch nicht pro Charge!) die Information erhalten, welche VAP angefallen ist. Dies wird beispielsweise auf folgende Weise konfiguriert:
ISIN,Name,Jahr des Wertzuwachses,Vorabpauschale vor TFS pro Anteil
IE00BK5BQT80,Vanguard FTSE All-World Acc ETF,2023,1.637814250
IE00BK5BQT80,Vanguard FTSE All-World Acc ETF,2024,1.718172340
IE00BK5BQT80,Vanguard FTSE All-World Acc ETF,2025,2.382607760
IE00B3RBWM25,Vanguard FTSE All-World Dist ETF,2023,0.0
IE00B3RBWM25,Vanguard FTSE All-World Dist ETF,2024,0.0
IE00B3RBWM25,Vanguard FTSE All-World Dist ETF,2025,0.353446870Die hier je Jahr gelistete VAP darf noch nicht durch eine ggf. vorhandene Teilfreistellung (TFS) reduziert sein. Falls genug Ausschüttungen in einem Kalenderjahr vorhanden waren, ist die VAP ggf. 0 (wie in zwei von drei Jahren des genannten Dist-ETFs) oder klein (wie in der letzten Zeile). Sollte für ein Jahr kein Eintrag existieren, gilt die implizite Annahme, dass hierfür keine VAP anfällt.
Gute Broker sollten eine klare Abrechnung bereitstellen, wie viel Vorabpauschale angefallen ist. Im Folgenden ein Beispiel der DKB für das Jahr 2024 (VAP 2024, gilt als zugeflossen Anfang Januar 2025):
Es muss darauf geachtet werden, dass die VAP ohne Teilfreistellung (d.h. der höhere Betrag) und pro Anteil übertragen wird. Beides ist im markierten Feld gegeben ohne weitere Berechnungen.
Die VAP kann natürlich auch selbst manuell berechnet werden, jedoch ist hierbei insbesondere auf eine gute Quelle für den Anteilspreis am Jahresanfang zu achten.
Es wird bereits eine Datei mit einigen VAP-Werten zur Verfügung gestellt. Bei Updates ist wichtig, dass
- die ISINs der Wertpapiere korrekt sind (die Zuordnung erfolgt über die ISIN; der Name dient nur der Anzeige)
- die englische Schreibweise von Dezimalzahlen (
1.71817) mit Punkt statt Komma als Dezimaltrenner verwendet wird
Bei Fondsanteilen, für die eine Teilfreistellung
gilt, muss einmalig eine Zeile in der Datei etf_metadaten.csv hinzugefügt werden:
ISIN,Name,Prozent Teilfreistellung
IE00BK5BQT80,Vanguard FTSE All-World Acc ETF,30
IE00B3RBWM25,Vanguard FTSE All-World Dist ETF,30
FR0010755611,Amundi Lev 2x MSCI USA Daily Acc ETF,30
FR0014010HV4,Amundi Lev 2x MSCI World Daily Acc ETF,30
IE000716YHJ7,Invesco FTSE All-World Acc ETF,30Für Wertpapiere in Fremdwährungen außer USD und GBP ist aktuell noch keine Forex-Kurs-Abfrage implementiert, dies ist
jedoch durch eine triviale Code-Änderung (1 Zeile) möglich (ForexHelper-Klasse).
Der einzige mögliche Kontakt ins Internet bei Nutzung von pyfifovap ist dieser optionale Abruf von Fremdwährungskursen.
Falls auch dies vermieden werden soll, kann die Option --offline genutzt werden.
Selbstverständlich wird in keinem Fall eine Information über das Depot ins Internet übertragen (außer, dass ein
Fremdwährungskurs abgefragt wird).
- Dieses Werkzeug kann Fehler enthalten und ist noch jung. Es ist keine Steuerberatung.
- Die Nutzung ergibt nur für Wertpapiere Sinn, die der Kapitalertragsteuer unterliegen - also bspw. nicht bei Kryptowährungen, Immobilien usw.
- Die VAP pro Wertpapier und Jahr und die Teilfreistellung von Fonds müssen als Eingangswert geliefert werden (s.o.). Pro Wertpapier mit VAP ist ggf. jedes Jahr ein weiterer VAP-Wert hinzuzufügen.
- Es ist möglich, dass noch nicht alle relevanten Transaktionstypen aus Portfolio Performance unterstützt werden.
Aktuell werden berücksichtigt:
Kauf,Verkauf,Umbuchung (Ausgang)(Nutzung der Details der ursprünglich gekauften Charge - entspricht Depotübertrag),Einlieferung(Nutzung der Werte bei der Einlieferung),Auslieferung(Entnahme der Anteile aus dem Depot nach FIFO, wie ein Verkauf ohne Erlös)
Falls du Fehler entdeckst, melde diese gerne über Github (als Issue).
Bitte beschreibe das Problem möglichst genau und nutze -vv als Kommandozeilenparameter für mehr Debug-Output. Auch
wäre
es sinnvoll, die Input-CSV-Dateien mitzuschicken (ggf. aus Privatsphäregründen gekürzt, damit nur noch das Problem
reproduziert werden kann), ggf. via Mail.




