Jump to content
boolvector8

pyfifovap: Tool zur Steuerberechnung mit Portfolio Performance-Exporten (inkl. FIFO, TFS, VAP)

Recommended Posts

boolvector8
Posted · Edited by boolvector8
Typo

Hallo zusammen,

 

hiermit möchte ich kurz ein Software-Werkzeug vorstellen, das zur Steuerplanung eingesetzt werden kann: pyfifovap. Es berechnet auf Basis von Portfolio Performance-Exporten den steuerpflichtigen Gewinn von Wertpapieren nach dem FIFO-Prinzip - inklusive Teilfreistellung (TFS) und bereits angefallener Vorabpauschalen (VAP) im Fall von Fonds wie ETFs.

 

Konkret kann es helfen bei Fragen wie bspw.

  • Welche Chargen werden bei einem Verkauf nach FIFO zuerst herangezogen, und welcher steuerliche Anschaffungspreis gilt dafür (inkl. bereits versteuerter VAP)?
  • Wie viel steuerpflichtigen Kapitalertrag realisiere ich, wenn ich aus einem von mehreren Depots eine bestimmte Menge entnehme - z. B. zur Ausnutzung des Sparer-Pauschbetrags oder Grundfreibetrags?
  • Welche Steuer (KESt + Soli + ggf. Kirchensteuer) fiele dafür konkret an?

 

Als Ergebnis entsteht eine XLSX-Datei mit einer Übersicht sowie einem Detail-Tab für jedes Wertpapier in jedem Depot (Screenshot siehe Github).

 

Weiteres:

  • Es ist ein Planungswerkzeug, kein Ersatz für Steuerberatung und nicht für die Steuererklärung gedacht.
  • Das Programm ist noch jung und kann Fehler enthalten.
  • VAP und TFS müssen pro Wertpapier als vereinfachte Eingangswerte gepflegt werden
    • Beispiel: IE00BK5BQT80 (Vanguard FTSE All-World Acc ETF) hat 30% Teilfreistellung und im Jahr 2023 1,637814250 EUR Vorabpauschale vor TFS je Anteil gehabt
  • Es deckt nur KESt-pflichtige Wertpapiere ab (keine Kryptowährungen etc.)
  • Voraussetzung sind sauber gepflegte Buchungen in PP mit Basiswährung EUR
    • Wertpapiere notiert in Fremdwährungen werden derzeit für USD und GBP unterstützt, weitere Währungen wären aber trivial hinzuzufügen.
  • Man muss ein Python-Skript starten können.

 

Der Code ist offen einsehbar, es wird kein kommerzielles Interesse verfolgt: https://github.com/nspo/pyfifovap 

 

Über Rückmeldungen, konstruktive Kritik und Fehlerberichte freue ich mich.

Viele Grüße

Share this post


Link to post
SlowHand7
Posted

Was ist da nun der Benefit gegenüber PP?

Share this post


Link to post
Bast
Posted
vor 7 Stunden von SlowHand7:

Was ist da nun der Benefit gegenüber PP?

Berechnung der folgenden Fragen, insbesondere der ersten Frage:

vor 7 Stunden von boolvector8:
  • Welche Chargen werden bei einem Verkauf nach FIFO zuerst herangezogen, und welcher steuerliche Anschaffungspreis gilt dafür (inkl. bereits versteuerter VAP)?
  • Wie viel steuerpflichtigen Kapitalertrag realisiere ich, wenn ich aus einem von mehreren Depots eine bestimmte Menge entnehme - z. B. zur Ausnutzung des Sparer-Pauschbetrags oder Grundfreibetrags?
  • Welche Steuer (KESt + Soli + ggf. Kirchensteuer) fiele dafür konkret an?

Oder kannst Du das in PP?

 

@boolvector8: Eine Noob-Frage: Ist das für Linux oder läuft das auch auf MacOS?

Share this post


Link to post
boolvector8
Posted
5 hours ago, Bast said:

 

@boolvector8: Eine Noob-Frage: Ist das für Linux oder läuft das auch auf MacOS?

Das ist prinzipiell unabhängig vom Betriebssystem lauffähig, eigentlich muss nur Python installiert sein. Aber da es aktuell ein Kommandozeilenprogramm ist, sind Linux-Nutzer wahrscheinlich am ehesten mit so etwas vertraut o:)

 

