Vollautomatisierter Aktien-Scan, Portfoliomanagement und Risikosteuerung
Überblick
Der Weekly Screener ist ein vollautomatisiertes System zur Selektion, zum Erwerb und zur Verwaltung von US-Aktien. Es läuft einmal wöchentlich — jeden Samstag — und trifft alle Kauf-, Verkaufs- und Risikomanagement-Entscheidungen eigenständig, ohne manuellen Eingriff.
Das System folgt der Anlagephilosophie von Mark Minervini (SEPA-Methode) und dem O'Neil-Ansatz. Es kauft ausschließlich Aktien, die sich in einem nachweisbaren Aufwärtstrend befinden, fundamentale Stärke zeigen und ein klar definiertes Chartmuster aufweisen. Jede Position wird mit einem vordefinierten Risikolimit und einem automatischen Stop-Loss abgesichert.
Samstagsablauf — Hauptprogramm
Schritt 1 — Systemstart und Initialisierung
Zu Beginn legt das System fest, in welchem Modus es läuft. An einem Samstag wechselt es automatisch in den Live-Modus und verbindet sich mit dem Broker-API. An allen anderen Wochentagen läuft es im Testmodus, ohne echte Orders zu platzieren.
Zusätzlich wird ein Datenzwischenspeicher aktiviert. Einmal heruntergeladene Kursdaten werden 24 Stunden lokal gespeichert, um bei einem Neustart keine Daten erneut herunterladen zu müssen.
Schritt 2 — Aktien-Universum laden
Das System definiert zunächst, welche Aktien überhaupt betrachtet werden sollen. Dieses Universum ist eine Liste von Ticker-Symbolen und stammt aus drei möglichen Quellen:
- Nasdaq-Screener (Standardquelle): Die vollständige Liste aller an US-Börsen gelisteten Aktien, tagesaktuell abgerufen. Marktkapitalisierung, Sektor und Branche kommen im selben Abruf mit. Aus rund 7.100 gelieferten Titeln bleiben nach der Mindestgröße von 300 Mio. USD Marktkapitalisierung etwa 3.700 übrig.
- Lokale CSV-Datei (Notnagel): Eine statische Liste vom Stand 11/2025. Sie greift nur, wenn der Screener-Abruf fehlschlägt, und meldet das dann deutlich im Protokoll — sie altert, übernommene und delistete Firmen stehen weiter darin.
- BlackRock ETF-Holdings (optional): Holdings der iShares-ETFs auf Russell 1000, 2000 oder 3000. Per Konfiguration wählbar, im Normalbetrieb nicht aktiv.
Anschließend wird die Liste bereinigt: Ein Abgleich mit dem offiziellen Börsenverzeichnis entfernt Titel, die nicht mehr gelistet sind; zusätzlich fliegen Symbole heraus, für die der Kursanbieter über mehrere Läufe hinweg keine Daten mehr liefert. Beide Prüfungen fangen unterschiedliche Fälle ab — nicht mehr existierende Firmen einerseits, Datenlücken bei weiterhin gelisteten Titeln andererseits. Offene Depotpositionen sind von der Bereinigung ausgenommen.
Unternehmensnamen und Branchenzuordnungen kommen aus derselben Quelle und erfordern keinen zusätzlichen Abruf.
Schritt 3 — Historische Kursdaten laden
Für alle Aktien im Universum werden historische Wochenkursdaten der letzten zwei Jahre heruntergeladen. Jeder Datensatz enthält Eröffnung, Hoch, Tief, Schluss und Volumen auf Wochenbasis.
Das System prüft dabei, ob eine Aktie noch aktiv gehandelt wird. Liegt der letzte Handelstag einer Aktie mehr als 14 Tage zurück, wird sie als inaktiv eingestuft und aus dem weiteren Durchlauf ausgeschlossen.
Schritt 4 — Markt- und Indexdaten laden
Neben den Einzelaktien lädt das System übergeordnete Marktdaten. Diese Tagesdaten werden auf Wochenbasis zusammengefasst:
- Marktindizes: SPY (S&P 500), QQQ (Nasdaq 100), IWM (Russell 2000)
- Sentiment-Indikatoren: VIX (Volatilitätsindex), TNX (10-jährige US-Staatsanleihen-Rendite), UUP (US-Dollar-ETF)
- Sektor-ETFs: Alle elf SPDR-Sektor-ETFs, darunter Technologie, Finanzen, Gesundheit, Energie und weitere
Schritt 5 — Marktbreite berechnen
Die Marktbreite beschreibt, wie breit eine Marktbewegung aufgestellt ist. Das System berechnet für das gesamte Universum vier Kennzahlen:
- Anteil der Aktien oberhalb ihres 10-Wochen-Exponentialgleitenden Durchschnitts (EMA)
- Anteil der Aktien oberhalb ihres 50-Wochen-Gleitenden Durchschnitts (MA)
- Anzahl neuer 52-Wochen-Hochs und Tiefs, absolut und als Verhältnis
- Anteil der Aktien mit positiver Wochenrendite
Diese Werte werden für die aktuelle Woche sowie für die Wochen minus 1 und minus 4 ausgewiesen, um Trends in der Marktbreite zu erkennen.
Schritt 6 — Marktampel: Kaufbedingung prüfen
Bevor das System neue Kaufsignale generiert, prüft es zwei übergeordnete Bedingungen. Beide müssen erfüllt sein, damit der volle Kaufmodus aktiv ist:
- Trendfilter: Der kurzfristige gleitende Durchschnitt des S&P 500 (10-Wochen-EMA) liegt über dem mittelfristigen (20-Wochen-EMA). Das zeigt an, dass der Markt insgesamt im Aufwärtstrend ist.
- Marktbreite: Mindestens 40 % der S&P-500-Aktien notieren oberhalb ihres 200-Tage-Gleitenden Durchschnitts. Das stellt sicher, dass der Aufschwung nicht nur von wenigen großen Werten getragen wird.
58 % der S&P-500-Aktien über 200-Tage-MA → Marktbreite erfüllt.
Ergebnis: Marktampel auf Grün. Bis zu 3 neue Kaufsignale möglich, volle Positionsgröße.
Ist mindestens eine der beiden Bedingungen nicht erfüllt, wechselt das System in einen defensiven Modus. In diesem Fall wird nur noch maximal 1 neues Kaufsignal pro Woche ausgegeben, und alle Positionsgrößen werden halbiert.
Schritt 7 — Offene Kauforders stornieren
Kauforders aus der Vorwoche, die nicht ausgelöst wurden, weil der Kurs das definierte Einstiegsniveau nicht erreicht hat, werden automatisch storniert. Das verhindert, dass veraltete Orders zu einem ungünstigen Zeitpunkt ausgelöst werden.
Schritt 8 — Portfolio-Daten abrufen
Das System holt den aktuellen Stand des Portfolios vom Broker: das verfügbare Bargeld, den Gesamtdepotwert sowie alle Details zu aktuell gehaltenen Positionen (Einstiegspreis, Anzahl Aktien, aktueller Kurs, unrealisierter Gewinn/Verlust).
Änderung 2026-10-06: Positionen, die auf einem eingefrorenen Kurs stehen (delistet oder durch Übernahme nicht mehr handelbar, Register in docs/data/delisted.json), bleiben im Depotwert und in der Anzeige, zählen aber NICHT gegen die Positionsplätze und das Sektorlimit. Sonst blockieren tote Titel neue Käufe. Das Paper-Konto bildet Übernahmen nicht ab, deshalb trägt das Register die Wahrheit.
Schritt 8a — Sell-Order-Coverage-Prüfung
Grundregel des Systems: Zu jeder gehaltenen Position muss jederzeit eine aktive Stop-Sell-Order beim Broker hinterlegt sein. In Schritt 17 wird diese Order automatisch als Teil der OTO-Kauforder angelegt. Dennoch kann eine Schutzorder fehlen — z. B. weil die Kinderorder einer OTO-Order nicht übertragen wurde oder eine Order manuell gelöscht wurde.
Das System prüft deshalb bei jedem Wochenrun für jede offene Position, ob eine aktive Stop-Sell-Order beim Broker existiert. Fehlt sie, wird sie automatisch nachgezogen.
Stop-Preis-Bestimmung bei fehlender OrderDas System bestimmt den Stop-Preis in drei Stufen (erste verfügbare Quelle gewinnt):
- 1. Trade Journal — current_stop: Der zuletzt gültige, ggf. bereits angehobene Stop aus dem Journal.
- 2. Trade Journal — initial_stop: Der ursprüngliche Stop-Wert aus dem Kaufsignal.
- 3. Fallback: 8 % unter dem Einstandspreis (Notfallwert, falls kein Journal-Eintrag existiert).
Keine aktive Sell-Order beim Broker gefunden.
→ System legt automatisch eine Stop-Market-Sell-GTC-Order bei 168 $ an.
Schritt 8b — Ablaufende Sell-Orders erneuern
Alpaca löscht GTC-Orders (Good Till Cancelled) nach 90 Tagen stillschweigend. Eine abgelaufene Stop-Sell-Order wird nicht ausgelöst — die Position wäre schutzlos offen.
Das System prüft deshalb bei jedem Wochenrun das Erstellungsdatum aller offenen Stop-Sell-Orders. Orders, die älter als 80 Tage sind (10 Tage Puffer vor der 90-Tage-Grenze), werden automatisch storniert und mit identischem Stop-Preis und identischer Menge neu angelegt.
| Status | Bedeutung |
|---|---|
ok | Order ist jünger als 80 Tage — keine Aktion nötig |
expiring_dry_run | Order wäre zu erneuern, aber Test-Modus aktiv |
renewed | Alte Order storniert, neue Order erfolgreich platziert |
cancel_error | Stornierung fehlgeschlagen — manuelle Prüfung erforderlich |
place_error | Neue Order konnte nicht angelegt werden — manuelle Prüfung erforderlich |
→ System storniert die alte Order und legt sofort eine neue Stop-Market-Sell-GTC bei 420 $ (Qty 10) an.
→ Die neue Order hat wieder 90 Tage Laufzeit.
Schritt 9 — Exit-Manager: MACD Bearish Cross
Für jede aktuell gehaltene Position prüft das System, ob ein sogenannter Bearish MACD Cross aufgetreten ist. Das ist ein technisches Signal, das auf nachlassendes Momentum hindeutet:
- MACD-Linie: Differenz aus 12-Wochen-EMA und 26-Wochen-EMA des Schlusskurses
- Signallinie: 9-Wochen-EMA der MACD-Linie
Ein Bearish Cross liegt vor, wenn die MACD-Linie von oberhalb der Signallinie nach unterhalb wechselt. Das System reagiert darauf mit einer Stop-Anpassung:
- Der neue Stop wird auf das Wochentief der auslösenden Kerze gesetzt.
- Dieser angehobene Stop ersetzt den bisherigen nur dann, wenn er tatsächlich höher liegt. Ein Absenken des Stops ist ausgeschlossen.
Das Wochentief der auslösenden Kerze liegt bei 54 $. Da 54 $ > 48 $, wird der Stop auf 54 $ angehoben.
Fällt der Kurs unter 54 $, verkauft der Broker die Position automatisch.
Schritt 10 — Trade Journal synchronisieren
Das System führt intern ein Trade Journal. In diesem Schritt wird es mit den tatsächlichen Broker-Transaktionen der letzten Woche abgeglichen:
- Neu ausgeführte Käufe werden als offene Positionen ins Journal aufgenommen.
- Abgeschlossene Verkäufe werden mit Ausstiegspreis, Datum und Ausstiegsgrund ins Journal eingetragen und als abgeschlossene Trades markiert.
- Angehobene Stops aus Schritt 9 werden ins Journal übertragen.
- Der unrealisierte Gewinn und Verlust aller offenen Positionen wird aktualisiert.
Schritt 11 — Gewinnmitnahme-System
Das System wendet vier ineinandergreifende Regeln an, um Gewinne systematisch zu sichern. Alle Parameter sind zentral konfigurierbar.
Regel 1 — Breakeven-StopSobald eine Position mehr als 10 % im Plus liegt, wird der Schutzstopp auf den ursprünglichen Einstandspreis angehoben. Der Trade kann damit nicht mehr mit Verlust enden. Diese Regel ist immer aktiv und löst keinen Teilverkauf aus.
Regel 2 — O'Neil Fast-Mover-ErkennungErreicht eine Position innerhalb von drei Wochenkerzen ab Einstieg einen Gewinn von 20 % oder mehr, wird kein Teilverkauf vorgenommen. Stattdessen wird die Position acht Wochen gehalten (O'Neil "8-week hold rule"). Nach Ablauf dieser Haltezeit wird ein ATR-basierter Trailing Stop aktiviert (Regel 4).
Regel 3 — Minervini Power of ThreeFür normale Bewegungen, also ein Gewinn von 20 % in mehr als 3 Wochen, gilt ein gestaffeltes Teilverkaufsschema:
- Bei +20 % Gewinn: Ein Drittel der Position wird automatisch zum Marktpreis verkauft.
- Bei +40 % Gewinn: Ein weiteres Drittel wird automatisch verkauft.
- Das verbleibende Drittel läuft als sogenannter Runner weiter. Für diesen wird Regel 4 aktiviert.
Der bei jedem Teilverkauf realisierte Gewinn wird sofort der noch offenen Position gutgeschrieben und fließt unmittelbar in die Gewinn-/Verlust-Statistik des Performance-Dashboards ein — also nicht erst, wenn die Position irgendwann vollständig geschlossen wird. Im Trade Journal erscheint der bereits gesicherte Betrag als Hinweis an der offenen Position; beim späteren Vollverkauf wird er mit dem Erlös des Restbestands zum Gesamtergebnis des Trades verrechnet.
Regel 4 — ATR-Trailing Stop für den RunnerNach dem ersten Teilverkauf (Regel 3) oder nach Ende der Fast-Mover-Haltezeit (Regel 2) wird ein dynamischer Trailing Stop aktiviert:
Trailing Stop = 80 $ − (2 × 3 $) = 74 $.
Steigt der Kurs auf 90 $, zieht der Stop automatisch auf 90 $ − 6 $ = 84 $ nach.
Der Stop wird nur angehoben, nie abgesenkt.
Bei Aktivierung ersetzt der ATR-Trailing Stop den bisherigen MACD-Stop. Das Modell sichert Gewinne, lässt der Position aber Raum zum Atmen.
Hinweis zur Ausführung: Regel 1 und 4 sind reine Stop-Order-Anpassungen (GTC) und werden direkt im Samstagdurchlauf an den Broker übermittelt — das funktioniert auch bei geschlossenem Markt. Die Teilverkäufe aus Regel 3 sind dagegen Markt-Orders, die der Broker bei geschlossenem Markt ablehnt. Sie werden daher samstags nur als geplante Verkäufe vorgemerkt und am folgenden Montag tatsächlich platziert (siehe Schritt 17, Fall A, und Montagsablauf).
Schritt 12 — Performance-Dashboard erstellen
Das System generiert automatisch einen visuellen Leistungsbericht. Dieser enthält die Eigenkapitalkurve des Portfolios, eine Vergleichslinie mit dem S&P 500, Gewinn-/Verlust-Statistiken sowie eine Übersicht aller abgeschlossenen Trades.
Der ausgewiesene realisierte Gewinn umfasst dabei nicht nur vollständig geschlossene Trades, sondern auch bereits gesicherte Teilverkäufe (Regel 3) noch offener Positionen. So spiegelt die Kennzahl den tatsächlich bereits realisierten Ertrag wider, auch wenn der Runner einer Position noch läuft.
Schritt 13 — Minervini-Screener
Das Herzstück des Systems: Jede Aktie im Universum wird anhand von acht technischen Kriterien nach Mark Minervini bewertet. Für jedes erfüllte Kriterium erhält die Aktie einen Punkt — der maximale Score beträgt 8/8.
| # | Kriterium | Bedingung |
|---|---|---|
| 1 | SMA 10 Wochen steigend | 10-Wochen-Durchschnitt liegt über dem der Vorwoche |
| 2 | SMA 30 Wochen steigend | 30-Wochen-Durchschnitt liegt über dem der Vorwoche |
| 3 | SMA 40 Wochen steigend | 40-Wochen-Durchschnitt liegt über dem der Vorwoche |
| 4 | MA-Ordnung | Kurs > SMA 10W > SMA 30W > SMA 40W (bullische Hierarchie) |
| 5 | 52-Wochen-Position | Kurs ≥ 130 % des 52-Wochen-Tiefs UND ≥ 75 % des 52-Wochen-Hochs |
| 6 | RS-Trend steigend | Aktueller RS-Score > RS-Score vor 4 Wochen |
| 7 | Volumenausbruch | Ø Tagesvolumen der Woche ≥ 1,3× des 20-Tage-Durchschnitts; Quartalsverfall- und Russell-Tage sind herausgerechnet (Optionsverfall und Indexumschichtung sind keine Nachfrage) |
| 8 | Wochenkurs positiv | Schlusskurs liegt über dem der Vorwoche |
Jede Aktie erhält einen RS-Score zwischen 1 und 99, der ihre Kursentwicklung relativ zu allen anderen Aktien im Universum abbildet. Ein Score von 90 bedeutet, dass die Aktie besser als 90 % aller anderen Aktien performed hat.
3-Monats-Performance: +18 % (Gewichtung 40 %)
6-Monats-Performance: +25 % (Gewichtung 20 %)
9-Monats-Performance: +30 % (Gewichtung 20 %)
12-Monats-Performance: +22 % (Gewichtung 20 %)
Gewichtete Performance = 0,4 × 18 + 0,2 × 25 + 0,2 × 30 + 0,2 × 22 = 22,6 %
Dieser Wert wird gegen alle Aktien im Universum gerankt → Ergebnis: z. B. RS-Score 78.
Zusätzlich: ΔRS 4W = RS-Score aktuell minus RS-Score vor 4 Wochen. Ein stark steigender Wert signalisiert, dass eine Aktie gerade dynamisch an Stärke gewinnt.
Chartmuster-Erkennung (kein Pflichtkriterium, aber Ranking-Booster)Das System erkennt zwei klassische Chartmuster, die als Kaufauslöser besonders wertvoll sind:
- VCP (Volatility Contraction Pattern): Eine Abfolge kleiner werdender Konsolidierungsphasen mit abnehmendem Volumen. Das Muster signalisiert, dass eine Aktie dabei ist, Energie für einen Ausbruch aufzubauen.
- Launchpad: Eine stabile, enge Basis über mehrere Wochen mit einer Kursspanne unter 8 % und einem Qualitätsscore von mindestens 60/100.
Das Erkennen eines dieser Muster ist kein Pflichtkriterium für ein Kaufsignal, verbessert aber den Rang einer Aktie im abschließenden Ranking erheblich.
Stillstands-Gegenprobe (beide Muster)Beide Muster suchen nach Enge — und genau diese Enge entsteht auch aus einem Grund, der mit Charttechnik nichts zu tun hat. Eine Aktie, für die ein Barangebot zur Übernahme läuft, ist an den Angebotspreis genagelt: darüber bietet niemand mehr, darunter kauft die Arbitrage sofort. Die Kursspanne schnurrt zusammen, das Volumen bleibt hoch, und das Muster erfüllt alle Kriterien mustergültig — bei einem Ausbruchspotenzial von exakt null.
Das System prüft deshalb zusätzlich, ob sich der Titel überhaupt noch bewegt: Die durchschnittliche Wochen-Kursspanne der letzten zehn Wochen muss über 1,5 % liegen. Eine echte Basis verengt sich relativ zu ihrem Ausbruchsniveau, der Titel schwankt dabei aber weiter; ein eingefrorener Kurs fällt durch.
Übernahmeangebot 2,43 $ je Aktie, angekündigt im Februar 2026.
Durchschnittliche Tagesspanne vorher: 4,9 % — danach: 0,7 %.
Das System erkannte eine 20-Wochen-Basis mit lehrbuchmäßiger Verengung; der Kurs stand seit 20 Wochen zwischen 2,33 $ und 2,43 $.
Wochen-Kursspanne 0,84 % → unter der Schwelle → Muster verworfen.
Kalibriert wurde die Schwelle an 353 VCP- und 274 Launchpad-Basen aus dem Gesamtuniversum. Unterhalb von 1,5 % fanden sich ausschließlich laufende Barübernahmen, Rentenfonds und illiquide Sonderpapiere; echte Basen liegen im Mittel bei rund 4 %. Betroffen sind 7 bis 9 % aller erkannten Muster.
Schritt 14 — Fundamentaldaten laden
Um den Rechenaufwand zu begrenzen, werden Fundamentaldaten nur für Aktien abgerufen, die im Minervini-Screener mindestens 6 von 8 Punkten erreicht haben. Abgerufen werden:
- Kurs und Marktkapitalisierung
- EPS (Gewinn je Aktie): Vorausschauend und der letzten 12 Monate (TTM)
- EPS-Wachstum: Vorausschauend, TTM und letztes Quartal im Jahresvergleich
- Umsatzwachstum: Umsatz des letzten Quartals im Jahresvergleich (entscheidet über das Signal, Kriterium 16). Zusätzlich der TTM-Wert (letzte 12 Monate gegen die 12 Monate davor), nur zur Anzeige.
- Quartalshistorie: US-Emittenten aus der SEC-Schnittstelle EDGAR (rund 7 Jahre, mit Meldetag je Quartal), Auslandsemittenten ersatzweise aus Yahoo. Fortgeschrieben in
docs/data/quarterly_fundamentals.csv. - Rentabilitätskennzahlen: ROE, operative Marge, Free-Cashflow-Marge (derzeit deaktiviert als Pflichtfilter)
- Verschuldungsgrad, EPS-Beschleunigung und Sektorzuordnung
Schritt 15 — Branchen-Stärke berechnen
Das System aggregiert die Einzelaktien-Kennzahlen auf Branchenebene und erstellt eine Rangliste der stärksten Branchen. Drei Kennzahlen fließen ein:
- Industry RS Score: Durchschnittlicher RS-Score aller Aktien der Branche
- Industry Strong Stock Score: Anteil der Aktien mit einem Minervini-Score von 8/8
- Industry Volume Score: Volumenaktivität gewichtet nach Kursrichtung, als Indikator für Kapitalflüsse
Diese drei Werte werden zu einem Composite Industry Score zusammengefasst und in eine Rangliste überführt. Nur Aktien aus den Top-50-%-Branchen kommen für ein Kaufsignal in Frage.
Schritt 16 — Signal-Generator: Kaufkriterien
Alle Aktien, die den Minervini-Screener und die Fundamentalprüfung überstanden haben, durchlaufen nun 18 Kauffilter. Alle Filter müssen erfüllt sein:
| # | Filterkriterium | Schwellenwert |
|---|---|---|
| 1 | Minervini-Score | ≥ 6 von 8 Punkten |
| 2 | RS-Score (Relative Stärke) | ≥ 70 (Top 30 % des Universums) |
| 3 | Abstand zum 52-Wochen-Hoch | ≤ 25 % unter dem 52-Wochen-Hoch |
| 4 | Volatilität (ATR / Kurs) | < 8 % (keine übermäßig schwankenden Aktien) |
| 5 | Volumenausbruch | Ø Tagesvolumen der Woche ≥ 1,3× des 20-Tage-Durchschnitts; Quartalsverfall- und Russell-Tage sind herausgerechnet (Optionsverfall und Indexumschichtung sind keine Nachfrage) |
| 6 | Branchen-Ranking | Top 50 % aller Branchen im Universum |
| 7 | Mindestkurs | ≥ 5 $ (kein Penny Stock) |
| 8 | Marktkapitalisierung | ≥ 300 Mio. $ (kein Micro Cap) |
| 9 | Mindest-Liquidität | Ø-Tagesdollarvolumen (20-Tage-Ø-Volumen × Kurs) ≥ 500.000 $ |
| 10 | Earnings-Blackout | Nächste Ergebnispublikation > 14 Tage entfernt |
| 11 | Wöchentlicher MACD | > Signallinie (positives Momentum) |
| 12 | Marktfilter (Trendfilter) | S&P 500: 10W-EMA > 20W-EMA (sonst halbe Positionsgröße) |
| 13 | Nicht im Portfolio | Position darf nicht bereits gehalten werden |
| 14 | Sektor-Konzentrationslimit | Maximal 3 Positionen pro Sektor |
| 15 | Marktbreite | ≥ 40 % der S&P-500-Aktien über ihrem 200-Tage-MA |
| 16 | Umsatzwachstum (TTM, YoY) ODER EPS-Wachstum (letztes Quartal, YoY) | ≥ 20 % bei mindestens einem der beiden (Stand 2026-09-06, vorher UND-verknüpft) |
| 17 | Wochenkurs steigend | Schlusskurs > Schlusskurs der Vorwoche |
| 18 | Übernahme-Ausschluss | Kein Fusions- oder Angebotsverfahren laut SEC-Einreichung (PREM14A, DEFM14A, SC 14D9, SC 13E3) in den letzten 365 Tagen. Gilt am Samstag und am Mittwoch. |
Hinweis: Rentabilitätskennzahlen wie ROE und operative Marge sind als Filter vorhanden, aber derzeit deaktiviert. Sie können bei Bedarf aktiviert werden.
Änderung 2026-09-06: Umsatz- und EPS-Wachstum waren bis dahin UND-verknüpft — ein Titel musste beide Schwellen gleichzeitig erreichen. Das schloss einen Großteil echter Marktführer aus, deren Quartals-EPS wegen eines volatilen Vorjahresvergleichs trotz starkem Kurs negativ war. Ein strengerer Ausgleich (Minervini-Score 8/8 statt 6/8) wurde geprüft und an den eigenen Trades getestet — er verschlechterte die Ergebnisse (Trefferquote 33 % statt 55 % bei Score 7) und blieb deshalb unverändert bei 6/8.
Änderung 2026-09-27: Neuer Liquiditätsfilter (Ø-Tagesdollarvolumen), Auslöser war SENEB (stop_hit, −15,9 %, nur 1.250 Aktien/Woche gehandelt). Bewusst als Dollar-Umsatz statt als reine Stückzahl umgesetzt: eine feste Stückzahl-Schwelle ist preisabhängig und hätte bei einer Gegenprobe an den eigenen Trades den Gewinner QCRH (482.550 Stück/Woche, aber $9,16 Mio Ø-Tagesdollarvolumen) fälschlich ausgeschlossen.
Änderungen 2026-10-03 bis 2026-10-06 (Zusammenfassung):
- Umsatz-Hürde bleibt Quartals-YoY. TTM wird angezeigt, entscheidet aber nicht. Die Journal-Prüfung (19 Trades) reicht für eine Umstellung nicht. Entscheidung frühestens Ende 2026.
- EPS-Wachstum bei negativer Vorjahresbasis korrigiert. Berechnung jetzt (neu − alt) / |alt|. Vorher kippte das Vorzeichen bei einer Gewinnwende: IMOS zeigte −269 % statt +269 %. Der Fundamentaldaten-Cache trägt eine Versionsnummer, damit alte Werte nicht bis zu 24 h weiterleben.
- Quartalsdaten aus SEC EDGAR für US-Emittenten, mit Meldetag. Erstbefüllung: 756 Titel.
- Übernahme-Ausschluss (Kriterium 18): Kandidaten mit Fusions- oder Angebotsverfahren werden verworfen, am Samstag wie am Mittwoch.
- Eingefrorene Positionen zählen nicht gegen Positionsplätze und Sektorlimit (siehe Schritt 8).
- Samstagslauf läuft um 02:23 UTC statt 08:00 UTC, um Verzögerungen durch GitHub-Spitzenlast zu vermeiden.
Die Positionsgröße wird so berechnet, dass maximal 1,5 % des Gesamtportfolios pro Trade riskiert werden. Das Verlustrisiko ist damit von vornherein begrenzt:
Positionsgröße = 1,5 % / 8 % = 18,75 % → gekappt auf maximal 15 % = 15.000 $
Maximales Risiko = 100.000 $ × 1,5 % = 1.500 $
Im defensiven Marktmodus (Marktampel gedämpft): max. Risiko = 0,75 % → kleinere Positionen. Zusätzlich: Position wird auf "verfügbares Cash / verbleibende Slots" gedeckelt.
Ranking der KaufkandidatenAlle Aktien, die alle Filter bestehen, werden nach einem gewichteten Score sortiert. Die bestplatzierten Kandidaten (Top-Picks) erhalten bevorzugt Orders. Der Report zeigt den Gesamtscore (0–100) und die gewichteten Anteile je Kriterium in der Spalte „Score". Der Score ist die Summe der Anteile, die Rangfolge bleibt gleich:
| Kriterium | Gewichtung | Bedeutung |
|---|---|---|
| RS-Score (Relative Stärke) | 35 % | Aktuelle Stärke gegenüber dem Gesamtmarkt |
| ΔRS über 4 Wochen | 20 % | Beschleunigung der relativen Stärke |
| Muster-Qualität | 20 % | VCP oder Launchpad, Qualitätsscore |
| Stop-Enge (Tightness) | 15 % | Je enger die Basis, desto kontrollierter |
| Branchen-Stärke | 10 % | Rang der Branche im Universum |
Schritt 17 — Orders platzieren
Das System unterscheidet bei der Orderplatzierung zwei Szenarien:
Fall A — Gewinnmitnahmen wurden vorgemerktWurden im selben Durchlauf Teilverkäufe aus bestehenden Positionen ausgelöst (Regel 3), wartet das System mit neuen Käufen bis zum nächsten Montag. Der Grund ist zweistufig: Erstens kann der Broker Markt-Verkaufsorders am Samstag gar nicht annehmen, da die Börse geschlossen ist — die Verkäufe werden deshalb nur vorgemerkt, nicht platziert. Zweitens steht der Verkaufserlös ohnehin erst nach Ausführung und Settlement zur Verfügung. Beides zusammen macht den Aufschub bis Montag notwendig.
Fall B — Direkte PlatzierungSind keine offenen Verkäufe vorhanden, werden Kauforders sofort beim Broker als sogenannte OTO-Orders (One-Triggers-Other) platziert. Eine OTO-Order besteht aus zwei verknüpften Teilen:
- Kauforder (Parent): Eine Stop-Limit-Kauforder wird gesetzt. Der Auslöser liegt 0,1 % über dem Pivot-Kurs. Das Limit liegt 5 % über dem Pivot — bei einem höheren Eröffnungskurs am Montag wird die Order automatisch verworfen.
- Schutzstop (Child): Sobald die Kauforder ausgeführt wurde, wird automatisch eine Stop-Loss-Verkaufsorder aktiviert. Diese schützt die Position nach unten.
Änderung 2026-09-06 — Widerstands-Check bei musterlosen Signalen: Ohne erkanntes VCP-/Launchpad-Muster war der Pivot bisher einfach der aktuelle Kurs — ein mehrfach getesteter, ungebrochener Widerstand direkt darüber blieb unsichtbar, und der Buy-Stop verlangte nur die Fortsetzung der laufenden Woche statt eines echten Ausbruchs. Das System prüft jetzt zusätzlich das wöchentliche Hoch der letzten 26 Wochen: Wurde ein Niveau mindestens zweimal innerhalb 1,5 % erreicht und liegt der aktuelle Kurs noch darunter, wird dieses Niveau als Pivot verwendet. Der Buy-Stop verlangt dann den tatsächlichen Ausbruch über den Widerstand statt nur die Fortsetzung der laufenden Woche. Der Titel wird dadurch nicht verworfen — löst der höhere Buy-Stop nicht aus, verfällt die Order wie jede andere unerfüllte auch. Gilt für den Samstags- und den Mid-Week-Pfad gleichermaßen.
Der initiale Stop-Loss wird je nach erkanntem Chartmuster unterschiedlich gesetzt:
- VCP: 2-fache ATR unter dem Ausbruchsniveau, maximal 15 % unter Entry
- Launchpad: Unteres Drittel der Konsolidierungsbox, gecappt auf das Wick-Tief der Trigger-Kerze
- Fallback (kein Muster erkannt): 2-fache ATR unter dem Einstiegskurs, mindestens 10 %
- Absolutes Sicherheitslimit: Niemals mehr als 20 % unter dem Einstiegskurs
Der Fallback war bis Juli 2026 ein fester Wert von 10 %. Eine Auswertung des
Tradetagebuchs zeigte, dass die nach zwei bis sechs Tagen ausgestoppten Positionen
eine Tages-ATR von im Median 7,4 % hatten — 10 % Stopabstand entsprachen dort nur
dem 1,2- bis 1,5-fachen der ATR und lagen damit innerhalb der normalen
Tagesschwankung. Da der Fallback wegen require_pattern = false für
nahezu jeden Trade greift, skaliert er nun wie der VCP-Pfad mit der Volatilität.
Die Untergrenze von 10 % verhindert, dass ruhige Titel einen engeren Stop als
zuvor bekommen. Weil die Positionsgröße risikobasiert berechnet wird
(Position = Maximalrisiko ÷ Stopabstand), bleibt das Risiko je Trade unverändert
bei 1,5 % — ein weiterer Stop führt automatisch zu einer kleineren Position.
Buy-Stop = 100,10 $ (0,1 % über Pivot). Max-Limit = 105 $ (5 % über Pivot).
Initialer Stop-Loss = 100 $ − (2 × 4 $) = 92 $ (8 % unter Pivot, innerhalb des 15%-Caps).
→ Wird die Aktie am Montag zwischen 100,10 $ und 105 $ gekauft, ist der maximale Verlust von vornherein auf ca. 8 % begrenzt.
Schritt 18 — Report und E-Mail
Zum Abschluss des Samstagdurchlaufs erzeugt das System einen vollständigen Wochenbericht:
- Vollständiger HTML-Report: Marktampel, Marktbreite, Sektorperformance, Trend- und Momentum-Analyse, Risiko- und Sentiment-Daten, alle Kaufsignale mit Orderparametern. Seit 2026-10-03 zusätzlich: Score-Spalte mit Teilbeiträgen, TTM-Umsatz zur Information, und in der Kopfzeile die geplanten Käufe mit Rest-Cash (Warnung, wenn das Cash nicht reicht).
- Kompakte E-Mail: Zeigt nur die Top-Picks als übersichtliche Karten mit Link zum vollständigen Report.
- Index-Seite: Eine Liste aller bisher generierten Wochenreports wird aktualisiert.
- Optionaler Excel-Export: Bei entsprechender Konfiguration wird eine Excel-Datei mit Leaders- und Branchendaten inklusive Chartmuster-Ergebnissen erzeugt.
Täglicher Depot-Alert (Montag bis Freitag)
Unabhängig vom Samstagslauf läuft werktags um 15:00 UTC ein Schutzlauf (daily_stock_alert.py). Er prüft den Bestand und handelt nur dort, wo ein Eingriff nötig ist:
- Stop-Orders: Jede Position braucht eine aktive Stop-Sell-Order. Fehlt sie, wird sie gemeldet. Ablaufende Orders werden verlängert.
- Gewinnmitnahme: Teilverkäufe nach den Regeln aus Schritt 11 laufen sofort, weil der Markt werktags offen ist.
- Journal: Filled Orders werden mit dem Trade Journal abgeglichen.
- Neu eingebuchte Käufe: Der Lauf vergleicht die Positionen mit dem letzten gespeicherten Stand (
docs/data/depot_snapshot.json). Eine Position, die seit dem letzten Lauf neu dazugekommen ist, erscheint in der Mail unter „✅ Neu im Depot" mit Stückzahl und Einstand. Das betrifft vor allem die Samstags-OTO-Orders, die am Montag gefüllt werden.
Der erste Lauf nach der Einführung legt nur den Stand an und meldet nichts. Ohne Eingriff und ohne neuen Kauf wird keine Mail verschickt. Im Testlauf wird der Stand nicht fortgeschrieben.
Änderung 2026-10-06: Neu-im-Depot-Meldung ergänzt. Vorher sah man einen Kauf erst im Freitagsreport.
Montagsablauf — Verzögerter Kaufabschluss
Der Montagsablauf besteht aus zwei unabhängigen Teilen, die nacheinander laufen: zuerst die am Samstag vorgemerkten Teilverkäufe, danach — falls vorhanden — die zurückgehaltenen Käufe (Fall A).
- Teil 1 — Vorgemerkte Teilverkäufe ausführen: Falls am Samstag Gewinnmitnahmen (Regel 3) vorgemerkt wurden, platziert das System sie jetzt bei offenem Markt als reguläre Markt-Verkaufsorders und schreibt das Ergebnis ins Trade Journal. Dieser Schritt läuft unabhängig davon, ob zusätzlich Käufe ausstehen.
- Teil 2 — Zurückgehaltene Käufe platzieren (nur Fall A): Die gespeicherte Liste der geplanten Kauforders wird geladen. Das System prüft, ob die zugehörigen Verkäufe (aus Teil 1 oder bereits vorher) tatsächlich gefüllt sind. Fehlt noch eine Bestätigung, bricht dieser Teil ab und wird beim nächsten Lauf erneut versucht.
- Das tatsächlich verfügbare Bargeld wird vom Broker abgerufen, nach Settlement der Verkäufe.
- Die Positionsgrößen werden auf Basis des real verfügbaren Cashs angepasst und die Kauforders werden als OTO-Orders an den Broker übermittelt.
- Die jeweilige Datei mit den vorgemerkten Verkäufen bzw. Kauforders wird nach erfolgreicher Ausführung gelöscht; fehlgeschlagene Einträge bleiben für den nächsten Lauf vorgemerkt.
Zusammenfassung: Identifizierte Schwächen
Die folgende Tabelle fasst alle im Dokument markierten Schwachstellen zusammen. Sie soll als Ausgangspunkt für Verbesserungen dienen.
| Bereich | Beschreibung der Schwäche | Empfehlung |
|---|---|---|
| Modussteuerung | Live-/Testmodus basiert allein auf dem Wochentag. Ein versehentlicher Samstagsstart sendet sofort echte Orders. | Manuelles Bestätigungsflag oder Dry-Run-Option einführen. |
| Universum-Aktualität | Weitgehend entschärft: Das Universum kommt tagesaktuell aus dem Nasdaq-Screener, die statische CSV ist nur noch Notnagel. Verbleibendes Risiko ist ein stiller Rückfall auf diese Altdatei — ein solcher Fall blieb schon einmal monatelang unbemerkt, weshalb der Rückfall jetzt deutlich protokolliert wird. | Den Rückfall auf die Altdatei aktiv melden statt nur protokollieren. |
| Datenladegeschwindigkeit | Sequenzielle 40er-Batches verlangsamen den Durchlauf bei großen Universen erheblich. | Parallele Downloads einführen, um die Laufzeit zu reduzieren. |
| Marktampel-Granularität | Es gibt nur zwei Zustände: grün und gedämpft. Kein harter Stopp bei extremen Markteinbrüchen. | Einen dritten Zustand "rot" mit vollständigem Kaufstopp einführen. |
| Gap-Down-Risiko | MACD-Bearish-Cross löst nur einen angehobenen Stop aus, keinen sofortigen Verkauf. Bei Wochenend-Lücken entsteht Slippage-Risiko. | Option für einen sofortigen Marktverkauf nach Bearish Cross ergänzen. |
| Trade-Journal | Ausstiegsgrund wird vereinfacht aus dem Ordertyp abgeleitet. Komplexe Szenarien werden unvollständig dokumentiert. | Detailliertere Exit-Klassifizierung implementieren. |
| Gewinnziele statisch | TV1 (+20 %) und TV2 (+40 %) sind feste Prozentwerte, unabhängig von der individuellen Volatilität der Aktie. | ATR-basierte Schwellen für Teilverkäufe einführen. |
| Regelpriorität | Bei gleichzeitigem Auftreten von Fast-Mover (Regel 2) und normalem Move (Regel 3) ist die Priorität nicht explizit dokumentiert. | Klare Rangfolge der Gewinnmitnahme-Regeln im Regelwerk festlegen. |
| Fundamentaldaten-Quelle | Alle Fundamentaldaten stammen aus nur einer Quelle. Fehler oder Ausfälle bleiben unerkannt. | Zweite Datenquelle als Fallback einbinden. Fehlende Daten protokollieren. |
| Performance-Dashboard | Kein fixer Benchmark-Startpunkt. Der Vergleich mit SPY ist abhängig vom ersten Trade-Datum. | Fixen Startzeitpunkt für den Benchmark-Vergleich definieren. |
| Cash-Berechnung | Wenn Gewinnmitnahmen und Neukäufe im gleichen Durchlauf stattfinden, kann die berechnete Positionsgröße zu klein ausfallen. | Erwartete Verkaufserlöse zum verfügbaren Cash hinzurechnen, bevor Positionsgrößen berechnet werden. |
| 5%-Gap-Limit | Bei einem Montagsgap von mehr als 5 % über den Pivot verfällt die Kauforder kommentarlos ohne Benachrichtigung. | Logging und optionale Benachrichtigung bei verworfenen Orders einführen. |
| Fehlende Fehleralarme | Bei fehlgeschlagenem E-Mail-Versand oder Cloudflare-Fehler gibt es keine Warnmeldung an den Betreiber. | Fehler-Logging mit automatischem Alert (E-Mail oder SMS) implementieren. |
| Mustererkennung | Algorithmische VCP-Erkennung ist fehleranfällig in seitwärtslaufenden oder hochvolatilen Märkten. Die Stillstands-Gegenprobe fängt inzwischen den wichtigsten Sonderfall ab (Aktien in laufender Barübernahme), sie bleibt aber eine reine Kursprüfung: Übernahmen, Bilanzsonderfälle oder anstehende Abspaltungen kennt das System nicht. | Unternehmensmeldungen als Datenquelle anbinden, um Sonderlagen direkt statt über ihre Kursspur zu erkennen. Manuelle Review-Möglichkeit für erkannte Muster. |