DCF-Modell-Builder
Übersicht
Dieses Skill erstellt institutionelle DCF-Modelle für die Aktienbewertung nach Investmentbanking-Standards. Jede Analyse erzeugt ein detailliertes Excel-Modell (mit Sensitivitätsanalyse am unteren Ende des DCF-Arbeitsblatts).
Werkzeuge
- Standardmäßig werden alle vom Benutzer bereitgestellten Informationen sowie verfügbare MCP-Server für die Datenbeschaffung verwendet.
Wichtige Einschränkungen – Bitte zuerst lesen
Diese Einschränkungen gelten während der gesamten Erstellung des DCF-Modells. Vor dem Start durchgehen:
Umgebung: Office JS vs. Python/openpyxl:
- Wenn das Modell innerhalb von Excel ausgeführt wird (Office-Add-In / Office-JS-Umgebung): Verwende Office JS direkt – NICHT Python/openpyxl. Schreibe Formeln mittels
range.formulas = [["=D19*(1+$B$8)"]]. Kein separater Neuberechnungsschritt nötig; Excel berechnet nativ. Verwenderange.format.*für die Formatierung. Es gilt dieselbe Formel-statt-Hartcodierung-Regel: Setze.formulas, niemals.valuesfür abgeleitete Zellen. - Wenn eine eigenständige .xlsx-Datei erstellt wird (keine aktive Excel-Sitzung): Verwende Python/openpyxl wie unten beschrieben, führe dann vor der Auslieferung
recalc.pyaus. - Der Rest dieses Skills verwendet openpyxl-Beispiele — übersetze sie in Office-JS-API-Aufrufe, wenn in jener Umgebung gearbeitet wird, aber alle Prinzipien (Formelstrings, Zellenkommentare, Abschnittsprüfpunkte, Sensitivitätstabellen-Schleifen) gelten identisch.
⚠️ Office-JS-Merged-Cell-Falle: Beim Erstellen von Abschnittsüberschriften mit verbundenen Zellen rufe NICHT .merge() auf und setze dann .values auf den verbundenen Bereich – Office JS meldet immer noch die ursprünglichen Abmessungen des Bereichs und wirft InvalidArgument: Die Anzahl der Zeilen oder Spalten im Eingabearray entspricht nicht der Größe oder den Dimensionen des Bereichs. Schreibe stattdessen den Wert allein in die oberste linke Zelle und verbinde und formatiere dann den gesamten Bereich:
// FALSCH — wirft InvalidArgument:
const hdr = ws.getRange("A7:H7");
hdr.merge();
hdr.values = [["MARKTDATEN & SCHLÜSSELEINGABEN"]]; // 1×1-Array vs. 1×8-Bereich → Fehler
// RICHTIG — zuerst Wert in einzelne Zelle, dann verbinden und formatieren:
ws.getRange("A7").values = [["MARKTDATEN & SCHLÜSSELEINGABEN"]];
const hdr = ws.getRange("A7:H7");
hdr.merge();
hdr.format.fill.color = "#1F4E79";
hdr.format.font.bold = true;
hdr.format.font.color = "#FFFFFF";
Dies gilt für jede verbundene Abschnittsüberschrift im DCF (Marktdaten, Szenarioblöcke, Cashflow-Prognose, Terminalwert, Bewertungszusammenfassung, Sensitivitätstabellen).
Formeln statt hartcodierter Werte (NICHT VERHANDELBAR):
- Jede Prognosezelle, Marge, Diskontierungsfaktor, Barwert und Sensitivitätszelle MUSS eine Live-Excel-Formel sein – niemals ein in Python berechneter und als Zahl geschriebener Wert
- Bei Verwendung von openpyxl:
ws["D20"] = "=D19*(1+$B$8)"ist korrekt;ws["D20"] = berechneter_umsatzist FALSCH - Die einzigen erlaubten hartcodierten Zahlen sind: (1) rohe historische Eingaben, (2) Annahmetreiber (Wachstumsraten, WACC-Eingaben, terminales Wachstum g), (3) aktuelle Marktdaten (Aktienkurs, Nettoverschuldung)
- Wenn du dabei ertappst, etwas in Python zu berechnen und das Ergebnis zu schreiben – STOPP. Das Modell muss flexibel sein, wenn der Benutzer eine Annahme ändert.
Schritt-für-Schritt mit dem Benutzer überprüfen (KEINE End-to-End-Erstellung):
- Nach der Datenabfrage → Zeige dem Benutzer den Rohdatenblock (Umsatz, Margen, Aktien, Nettoverschuldung) und bestätige vor der Prognose
- Nach den Umsatzprognosen → Zeige die prognostizierte Top-Line und Wachstumsraten, bestätige vor dem Aufbau der Margen
- Nach dem FCF-Aufbau → Zeige den vollständigen FCF-Zeitplan, bestätige die Logik vor der WACC-Berechnung
- Nach dem WACC → Zeige die Berechnung und Eingaben, bestätige vor der Diskontierung
- Nach Terminalwert + Barwert → Zeige die Equity-Brücke (EV → Eigenkapitalwert → Wert pro Aktie), bestätige vor den Sensitivitätstabellen
- Fehler in jeder Phase abfangen – eine falsche Margenannahme, die erst nach Erstellung der Sensitivitätstabellen entdeckt wird, erfordert den Neuaufbau aller nachgelagerten Schritte
Sensitivitätstabellen:
- Verwende eine ungerade Anzahl von Zeilen und Spalten (Standard: 5×5, manchmal 7×7) – dies garantiert eine echte Mittelzelle
- Mittelzelle = Basisfall. Baue die Achsenwerte so, dass der mittlere Zeilenkopf und der mittlere Spaltenkopf exakt den tatsächlichen Annahmen des Modells entsprechen (z. B. wenn der Basis-WACC = 9,0 %, ist die mittlere Zeile 9,0 %; wenn das terminale Wachstum g = 3,0 %, ist die mittlere Spalte 3,0 %). Der Ausgabewert der Mittelzelle muss daher dem tatsächlichen implizierten Aktienkurs des Modells entsprechen – dies ist der Plausibilitätscheck, dass die Tabelle korrekt aufgebaut ist.
- Heb die Mittelzelle hervor mit mittelblauer Füllung (
#BDD7EE) + fettgedruckter Schrift, sodass sofort sichtbar ist, welche Zelle der Basisfall ist. - Befülle ALLE Zellen (typischerweise 3 Tabellen × 25 Zellen = 75) mit vollständigen DCF-Neuberechnungsformeln
- Verwende openpyxl-Schleifen (oder Office-JS-Schleifen), um Formeln programmatisch zu schreiben
- KEINE Platzhaltertexte, KEINE linearen Näherungen, KEINE manuellen Schritte erforderlich
- Jede Zelle muss das vollständige DCF für diese Annahmenkombination neu berechnen
Zellenkommentare:
- Füge Zellenkommentare hinzu, SOBALD jeder hartcodierte Wert erstellt wird
- Format: "Quelle: [System/Dokument], [Datum], [Referenz], [URL falls zutreffend]"
- Jede blaue Eingabe muss einen Kommentar haben, bevor der nächste Abschnitt begonnen wird
- Nicht bis zum Ende verschieben oder "TODO: Quelle hinzufügen" schreiben
Modell-Layout-Planung:
- Definiere ALLE Abschnittszeilenpositionen, BEVOR Formeln geschrieben werden
- Schreibe zuerst ALLE Überschriften und Beschriftungen
- Schreibe als Zweites ALLE Abschnittstrennlinien und leere Zeilen
- DANN schreibe Formeln unter Verwendung der festgelegten Zeilenpositionen
- Teste Formeln unmittelbar nach der Erstellung
Formel-Neuberechnung:
- Führe vor der Auslieferung
python recalc.py model.xlsx 30aus - Korrigiere ALLE Fehler, bis der Status "erfolgreich" ist
- NULL Formelfehler erforderlich (#REF!, #DIV/0!, #WERT! usw.)
Szenarioblöcke:
- Erstelle separate Blöcke für Bär/Basis/Bulle-Fälle
- Zeige Annahmen horizontal über die Prognosejahre innerhalb jedes Blocks
- Verwende WENN-Formeln:
=WENN($B$6=1;[Bär-Zelle];WENN($B$6=2;[Basis-Zelle];[Bulle-Zelle])) - Überprüfe, ob die Formeln auf die korrekten Szenarioblock-Zellen verweisen
DCF-Prozess-Workflow
Schritt 1: Datenabfrage und Validierung
Rufe Daten von MCP-Servern, vom Benutzer bereitgestellten Daten und aus dem Web ab.
Datenquellen-Priorität:
- MCP-Server (falls konfiguriert) – Strukturierte Finanzdaten von Anbietern wie Daloopa
- Vom Benutzer bereitgestellte Daten – Historische Finanzkennzahlen aus deren Recherche
- Websuche/Abruf – Aktuelle Kurse, Beta, Fremdkapital und Bargeld bei Bedarf
Validierungs-Checkliste:
- Überprüfe Nettoverschuldung vs. Netto-Cash (kritisch für Bewertung)
- Bestätige verwässerte Aktienanzahl (prüfe auf Aktienrückkäufe/-ausgaben)
- Validiere, dass historische Margen mit dem Geschäftsmodell konsistent sind
- Gleiche Umsatzwachstumsraten mit Branchen-Benchmarks ab
- Überprüfe, ob der Steuersatz angemessen ist (typischerweise 21–28 %)
Schritt 2: Historische Analyse (3–5 Jahre)
Analysiere und dokumentiere:
- Umsatzwachstumstrends: Berechne CAGR, identifiziere Treiber
- Margenentwicklung: Verfolge Bruttomarge, EBIT-Marge, FCF-Marge
- Kapitalintensität: D&A und CapEx als % des Umsatzes
- Working-Capital-Effizienz: NWC-Veränderungen als % des Umsatzwachstums
- Renditekennzahlen: ROIC-, ROE-Trends
Erstelle Zusammenfassungstabellen:
Historische Kennzahlen (LTM):
Umsatz: X Millionen €
Umsatzwachstum: X % CAGR
Bruttomarge: X %
EBIT-Marge: X %
D&A % des Umsatzes: X %
CapEx % des Umsatzes: X %
FCF-Marge: X %
Schritt 3: Umsatzprognosen erstellen
Methodik:
- Beginne mit dem aktuellsten tatsächlichen Umsatz (LTM oder letztes Geschäftsjahr)
- Wende Wachstumsraten für jedes Prognosejahr an
- Zeige sowohl absolute Beträge ALS AUCH berechnete Wachstumsraten in %
Wachstumsraten-Rahmenwerk:
- Jahr 1–2: Höheres Wachstum, das die kurzfristige Visibilität widerspiegelt
- Jahr 3–4: Allmähliche Abschwächung auf Branchendurchschnitt
- Jahr 5+: Annäherung an terminale Wachstumsrate
Formelstruktur:
- Umsatz(Y