Wenn es Nachfrage gibt, kann ich die Anleitung bei Gelegenheit mal so überarbeiten, dass es für Normalo-Windows-User und Normalo-MacOS-User etwas leichter wird.

 

Falls du es mit einer KI-generierten Anleitung - also ohne Garantien! - versuchen möchtest (kann ich leider nicht selbst ausführen mangels MacOS-Rechner, sieht aber soweit nachvollziehbar aus):

 

Quote

Unter macOS geht es am einfachsten so:

1. Python 3 installieren – entweder mit dem offiziellen Installer von python.org
   (am einfachsten ohne Vorkenntnisse):
   https://www.python.org/downloads/macos/
   ... oder per Homebrew (https://brew.sh) mit:
   brew install python

2. pyfifovap herunterladen – auf GitHub oben über "Code -> Download ZIP" und entpacken
   (oder per "git clone"):
   https://github.com/nspo/pyfifovap

3. Terminal im entpackten Ordner öffnen (Tipp: im Terminal "cd " eintippen und dann den
   Ordner aus dem Finder ins Terminal ziehen) und einmalig eine virtuelle Umgebung mit den
   Abhängigkeiten anlegen:


   python3 -m venv .venv
   source .venv/bin/activate
   pip install -r requirements.txt

4. Ausführen (mit den eigenen Exporten aus Portfolio Performance):


   python main.py -b Alle_Buchungen.csv -w "Wertpapiere_(Standard).csv"

Die virtuelle Umgebung (Schritt 3) empfehle ich, weil aktuelle Python-Versionen unter macOS
ein globales "pip install" sonst häufig mit der Meldung "externally-managed-environment"
blockieren. Beim nächsten Start reichen dann "source .venv/bin/activate" und der
"python main.py ..."-Aufruf.

 

Share this post


Link to post
Mojo-cutter
Posted

Danke für das Bereitstellen der Software. 
Für Interessierte, ich habe Claude.ai (opus 4.8) drauf schauen lassen:
 

Zitat

Sicherheit: sauber, mit einer dokumentierten Ausnahme. Reines Python (1.400 Zeilen über 3 Dateien), kein eval/exec/subprocess/Sockets. Einziger Internet-Kontakt ist yfinance — im Code verifiziert: ausschließlich in der ForexHelper-Klasse für Fremdwährungskurse, mit --offline-Flag zum kompletten Abschalten. Die README-Aussage „keine Depotdaten gehen ins Netz” deckt sich mit dem Code. GPL-3.0, Tests + CI vorhanden. Einschränkungen wie gehabt: junges Projekt (18 Sterne, 1 Entwickler, keine Releases), der Autor selbst schreibt „kann Fehler beinhalten, keine Steuerberatung” — Ergebnisse also gegen Broker-Abrechnungen bzw. mit Steuerberater plausibilisieren.


Interessant fand ich auch, habe es aber noch nicht geprüft ob es tatsächlich funktioniert:

Zitat

Ich (claude.ai) kann es voraussichtlich direkt hier in meiner Umgebung ausführen. PyPI und GitHub sind in meiner Sandbox erreichbar; mit --offline entfällt der Yahoo-Zugriff (dein Depot ist ohnehin überwiegend EUR-notiert). Du müsstest also nichts lokal installieren: CSVs hochladen, ich lasse pyfifovap laufen, prüfe das Ergebnis-XLSX und verdrahte die relevanten Zahlen (Chargen-Reihenfolge, EM-Bond-Verlust, VAP-Bestand) mit dem Modell. Ob es fehlerfrei durchläuft, sehe ich erst mit echten Daten — das ist eine Erwartung, kein Versprechen.

 

Share this post


Link to post
migieger
Posted
vor 20 Stunden von Mojo-cutter:

Interessant fand ich auch, habe es aber noch nicht geprüft ob es tatsächlich funktioniert:

Zitat

Ich (claude.ai) kann es voraussichtlich direkt hier in meiner Umgebung ausführen. PyPI und GitHub sind in meiner Sandbox erreichbar; mit --offline entfällt der Yahoo-Zugriff (dein Depot ist ohnehin überwiegend EUR-notiert). Du müsstest also nichts lokal installieren: CSVs hochladen, ich lasse pyfifovap laufen, prüfe das Ergebnis-XLSX und verdrahte die relevanten Zahlen (Chargen-Reihenfolge, EM-Bond-Verlust, VAP-Bestand) mit dem Modell. Ob es fehlerfrei durchläuft, sehe ich erst mit echten Daten — das ist eine Erwartung, kein Versprechen.

 


Du würdest sicher nur Testdaten zu Anthropic hochladen, oder?
 

Share this post


Link to post
Mojo-cutter
Posted
vor 5 Stunden von migieger:

Du würdest sicher nur Testdaten zu Anthropic hochladen, oder?

Warum? Mir ist mein Depot anonym genug. Wenn ich da Sorge habe, darf ich es hier auch nicht teilen. Oder warum fragst du?

Share this post


Link to post
Cinquetti
Posted
Am 10.6.2026 um 12:32 von Mojo-cutter:

Danke für das Bereitstellen der Software. 
Für Interessierte, ich habe Claude.ai (opus 4.8) drauf schauen lassen:


Ich mach relativ viel mit Claude und Python in meinen Hobbyprojekten.

Hier sind die Erkenntnisse von meinem Python-Specialist-Skill.
@boolvector8 Ich hoffe das hilft Dir:

  1. Geld als Decimal statt float (der eine echte Korrektheits-Punkt)
    In SecurityLot.purchased_value, parse_money_to_eur() etc. läuft alles über float.
    Du hast das selbst im Kommentar markiert (# Yes, as float at the moment). Für ein Steuer-Werkzeug ist das der heikelste Punkt: float kann sich bei Summen/Verrechnung im Cent-Bereich verschieben, und genau diese Cent landen am Ende in der KESt-Berechnung.
    Standard für Geldbeträge ist decimal.Decimal (mit quantize() aufs Hundertstel).
    Stückzahlen dürfen float bleiben (Bruchstücke), aber Beträge in EUR sollten Decimal sein.
    Das ist mMn der Tipp mit dem höchsten Hebel.
     
  2. pyproject.toml + uv statt requirements.txt + bare pip
    Aktuell sind die Deps unpinned (pandas, yfinance, ...).
    Gerade yfinance bricht zwischen Versionen regelmäßig sein API/Verhalten - heute lauffähig, in 3 Monaten evtl. nicht mehr reproduzierbar.
    Migration:
    - pyproject.toml mit [project], dependencies, requires-python
    - [project.scripts] pyfifovap = "pyfifovap.main:main" -> dann startet es als pyfifovap ... statt ./main.py 
    - uv lock erzeugt eine uv.lock (committen!) -> bit-genau reproduzierbare Installs
    - Setup wird dann ein Befehl: uv sync
     
  3. Verteilung ohne „Python-Skript starten" (Nuitka)
    Du listest selbst als Einschränkung: „Man muss ein Python-Skript starten können."
    Deine Zielgruppe (steuerinteressierte Anleger) ist oft nicht Dev.
    Mit Nuitka (--standalone) baust du pro OS eine native Binary - der Nutzer lädt eine ZIP, entpackt, doppelklickt/startet.
    Pro Plattform auf der jeweiligen Maschine bauen (kein Cross-Compile), lässt sich aber komplett in die bestehende GitHub-Action giessen (tag-getriggert, OS-Matrix, Artefakte ans Release hängen).
    Das senkt deine Einstiegshürd e drastisch. Als Zwischenschritt reicht schon pipx install / uvx dank [project.scripts].
     
  4. mypy in die CI
    ruff lintet, aber type-checkt nicht.
    Du hast schon überall Hints - mit mypy (anfangs nicht-strict, dann schrittweise schärfen) fängst du Typ-Bugs vor der Laufzeit. Ein zusätzlicher CI-Step, kein neuer Workflow.
     
  5.  Kleinkram:
    - CI-Matrix auf 3.11/3.12/3.13 ausweiten (testet aktuell nur 3.11)
    - Optional[X] -> X | None (du bist auf 3.11, geht überall)
    - Optional: poethepoet als Task-Runner (poe test, poe lint, poe build) bündelt die Befehle
    - pyfifovap.py ist mit ~1150 Zeilen ein Mix aus Domänenlogik (FIFO/Steuer), Infrastruktur (yfinance/CSV) und Präsentation (XLSX).
    Ein leichter Split (z. B. domain/, io/, report/) erleichtert Tests - aber das ist „nice to have", kein Muss bei einem Solo-Projekt.

Nuitka :wub: (https://nuitka.net/) kann ich Dir wirklich ans Herz legen. 
Du kannst keinen Endanwender davon überzeugen ein pip install zu machen - da ist die Einstiegshürde zu groß.

 

Share this post


Link to post
migieger
Posted
vor 5 Stunden von Mojo-cutter:
vor 10 Stunden von migieger:

Du würdest sicher nur Testdaten zu Anthropic hochladen, oder?

Warum? Mir ist mein Depot anonym genug. Wenn ich da Sorge habe, darf ich es hier auch nicht teilen. Oder warum fragst du?


Mir wäre das zu unsicher. Diese (sehr persönlichen) Daten landen irgendwo, ohne jegliche Kontrolle meinerseits...
Aber ich bin da auch sehr "old school", keine cloud Dienste, keine Daten in der cloud und so...
 

Share this post


Link to post
Mojo-cutter
Posted
vor 9 Stunden von migieger:

Mir wäre das zu unsicher. Diese (sehr persönlichen) Daten landen irgendwo, ohne jegliche Kontrolle meinerseits...

Absolut richtig. Dessen muss man sich klar sein!

Share this post


Link to post
Der Heini
Posted

Finde ich sehr interessant, folge mal dem Thread.

Aber: Es muss lokal laufen und einfach sein. Also, wie @Cinquettischreibt, einfach per Doppelklick, sowie PP installiert wird. Ansonsten ist die Gefahr der Fehlerseite meinerseits zu hoch, bin ehrlich. Da fehlt auch oft die Geduld.

Lokal, da die Gefahr, daß persönliche Daten irgendwie abgegriffen werden wäre mir zu hoch. Das ist ja gerade der Vorteil von PP gegenüber anderen Cloud-Lösungen.

 

Bisher habe die daten aus PP in Excel-Sheet bei mir gepackt und Steuern grob überschlagen. Das ist aber nur sehr rudimentär für einen Überblick.

Share this post


Link to post
stagflation
Posted · Edited by stagflation

Hallo @boolvector8,

 

ich habe heute Abend Dein Programm ausprobiert. Es könnte genau das sein, was ich benötige! Vielen Dank, dass Du es geschrieben hast und dass Du es unter einer GNU Lizenz zur Verfügung stellst. Ich werde es in den nächsten Wochen mit meinen Daten testen.

 

Kurz zu meiner Situation. Vor 10 Jahren hatte ich ein paar Scripte für die Verwaltung von Festgeldern geschrieben: Käufe und Verkäufe (Buchungen) habe ich in ASCII-Dateien notiert und Scripte geschrieben, die daraus Reports mit Bestand, Zinszahlungen, Steuern, Rendite-Berechnungen, usw. erstellen. So ähnlich wie ledger. Das hat gut funktioniert. 

 

Für Wertpapiere und Fonds habe ich bisher Tabellenkalkulationen verwendet. Aber das wird mittlerweile zu komplex. Also hatte ich überlegt, meine Festgeld-Scripte auszubauen.

 

Dann habe ich mir Portfolio-Performance angeschaut und festgestellt, dass es mir gut gefällt und dass ich es sehr gut für die Buchungs- und  Bestandsverwaltung verwenden kann. Pluspunkte sind das Einlesen von PDF-Abrechnungen und das schnelle Einpflegen von manuellen Buchungen. Außerdem kann es schöne Reports erstellen verschiedene Erfolgsparameter berechnen. Nur Gewinnberechnung nach FIFO unter Einbeziehung von Vorabpauschalen kann es nicht. Das wollte ich genauso lösen wie Du: Buchungen exportieren und Berechnung mit einem Script. Da Du das Programm aber offenbar bereits geschrieben hast, kann ich mir eine Eigenentwicklung sparen... Deine Ankündigung oben kam für mich jedenfalls exakt zum richtigen Zeitpunkt!

 

Nachtrag: ich habe einen komplizierteren Fall aus meinem Depot mit pyfifovap nachgerechnet. Es geht um einen MSCI World ETF, für den ich mehrere Tranchen bei unterschiedlichen Brokern gekauft hatte. Diese habe ich vor drei Jahren bei einem neuen Broker zusammengefasst. Von diesem ETF wollte ich einen Teil verkaufen. Damit ich möglichst wenig Steuern zahlen musste, wollte ich die Tranchen mit den hohen Einstandspreisen verkaufen. Deshalb habe ich vor dem Verkauf einen Teil-Übertrag zu einem weiteren Broker durchgeführt und danach verkauft. pyfifovap hat den Fall korrekt nach FIFO berechnet und ist nicht durcheinandergekommen. Vorabpauschalen und Teilfreistellung wurden korrekt eingerechnet. Das berechnete Verkaufs-Ergebnis hat bis auf ein paar Euro mit der Abrechnung des Brokers übereingestimmt. Auch die Tranchen, die durch den Depotübertrag jetzt bei dem weiteren Broker liegen, wurden korrekt berechnet. :thumbsup:

Share this post


Link to post
stagflation
Posted · Edited by stagflation

Um das Programm zu installieren, muss man laut Anleitung auf der Homepage zunächst eine virtuelle Umgebung erstellen und mit pip bzw. uv zuerst ein paar Python-Module installieren. In der Python Community ist dieses Vorgehen üblich. Ich mag die Methode "fremden Code herunterladen lassen und ausführen" überhaupt nicht.

 

Wenn man keine Währungsumrechnung braucht, kann man pyfifovap unter Debian Linux (und anderen Linux Distributionen) auch mit Systempaketen zum Laufen bringen. Dann benötigt man kein venv / pip / uv.

 

Installation:

  1. Die benötigten Python-Pakete kann man über apt installieren (als root):
    apt install \
       python3-xlsxwriter \
       python3-pandas python3-pandas-lib \
       python3-sortedcontainers \
       python3-openpyxl \
       python3-pytest
  2. Man erstellt als User ein Verzeichnis und kopiert die Programme "main.py", "pyfifovap.py" und "i18n_helper.py" dorthin
     
  3. In Zeile 7 von "pyfifovap.py" kommentiert man die Anweisung "import yfinance" aus (ein '#' davorschreiben)
     
  4. Man kopiert auch die Dateien "etf_metadaten.csv" und "etf_vorabpauschalen.csv" in das Verzeichnis. Diese müssen später angepasst werden. Für den ersten Aufruf können sie aber so bleiben.

Inbetriebnahme:

  1. Man erzeugt aus Portfolio Performance die beiden Export-Dateien "Wertpapiere_(Standard).csv" und "Alle_Buchungen.csv" (wie auf der pyfifovap Homepage gezeigt) und legt sie auch in das Verzeichnis.
     
  2. Dann lässt man das Programm laufen: 
    python3 main.py -b Alle_Buchungen.csv -w Wertpapiere_\(Standard\).csv --offline
  3. Als Ergebnis bekommt man eine Excel-Datei, die man mit Excel oder Libreoffice Calc ansehen kann: 
    localc Ergebnisse.xlsx
  4. Jetzt kann man die beiden Dateien "etf_metadaten.csv" und "etf_vorabpauschalen.csv" um Teilfreistellungen und berechnete Vorabpauschalen ergänzen. 
    localc "etf_metadaten.csv" "etf_vorabpauschalen.csv" 
    Tipp: Die benötigten ISINs und Fondsnamen kann man sich per Copy&Paste aus der Datei "Ergebnisse.xlsx" kopieren. 
    Achtung: zurzeit verwenden beide Dateien das Komma als Feldseparator und den Punkt als Dezimaltrennzeichen. Beim Import in die Tabellenkalkulation und beim Export aus der Tabellenkalkulation muss dies beachtet werden, sonst gibt es beim Aufruf des Python-Programms kryptische Fehlermeldungen.
     
  5. Hilfreich ist auch die Ausgabe der Optionen
    python3 main.py --help 
    Dort findet man beispielsweise "--kirche-8" oder "--kirche-9", die manche vielleicht brauchen werden.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...