SeitenScreener · 22 / 29
Screener
Der Screener filtert ein Universum von über 10.000 US-Aktien anhand ihrer Finanzberichte und zeigt die Treffer in einer sortierbaren Tabelle. Bauen Sie einen Screen mit No-Code-Filterzeilen, oder schreiben Sie ein Python-Screener Script für Logik, die Filterzeilen nicht ausdrücken können. Ein gespeicherter Screen kann außerdem die Symbole für einen Forward-Bulk-Lauf oder einen Backtest auswählen.
Screens laufen nur auf Fundamentaldaten. Es gibt weder Live-Kurse noch Sektordaten, daher hat die Ergebnistabelle keine Standardspalten Market Cap / Last / Net Change — die SIC-Industry-Beschreibung ersetzt den Sektor. Marktkapitalisierung, Enterprise Value und der Aktienkurs zum Periodenende sind verfügbar als Felder in der Gruppe Valuation; Sie können also danach filtern oder sie als Spalten hinzufügen; sie spiegeln das Ende der jeweiligen Periode wider, nicht den heutigen Kurs. Krypto ist ausgeschlossen: Es hat keine Finanzberichte.
Sie müssen angemeldet sein — die Fundamentaldaten werden von den QuantCraft-Servern heruntergeladen.
Wo in der Oberfläche
| Wo | So gelangen Sie hin |
|---|---|
| Screener-Seite | Navigationsleiste → Screener (direkt nach Trade) |
| Screener-Script-Datei | QuantCraft-IDE → New File → Art Screener Script |
| Forward-Bulk-Ziel | AutoTrading oder QuantCloud → neuer Bulk-Lauf → Ziel Screener |
| Backtest-Symbole | QuantCraft-IDE → Run backtest → Symbol source → Screener |
| Agents | Der Test-Dialog eines Agents (Scheduler → Symbol source → Screener) und die Ziele von New Agent Bulk Run |
| Screener im eigenen Fenster | Screener-Seite → die Schaltfläche Pop out neben dem Seitentitel |
Die Seite hat zwei Karten: Filters (mit den Tabs No-Code und Python Script) und Results. Run sitzt in der Fußzeile der Filter neben Reset filters. Der Chevron auf der Karte Filters (Collapse filters) klappt sie zusammen und schafft den Ergebnissen mehr Platz.
Die Schaltfläche Pop out neben dem Titel öffnet den Screener in einem eigenen Fenster, sodass Sie einen Screen auf einem zweiten Monitor behalten können, während Sie in der IDE oder an einem Chart arbeiten. Das Fenster ist dieselbe Seite — Vorlagen und Screener Scripts werden mit dem Hauptfenster geteilt —, aber jedes Fenster behält eigene Filter und eigene Ergebnisse, und ein Screen läuft jeweils nur in einem Fenster. Schließen Sie es mit ← Return to main window; die App beendet sich nicht, solange ein Pop-out geöffnet ist.
Wenn QuantCraft AI ein Screener-Fenster steuert, sehen Sie „The AI is using this window“, und die Bedienelemente sind gesperrt, bis sie fertig ist.
Fundamentaldaten herunterladen
Bei der ersten Nutzung lädt der Screener das gesamte Fundamentaldaten-Korpus auf Ihren Rechner. Solange dieser Cache keine Daten enthält, werden die Karten Filters und Results durch eine Sperre mit der Schaltfläche Download Fundamentals ersetzt.
Der Download startet beim Öffnen der App, nicht beim Öffnen des Screeners — bis Sie die Seite erreichen, läuft er meist schon oder ist fertig. Ein Klick auf Run während eines Downloads startet nie einen zweiten.
- Ein kalter Erstlauf dauert Minuten. Jeder weitere Lauf dauert Sekunden.
- Das Lauf-Banner zeigt die Phase (
connecting → universe → download → convert → screen), einen Shard-Zähler wieshard 14 of 32, eine Gescannt/Gesamt-Anzahl und eine Schaltfläche Cancel. Ein warmer Lauf zeigt nur die Screen-Phase. - Das Banner zählt die verstrichene Zeit hoch und zeigt keine ETA — ein Lauf, dessen Dauer um Minuten schwankt, lässt sich nicht ehrlich vorhersagen. Wenn er fertig ist, erhalten Sie eine Zusammenfassung wie
12 matched in 3m 20s, gefolgt von· Fundamentals updated <time>. Wenn einige Symbole nicht abgerufen werden konnten, öffnet ein anklickbarer Link N unavailable die Liste. - Ein unterbrochener Download wird fortgesetzt, statt von vorn zu beginnen. Ein Abbruch mitten im Download ist unbedenklich: Der unfertige Teil wird beim nächsten Mal einfach neu abgerufen.
- Ein Download läuft weiter, auch wenn Sie die Seite verlassen.
Wie oft die Daten aktualisiert werden
| Wann | Was heruntergeladen wird |
|---|---|
| Ihr allererster Screen | Das gesamte Universum |
| Jeder spätere Screen am selben UTC-Tag | Nichts |
| Der erste Screen am nächsten Tag | Nur Symbole, deren neueste Einreichung älter als 62 Tage ist |
62 Tage entsprechen etwa einem Quartal, sodass ein Unternehmen erst dann erneut geprüft wird, wenn seine nächste Einreichung plausibel vorliegt.
Rechts im Lauf-Banner sehen Sie eine Zeile wie 10,384 symbols cached · 250 MB mit einer Schaltfläche Clear cache (ausgeblendet, solange ein Screen läuft, deaktiviert, solange die KI das Fenster nutzt). Das Löschen verlangt eine Bestätigung — Clear cache oder Keep it —, weil es einen minutenlangen Download verwirft. Der Cache sind regenerierbare Daten, die eine Deinstallation nicht entfernt, weshalb er hier sichtbar und freigebbar ist.
Nach einem App-Update, das das Cache-Format ändert, lädt der nächste Screen das gesamte Universum einmal neu (das geschah, als Per Share, Valuation und Scores hinzukamen).
Einen Screen bauen (No-Code)
Jede Filterzeile liest sich von links nach rechts: Period → Field → Filter type → Werteingabe(n). Mit + fügen Sie eine Zeile hinzu, mit − entfernen Sie eine. Die Schaltfläche + fragt, ob die neue Zeile eine Fundamentals- oder eine Industry-Zeile ist.
Zeilen werden mit AND verknüpft — ein Symbol muss jede aktivierte Zeile erfüllen. (Eine von der KI erstellte oder aus einer Datei importierte Vorlage kann stattdessen OR nutzen — „Any filter can match“; Load Preset zeigt, welche.)
Die Standard-Startzeile (Quarterly / Total Revenue / % Change / 1 period back / min 0 %) ist so gültig, daher funktioniert Run sofort. Bevor ein Lauf startet, wird jede aktivierte Zeile validiert; ist eine unvollständig, erhalten Sie einen Toast und einen Inline-Fehler in dieser Zeile, und der Lauf startet nicht — ein minutenlanger Scan soll nicht mit einer unbrauchbaren Abfrage beginnen.
Ein durchgerechnetes Beispiel: Quarterly / Total Revenue / % Change / periods back 3 / min 1 / max 3 findet Unternehmen, deren Umsatz in den letzten drei Quartalen um 1 % bis 3 % gewachsen ist.
Filtertypen
Jeder Filter liest den neuesten Wert, sofern nichts anderes angegeben ist.
| Filter | Parameter | Was er trifft |
|---|---|---|
| Range | min, max | Der neueste Wert liegt zwischen min und max, einschließlich. Eine Seite leer lassen für unbegrenzt. |
| Above | value | Der neueste Wert ist größer als value. |
| Below | value | Der neueste Wert ist kleiner als value. |
| Equals | value, tolerance | Der neueste Wert liegt innerhalb von ± tolerance um value. |
| Has a value | — | Der neueste Wert existiert. Nützlich mit Financials Extended. |
| % Change | periods back, min %, max % | Prozentuale Veränderung von n Perioden zurück bis zum neuesten Wert. Schlägt fehl, wenn der Startwert null ist. |
| Absolute Change | periods back, min, max | Rohdifferenz (neuester − n zurück). |
| QoQ Change % | min %, max % | Prozentuale Veränderung gegenüber dem Vorquartal. Nur quartalsweise — die Periodenauswahl ist gesperrt. |
| YoY Change % | min %, max % | Prozentuale Veränderung gegenüber dem Vorjahr. Der Versatz ist automatisch — 4 bei Quartalen, 1 bei Jahren. |
| CAGR % | periods back, min %, max % | Annualisierte Wachstumsrate. Beide Endpunkte müssen positiv sein. |
| Average over N | periods back, min, max | Mittelwert der letzten N Perioden. Jeder fehlende Wert im Fenster lässt das Symbol durchfallen. |
| Grew N in a row | periods back | Der Wert ist in jeder Periode des Fensters gestiegen. |
| Fell N in a row | periods back | Der Wert ist in jeder Periode des Fensters gefallen. |
| Above X for N | value, periods back | Jede der letzten N Perioden liegt über value. |
| Below X for N | value, periods back | Jede der letzten N Perioden liegt unter value. |
| Top N by field | n | Ranking-Filter — behält die besten n Symbole aus allem Gescannten. |
| Percentile rank ≥ | min % | Ranking-Filter — behält Symbole auf oder über diesem Perzentil aus allem Gescannten. |
Die beiden Ranking-Filter werden über die gesamte Grundgesamtheit entschieden, nicht pro Symbol, und stehen daher erst fest, nachdem jedes Symbol gescannt wurde. Ein Symbol ohne Wert für das gerankte Feld kann nie einen gewinnen.
Der größte nutzbare Wert für periods back ist 40.
Ein Feld wählen
Die Feldauswahl ist durchsuchbar und gruppiert die Felder in dieser Reihenfolge:
Ratios → Valuation → Scores → Per Share → Income Statement → Balance Sheet → Cash Flow → Financials Extended → Earnings History
Kennzahlen stehen zuerst, weil sie für einen Screener am relevantesten und bereits einheitennormiert sind. Werteingaben folgen der Einheit des Feldes — $, %, Tage, Aktien, Beträge je Aktie, Anzahlen oder eine bloße Zahl, je nachdem. Was jede Gruppe enthält, steht in der Fundamentaldaten-Feldreferenz.
- Alle Gruppen unterstützen quartalsweise und jährlich, außer Earnings History, die nur quartalsweise ist, und den CAGR-Feldern (
revenueCagr3y,revenueCagr5y, …), die nur jährlich sind und aus der Quartalsauswahl verschwinden. Ein Periodenwechsel leert das Feld, wenn es für die neue Periode nicht existiert. - „Periods back“ zählt Zeilen innerhalb der gewählten Periode. Quartalsweise + 3 heißt drei Quartale; jährlich + 3 heißt drei Geschäftsjahre. Beides wird nicht gemischt.
- Valuation-Multiplikatoren sind Trailing-Twelve-Month, auch in einer Quartalszeile.
- Felder von Financials Extended variieren je Symbol. Sie erscheinen in der Auswahl erst, wenn der Fundamentaldaten-Cache heruntergeladen wurde, und sind mit „varies by symbol“ gekennzeichnet. Ein Filter auf ein Feld, das ein Unternehmen nicht meldet, lässt dieses Unternehmen einfach durchfallen — kombinieren Sie ihn mit Has a value, wenn das wichtig ist.
- Periodenenden in der Zukunft werden ignoriert, „neuester“ ist also nie eine Periode, die noch nicht stattgefunden hat.
- Nicht filterbar: Company Info, Earnings Trend, Earnings Annual, TTM, die neueste (Stand heute) Bewertung, die Herkunft der Kennzahlen, die Komponenten der Piotroski-/Beneish-Scores sowie Text- oder Ja/Nein-Schlüssel wie
priceBasisoderapproximate. Sie haben entweder keine Berichtsperiode zum Vergleichen oder sind keine Zahlen.
Ausgemusterte Felder. Acht alte Financials Extended-Felder wurden zurückgezogen, weil es inzwischen bessere Versionen gibt: ebitda, ebitdaMargin, enterpriseValue, priceToEarnings, priceToBook, priceToSales, evToEbitda, evToRevenue. Ein gespeicherter Screen, der eines davon nutzte, verliert beim Laden diese Zeile (oder Spalte) — bauen Sie ihn aus der Gruppe Valuation neu auf, die diese Werte auf Trailing-Twelve-Month-Basis berechnet, sodass sich die Werte von den alten unterscheiden. (ratios.debtToEquity wurde einfach in ratios.debtToEquityRatio umbenannt und lädt weiterhin.)
Industry-Zeilen
Eine Industry-Zeile ersetzt die Feld-/Typ-/Wert-Steuerelemente durch eine Mehrfachauswahl von Branchen; ein Symbol besteht, wenn seine Branche zu den gewählten gehört. Mindestens eine Branche muss ausgewählt sein. Die Liste wird aus den tatsächlich heruntergeladenen Daten aufgebaut.
Python-Script-Modus
Wählen Sie Python Script, wenn ein Stapel AND-verknüpfter Vergleiche nicht reicht — Arithmetik über mehrere Felder, bedingte Logik oder Ihr eigener Ranking-Score.
Legen Sie die Datei in der QuantCraft-IDE über New File → Screener Script an; sie kommt mit funktionierendem Gerüst. Jede .py-Datei in Ihrem Arbeitsbereich, die ein filter() auf oberster Ebene definiert, qualifiziert sich ebenfalls. Der Tab Python Script des Screeners listet sie auf (mit Ordnerpfad beschriftet, damit Dateien in verschiedenen Ordnern unterscheidbar bleiben) und zeigt eine Vorschau der ausgewählten. Ihre übrigen Arbeitsbereich-Dateien werden mit dem Lauf mitgesendet, sodass Ihr Skript eigene Hilfsmodule importieren kann.
def filter(fundamentals, symbol):
q = fundamentals["incomeStatement"]["quarterly"]
if len(q) < 4:
return {"result": False}
latest, year_ago = q[-1]["totalRevenue"], q[-4]["totalRevenue"]
if latest is None or not year_ago:
return {"result": False}
growth = (latest - year_ago) / abs(year_ago)
return {"result": growth > 0.10, "value": growth}
def rank(value, symbol):
return min(max(value, 0), 1) * 100filter(fundamentals, symbol) wird einmal pro Ticker aufgerufen und muss ein Dict mit einem booleschen "result" zurückgeben. "value" ist optional und ist, was Sie ins Ranking mitnehmen wollen. Ein Skript, das eine Ausnahme auslöst, ein bloßes True zurückgibt oder ein Dict ohne booleschen "result" zurückgibt, zählt nur für diesen Ticker als kein Treffer — ein schlechter Ticker bricht den Lauf nie ab.
rank(value, symbol) ist optional und läuft nur für Ticker, die getroffen haben. Geben Sie eine echte Zahl zurück — jede Skala funktioniert (0-1, 1-10, 0-100), und höher bedeutet immer besser. Sie füllt die sortierbare Spalte Rank, die nur im Python-Script-Modus erscheint. Ein fehlschlagendes rank() hebt den Treffer der Zeile nicht auf; die Zeile behält ihren Treffer, ihr Rank zeigt — und wird zuletzt sortiert.
Das Argument symbol ist bei beiden Funktionen optional — die älteren Ein-Argument-Formen filter(fundamentals) und rank(value) funktionieren weiterhin.
Das Argument fundamentals
{
"symbol": "AAPL",
"entityName": "Apple Inc.",
"sicDescription": "ELECTRONIC COMPUTERS",
"balanceSheet": {"quarterly": [...], "yearly": [...]},
"incomeStatement": {"quarterly": [...], "yearly": [...]},
"cashFlow": {"quarterly": [...], "yearly": [...]},
"ratios": {"quarterly": [...], "yearly": [...]},
"perShare": {"quarterly": [...], "yearly": [...]},
"valuation": {"quarterly": [...], "yearly": [...]},
"scores": {"quarterly": [...], "yearly": [...]},
"financialsExtended": {"quarterly": [...], "yearly": [...]},
"earnings": {"history": [...]},
}Nichts „Stand Upload“ erreicht ein Skript: ttm, valuation.latest, metricsInputs und metricsHealth tragen keine Periode, und ein Screen vergleicht Perioden über Symbole hinweg. valuation-Multiplikatoren sind Trailing-Twelve-Month, auch in einer Quartalszeile, und ein None-Multiplikator neben einer vorzeichenbehafteten Rendite bedeutet einen nicht positiven Nenner, nicht fehlende Daten.
- Werte sind Zahlen oder
None— nie Strings wie"1234.00". Schlüssel, die keine Zahlen sind, fehlen ganz:beforeAfterMarket,reportDateundcurrencyinearnings.history, die AufschlüsselungenpiotroskiComponents/beneishComponentsinscoresund Text-Flags wiepriceBasis/approximateinvaluation. - Zeilen sind nach alt zu neu sortiert, also ist
rows[-1]die neueste Periode. Jede Zeile trägt eindate(ihr Periodenende). - Sie erhalten höchstens die 12 jüngsten Quartals- und 6 jüngsten Jahreszeilen, was begrenzt, wie weit ein Skript zurückblicken kann.
Alles, was Ihr Skript mit print() ausgibt, wird erfasst und von der Schaltfläche Output logs neben Run angezeigt — auch bei fehlgeschlagenen Läufen, damit Sie sehen, was unmittelbar vor einem Absturz ausgegeben wurde. Der Puffer fasst 200.000 Zeichen und verwirft darüber hinaus die älteste Ausgabe. Ein No-Code-Lauf leert die Logs des letzten Skript-Laufs nicht.
Run wird blockiert (mit Toast), wenn kein Skript ausgewählt ist oder die gewählte Datei kein filter() hat.
Ergebnisse
Jede Zeile zeigt einen Stern und eine Chart-Schaltfläche, Rank (nur Python-Script-Modus), Symbol, Company, Industry und As of, dazu eine Spalte pro Filterzeile mit dem getroffenen Wert (No-Code-Modus) sowie alle zusätzlichen Felder, die Sie hinzufügen.
„As of“ ist das jüngste für dieses Symbol verwendete Periodenende — die Geschäftsperiode, gegen die Ihre Filter tatsächlich ausgewertet wurden. Es ist nie eine zukünftige Periode.
| Bedienelement | Was es tut |
|---|---|
| Spaltenkopf | Sortiert die ganze Tabelle, nicht nur die Seite. Leere Werte stehen in beiden Richtungen immer am Ende. |
| Spaltenauswahl | Fügt Ergebnisspalten hinzu oder ordnet sie um. Führt den Screen nie erneut aus — ein wirklich neues Feld ruft nur diese Spalte für die angezeigten Zeilen ab. |
| Suchfeld | Filtert die bereits vorhandenen Zeilen. |
| Tradable only | Blendet Symbole aus, die nicht in den handelbaren Symbollisten Ihres Broker-Kontos stehen. |
| Stern | Fügt das Symbol einer Watchlist hinzu. Markierte Symbole erscheinen als Chips über der Tabelle und bleiben zwischen Sitzungen erhalten. |
| Symbol (Klick) | Öffnet einen Fundamentaldaten-Detaildialog pro Symbol, einschließlich eines Tabs Factor Exposure. |
| Chart-Schaltfläche | Öffnet einen Trade-Chart für dieses Symbol in einem Pop-out-Fenster (nur handelbare Symbole). |
Treffer erscheinen alle auf einmal, wenn der Lauf endet; die Tabelle bleibt also leer, solange ein Screen läuft — beobachten Sie den Fortschritt im Banner.
Ergebnisse werden nicht gespeichert. Das Neuladen der App leert die Tabelle absichtlich, denn ein veraltetes Ergebnis ist schlimmer als keines. Ihre Filter, Spalten, markierten Symbole, der aktive Tab und das ausgewählte Skript werden gemerkt.
Vorlagen
Eine Vorlage ist ein benannter Schnappschuss Ihrer Filterzeilen, ihrer Verknüpfung und Ihrer Ergebnisspalten.
| Schaltfläche | Was sie tut |
|---|---|
| Save Preset | Benennt und speichert den aktuellen Screen. Deaktiviert, bis Sie etwas gegenüber dem Standard geändert haben — allein Spalten auszuwählen zählt nicht. |
| Load Preset | Durchsucht gespeicherte Vorlagen und zeigt zu jeder die Beschreibung, ob ihre Filter mit AND („All filters must match“) oder OR („Any filter can match“) verknüpft sind, und eine Klartext-Zusammenfassung ihrer Filter. |
| Update {name} | Ersetzt die geladene Vorlage, statt eine neue anzulegen. Save Preset wird dazu, sobald Sie eine geladene Vorlage bearbeiten. |
| Reset filters | Löscht die Verknüpfung zur geladenen Vorlage, sodass die Schaltfläche wieder Save Preset heißt. |
In Load Preset können Sie außerdem:
- Delete preset — löscht sie nach einer Bestätigung.
- Export preset — speichert sie als JSON-Datei, die Sie teilen oder sichern können.
- Import preset — lädt eine Vorlage aus einer solchen JSON-Datei.
Einen Screen zur Symbolauswahl nutzen
Forward-Bulk-Läufe
Wählen Sie im Tab Targets des Dialogs New Run den Bereich Screener. Der Lauf handelt, was eine gespeicherte Vorlage oder ein Screener Script trifft, und screent alle Refresh interval (days) neu, solange er live ist. Include tickers with open positions hält eine Position in der Rotation, nachdem sie nicht mehr trifft. Screener-Ziele sind nur Aktien. Bei aktiviertem Use fundamentals erhält jedes Symbol im aktuellen Screen automatisch seine Fundamentaldaten, und die Menge folgt jedem neuen Screen.
Auf QuantCloud hält der Runner eine eigene Kopie der Fundamentaldaten, die der Screen braucht. Der erste Screener-Lauf auf einem neuen Runner lädt alles herunter, was eine Weile dauert; danach aktualisiert er nur einmal am Tag. Der Runner nutzt Ihre Anmeldung zum Herunterladen und kann sie nicht selbst erneuern, sodass bei einem mehrtägigen Lauf neue Screens nach Ablauf der Anmeldung weiter die bereits vorhandenen Daten verwenden.
| Feld | Hinweise |
|---|---|
| Screener source | Screener preset oder Python script. |
| Preset / Screener script | Welches ausgeführt wird. |
| Sort column / Direction | Wie Vorlagen-Treffer gerankt werden, bevor das Limit greift. |
| Rank direction | Bei Skripten — welches Ende des rank()-Scores des Skripts zuerst genommen wird. |
| Limit | Wie viele Symbole gehandelt werden. 0 nimmt jeden Treffer. |
| Refresh interval (days) | Wie oft der Screen erneut läuft, solange der Lauf live ist. Minimum und Standard ist 1 Tag. |
| Refresh time (ET) | Tageszeit jedes erneuten Screens. Standard 16:30 (eine halbe Stunde nach US-Börsenschluss). |
| Include tickers with open positions | Fügt Symbole hinzu, in denen Sie bereits eine Position halten, selbst wenn sie nicht mehr treffen, damit ein Live-Lauf nie stillschweigend eine Position fallen lässt. |
Warum 16:30 ET der Standard ist. Ein neues Universum zu übernehmen startet den Lauf neu, daher würde ein erneuter Screen um 11:00 den Live-Handel unterbrechen. Die Verankerung auf eine Zeit nach Börsenschluss sorgt dafür, dass die Aktualisierung stattfindet, während nichts gehandelt wird, und die neue Symbolliste vor Beginn der nächsten Sitzung bereitsteht.
- Die Zeit ist immer Marktzeit (ET), gleich in welcher Zeitzone Sie sind. Der Hilfetext unter dem Feld zeigt Ihr lokales Äquivalent, also ist
16:30 ET · 21:30 your timederselbe Zeitpunkt, nicht zwei Einstellungen. - Eine Änderung ist jederzeit erlaubt. Wählen Sie eine Zeit innerhalb der Sitzung 09:30–16:00 ET, erscheint unter dem Feld eine Warnung, dass der Neustart den Handel unterbricht, aber der Lauf startet trotzdem — die Entscheidung liegt bei Ihnen.
- Intervall und Zeit wirken zusammen.
1Tag bei16:30screent jeden Tag nach Börsenschluss neu;3Tage bei16:30screent alle drei Tage nach Börsenschluss neu. - Bleibt das Feld leer oder ist die Eingabe nicht
HH:MM, blockiert ein Inline-Fehler den Lauf.
Den vollständigen Dialog New Run finden Sie unter AutoTrading und QuantCloud.
Backtests
Setzen Sie im Tab Symbol & data des Dialogs Run backtest die Symbol source auf Screener. Statt eine feste Liste zu handeln, führt der Backtest Ihren Screen im Verlauf erneut aus und handelt, was an diesem Punkt der Simulation getroffen hat.
| Einstellung | Was sie tut |
|---|---|
| Screener source | Screener preset oder Python script. |
| Sort column / Direction | Wie Vorlagen-Treffer gerankt werden, bevor das Limit angewandt wird. |
| Rank direction | Bei Skripten — welches Ende Ihres rank()-Scores zuerst genommen wird. |
| Limit | Wie viele Symbole pro Rebalancing gehandelt werden. 0 nimmt jeden Treffer. |
| Refresh interval (days) | Wie oft der Screen erneut läuft, in simulierten Kalendertagen. Skripte erfordern 7 Tage oder mehr. |
| Keep tickers with an open position | Hält ein Symbol handelbar, nachdem es nicht mehr trifft, sodass eine offene Position weiter verwaltet werden kann. |
Fundamentaldaten folgen dem Screen. Bei aktiviertem Uses fundamentals erhält jedes gescreente Symbol seine Fundamentaldaten automatisch in on_bar / on_tick — Sie müssen sie nicht auswählen. Sie werden aus dem Cache des Screeners gelesen, ein Symbol, das der Screener bereits heruntergeladen hat, kostet also keinen zusätzlichen Download. Übergeben Sie beim Lesen immer symbol=symbol — siehe Fundamentaldaten.
„Keep tickers with an open position“ betrifft den Handel, nicht die Bewertung. Ist es an, erhält ein Symbol, das Sie noch halten, weiter Balken, nachdem es aus dem Screen gefallen ist, sodass Ihre Strategie es verlassen kann. Ist es aus, erhält das Symbol keine Callbacks mehr, und die Position bleibt einfach offen, bis der Backtest endet. In beiden Fällen wird die Position stets zum echten Kurs des Symbols bewertet, sodass Ihre Eigenkapitalkurve und die Kennzahlen korrekt sind.
on_init wird bei jedem Rebalancing erneut ausgelöst. Ist eine Screener-Symbolquelle aktiv, ruft die Engine bei jedem erneuten Screen wieder on_init(symbols=<ticker list>) auf. So kann Ihre Strategie auf ein neues Universum reagieren, ohne die Simulation neu zu starten. Wichtige Punkte:
- Zu Beginn des Laufs wird
on_initzweimal direkt hintereinander ausgelöst — der Standard-Setup-Aufruf (mitsymbols=None), unmittelbar gefolgt vom anfänglichen Screen-Ergebnis. - Jeder erneute Aufruf sieht den Zustand auf Modulebene, den der vorherige hinterlassen hat. Der Zustand wird zwischen Rebalancings nicht zurückgesetzt.
- Strategien, die
def on_init():(ohne Parameter) deklarieren, sind nicht betroffen — optionale Argumente werden per Namen zugeordnet, sodass das fehlendesymbolseinfach ignoriert wird.
Kalenderdaten für ein gescreentes Universum
Include calendar data funktioniert mit einer Screener-Symbolquelle. Die Kalender werden geladen, sobald der Screen für ein Rebalancing die vollständige Tickerliste aufgelöst hat — es gibt keine Abfrageverzögerung pro Tick. Gut zu wissen:
- Symbole, die der Screen trifft, aber ohne Kursbalken (außerhalb des Zeitraums oder vor Laufbeginn delistet), verursachen keine Kalenderanfrage.
- Ein breiter Screen trifft oft Symbole, die auf dem Server keinen Kalender haben — typischerweise kleinere oder weniger abgedeckte Ticker. Das Lauf-Log meldet die Anzahl, statt den Lauf scheitern zu lassen.
- Die Kalender werden bei jedem Rebalancing aktualisiert, um neu hinzugekommene Ticker abzudecken.
Die Ergebnisse erscheinen in einem Tab Screener Output neben Logs und zeigen jedes Rebalancing als einklappbares Datum. Klicken Sie auf +, um ein Datum aufzuklappen und die in diesem Fenster gehandelten Symbole zu sehen, oder nutzen Sie Expand all. Da der Screen vor dem ersten Balken aufgelöst wird, steht der gesamte Plan von Anfang an bereit.
Anforderungen, die Sie kennen sollten: Ein Screener-gesteuerter Backtest braucht ausdrückliche Start- und Enddaten; zusätzliche Zeitrahmen werden nicht unterstützt (get_bar gibt also None zurück — nutzen Sie für die Historie die bar.close[i]-Offsets des jeweiligen Tickers); und Debug Test kann keine Screener-Symbolquelle nutzen — wechseln Sie zum Debuggen zu Selected symbols. Siehe Backtests.
Point-in-time und Survivorship
Jedes Rebalancing sieht nur Berichte, die zu diesem Datum tatsächlich eingereicht waren. Ein Screen am 5. Mai 2021 sieht kein Quartal, das im April endete, aber erst im Juni veröffentlicht wurde. Die Ausnahme ist eine Periode ohne erfasstes Einreichungsdatum, die ab ihrem Periodenende zugelassen wird — selten, aber damit ist dort ein kleines Maß an Look-ahead möglich. Das macht das Ergebnis ehrlich, und es ist auch der Grund, warum die Auswahl eines Backtests nicht mit dem übereinstimmt, was Sie erhalten, wenn Sie dasselbe Datum mit den heutigen Daten screenen.
Zwei Dinge spiegeln weiterhin heute wider, nicht das simulierte Datum:
- Bei einem Feed des verbundenen Brokers werden Treffer auf Symbole gefiltert, die bei Ihrem Broker jetzt handelbar sind; ein seither delistetes Unternehmen fällt also selbst aus einem Rebalancing heraus, in dem es völlig handelbar war. Ein QuantCraft-Feed (B2) überspringt diese Prüfung.
- Das gecachte Universum enthält nur Unternehmen, die das Fundamentaldaten-Korpus noch führt; ein längst delistetes Unternehmen erscheint also gar nicht.
Die Point-in-time-Genauigkeit gilt für die Werte, die ein Screen liest, nicht dafür, welche Unternehmen darin existieren. Berücksichtigen Sie das bei Langfrist-Ergebnissen.
Ergebnisse interpretieren
Nicht genug Historie lässt ein Symbol durchfallen — es besteht nie stillschweigend. „Grew 8 in a row“ bei einem Unternehmen mit fünf Quartalen Daten schließt es aus. Ausschließen statt Bestehen sorgt dafür, dass eine Ergebnismenge nie zu viel meldet.
Weitere Fälle, in denen ein Symbol ausgeschlossen statt getroffen wird:
- % Change lässt sich nicht aus einem Startwert null berechnen.
- CAGR % braucht, dass beide Endpunkte positiv sind.
- Average over N schlägt fehl, wenn ein Wert im Fenster fehlt — Nullwerte werden nicht übersprungen.
- Ein Feld, das das Unternehmen nicht meldet, lässt dieses Unternehmen durchfallen, was vor allem bei Financials Extended zählt.
- Ranking-Filter weisen Symbole ohne Wert für das gerankte Feld ab.
Eine Besonderheit beim Ranking: Gleiche Werte teilen sich keinen Perzentil-Rang, daher können zwei identische Werte auf gegenüberliegenden Seiten einer Percentile rank ≥-Grenze landen.
Ist das Backend nicht erreichbar, erhalten Sie einen klaren Fehler statt eines langsamen stillen Fallbacks, und ein Lauf, der 90 Sekunden lang still bleibt, wird als Fehler gemeldet, statt zu hängen.
Siehe auch
- AutoTrading — Forward-Bulk-Läufe, einschließlich des Ziel-Bereichs Screener
- QuantCloud — Cloud-Runner mit Screener-gesteuerten Bulk-Jobs
- Backtests — einen Screen als Backtest-Symbolquelle nutzen
- Fundamentaldaten — Fundamentaldaten in Strategie-Callbacks lesen, und die Feldreferenz
- QuantCraft AI — die KI Screens für Sie bauen und ausführen lassen
- Fama-French-Faktoren — die Faktordaten hinter dem Tab Factor Exposure des Detaildialogs

