Dokumentation1.0 (latest)
SeitenEingabeparameter · 14 / 29

Eingabeparameter

Mit Eingabeparametern machen Sie Werte im Code Ihrer Strategie (zum Beispiel eine Rückblicklänge oder eine maximale Anzahl offener Long-Positionen) zu Reglern, die Sie in Ausführungsdialogen einstellen — ohne die Datei jedes Mal zu bearbeiten, wenn Sie eine neue Zahl ausprobieren möchten. Dieselbe params-Anbindung gilt für Run backtest (Backtests), Bulk forward (AutoTrading / QuantCloud) und die Algo-Parameter des Chart forward test. Test wird unter Code ausführen beschrieben; Mehrfachläufe (Sweeps) werden unter Optimierung behandelt. Bei einem einfachen Run werden Params nicht befüllt.

Diese Seite behandelt die beiden Hälften dieses Ablaufs:

  • params deklarieren in Ihrer Python-Datei
  • Diese Params mit den Ausführungsdialogen verbinden, damit Sie sie festlegen, speichern und optimieren können (siehe auch Ausführungsvorlagen (.qcs))

So funktioniert es auf einen Blick

  1. In Ihrer Strategiedatei importieren Sie ein spezielles params-Objekt und lesen Attribute davon (z. B. params.PERIOD).
  2. Die IDE durchsucht Ihren Code, um diese Namen zu finden, und listet sie im Ausführungsdialog auf (Test, Bulk Forward oder Chart Forward).
  3. Sie geben im Dialog für jeden Namen einen Typ und einen Wert ein (oder definieren beim Optimieren einen Sweep).
  4. Beim Start des Laufs befüllt die Engine params mit Ihren Werten, bevor Ihr Skript läuft, sodass die Werte schon beim Import Ihrer Datei verfügbar sind.

Eingaben werden für die Dialoge Run backtest, Bulk forward und Chart forward test befüllt. Für ein einfaches Run (/ws/run) werden sie nicht befüllt — verwenden Sie hasattr-Standardwerte, wenn dieselbe Datei auf beide Arten laufen soll. Siehe Strategie-Lebenszyklus, um zu erfahren, wann params für Callbacks sichtbar sind.


Params in Ihrer Strategie deklarieren

Fügen Sie einen einzigen Import hinzu und verweisen Sie auf jeden Parameternamen als Attribut von params:

from quantcraft.inputs import params PERIOD = params.PERIOD if hasattr(params, "PERIOD") else 14 MAX_OPEN_LONGS = params.MAX_OPEN_LONGS if hasattr(params, "MAX_OPEN_LONGS") else 3 USE_FILTER = params.USE_FILTER if hasattr(params, "USE_FILTER") else True LABEL = params.LABEL if hasattr(params, "LABEL") else "default"

Einige Regeln gelten:

  • Schreiben Sie es als from quantcraft.inputs import params. Der Erkennungs-Regex akzeptiert auch die älteren Formen from quantcraft.inputs_module import params und from ide.inputs_module import params, damit bestehende Skripte weiter funktionieren — siehe Referenz —, neuer Code sollte aber quantcraft.inputs verwenden. Es muss die Form from … import params sein: import quantcraft.inputs as inp wird nicht erkannt, sodass der Tab Script nicht erscheint.
  • Der Runner wendet die Dialogwerte an, bevor Ihr Einstiegsskript geladen wird, was für from quantcraft.inputs import params in der Strategiedatei ausreicht.
  • params ist ein einziges „lebendes“ Objekt. Jeder Lauf tauscht die Werte dahinter aus, sodass es immer die Eingaben dieses Laufs zeigt — auch in Hilfsmodulen, die es bei einem früheren Forward-Lauf importiert haben, und getrennt für Forward-Läufe, die gleichzeitig aktiv sind. Ein Lauf, der ohne Eingaben gestartet wird, sieht ein leeres params, niemals die Werte des vorherigen Laufs.
  • Jeder Parametername muss ein gültiger Python-Bezeichner sein (A–Z, a–z, 0–9, _, nicht mit einer Ziffer beginnend); alles andere wird übersprungen.
  • Jede Eingabe muss ein literales params.NAME-Token im Quelltext enthalten, damit die IDE sie erkennen kann. Der Client sucht per Regex nach params.<Bezeichner>; Namen, die nur über getattr(params, "NAME", default) referenziert werden, werden nicht erkannt und erscheinen nicht im Tab Script. getattr(params, "NAME", default) funktioniert zur Laufzeit durchaus — behalten Sie für die Erkennung lediglich ein literales params.NAME in derselben Zeile.
  • Sie können params.NAME überall in der Datei verwenden — auf oberster Ebene, in on_init, in on_bar usw. Jede eindeutige Referenz wird zu einer Eingabe, nach der der Dialog fragt.
  • Im Modul selbst gibt es kein Schema — die Namen, auf die Sie verweisen, sind das Schema.

Vermeiden Sie (das Formular listet den Parameter nicht auf):

MA_PERIOD = getattr(params, "MA_PERIOD", 24) # no params.MA_PERIOD token PERIOD = 14 # no params reference

Gängige Muster:

def on_init(): global lookback lookback = int(params.PERIOD) def on_bar(bar_index, bar, fundamentals=None, symbol=None): if bar.bars_back < lookback: return ...

Tipp: Lesen Sie den Wert einmal in eine lokale/globale Variable, damit Sie nicht bei jedem Balken Attributzugriffe bezahlen.


Den Test-/Backtest-Dialog verbinden

Öffnen Sie den Dialog Test über die Editor-Symbolleiste (die Schaltfläche Test). Deklariert Ihre Datei params.NAME-Eingaben, erscheint ein Tab Script mit Parameterzeilen und Optimize. Die IDE hat Ihre aktive Datei bereits nach params.NAME-Referenzen durchsucht, sodass jeder verwendete Parameter als Zeile erscheint.

Für jede Zeile legen Sie fest:

SpalteWas Sie eingeben
ParameterDer Name (schreibgeschützt — stammt aus Ihrem Code).
TypeEiner von int, float, str, bool (die Aliase integer, number, boolean werden in der Übertragung ebenfalls akzeptiert).
ValueDer für den Lauf zu verwendende Wert.

Hinweise zur Wahl des Type:

  • int / integer — ganze Zahlen (z. B. 14); Tausendertrennzeichen sind in Ordnung (1,000 → 1000).
  • float / number — Dezimalzahlen (z. B. 0.5, 1e-3); Kommas in Zahlen werden entfernt.
  • bool / boolean — true / false, yes / no, y / n, on / off und 1 / 0 (in beliebiger Groß-/Kleinschreibung). Alles andere stoppt den Lauf mit invalid boolean: …. Der Dialog bietet True/False an.
  • str — freier Text, unverändert übernommen (ohne umgebende Leerzeichen).

Beim Start des Backtests bündelt der Dialog Ihre Zeilen und sendet sie an die Engine. Die Engine setzt die Werte auf params, bevor Ihr on_init() läuft, sodass:

from quantcraft.inputs import params PERIOD = params.PERIOD # <- already filled by the time this line executes

Hat ein Parametername keine Zeile im Dialog (Sie haben den Eintrag entfernt, oder Ihre Datei verweist auf einen brandneuen Namen, den Sie noch nicht gesetzt haben), besitzt params dieses Attribut nicht, und ein reiner Lesezugriff auf params.NAME löst AttributeError aus. Fügen Sie die Zeile im Dialog hinzu und führen Sie erneut aus — oder verwenden Sie das oben gezeigte Muster hasattr + else-Standardwert (das weiterhin das Token params.NAME für die Erkennung enthält).

Ihre Dialogwerte werden zwischen Läufen gemerkt, sodass Sie sie nicht jedes Mal neu eingeben müssen. Speichern und laden Sie vollständige Parametersätze mit den Ausführungsvorlagen (.qcs).


Parameter optimieren

Aktivieren Sie im Tab Script die Option Optimize, um Ihre Strategie viele Male mit verschiedenen Parameterkombinationen auszuführen. Wählen Sie Brute force oder Genetic:

Brute Force

Für jede Parameterzeile fügt der Dialog, wo sinnvoll, die Spalten Step und Max hinzu:

  • int / float — definieren ein diskretes Raster: Startwert → Schritt → Maximum.
  • bool — sowohl true als auch false werden ausprobiert.
  • str — bleibt fest (String-Parameter bilden kein Raster).

Die Engine führt jede Kombination dieser diskreten Werte aus und meldet jeden Lauf separat in der Ansicht Test Results.

Nützlich für kleine Raster (eine Handvoll Parameter mit je wenigen Werten). Kombinationen explodieren schnell — halten Sie den Suchraum überschaubar.

Genetisch

Für größere Suchräume wechseln Sie zu Genetic, damit eine evolutionäre Suche gute Kombinationen findet, ohne jede Zelle auszuprobieren:

  • Population size — Anzahl der pro Generation ausgewerteten Parameterkombinationen.
  • Generations — wie viele Generationen laufen (jede ist eine vollständige Population von Backtests).
  • Elitism — die besten Individuen werden unverändert in die nächste Generation übernommen.
  • Crossover rate (0–1) — Wahrscheinlichkeit, dass zwei Eltern ein gemischtes Kind erzeugen.
  • Mutation rate (0–1) — Wahrscheinlichkeit, dass ein Gen auf einen anderen Wert springt.
  • Fitness metric — welche Kennzahl optimiert werden soll (Sharpe, Sortino, Gesamtrendite usw.).
  • Random seed (optional) — Reproduzierbarkeit von Population und Operatoren.

Beide Modi zeigen den Live-Fortschritt im Ausgabebereich (ein Fortschrittsbalken in der Kopfzeile) und eine Schaltfläche Stop, mit der Sie einen langen Lauf beenden können.

Ist die Optimierung abgeschlossen, zeigt die Ansicht Test Results die Läufe sortiert nach Ihrer Fitness-Kennzahl, und Sie können in jeden einzelnen hineinzoomen.


Tipps

  • Namen werden aus Ihrer Datei erkannt: Erscheint eine Zeile nicht, prüfen Sie Ihre params.NAME-Referenzen und ob Sie params aus quantcraft.inputs importieren (die älteren Pfade quantcraft.inputs_module und ide.inputs_module werden für bestehende Skripte ebenfalls erkannt).

  • Halten Sie Namen in UPPER_SNAKE_CASE — per Konvention lesen sie sich in Ihrem Code wie Konstanten.

  • Wählen Sie im Dialog sinnvolle Typen, damit die Umwandlung das tut, was Sie erwarten (setzen Sie z. B. nicht int für einen Wert wie 0.5).

  • Booleans sind nicht von der Groß-/Kleinschreibung abhängig — True, true, 1, yes werden alle als wahr ausgewertet.

  • Nutzen Sie Optimize für Parametersuchen, nicht Editor-Skripte: Brute Force ist erschöpfend, Genetic ist für größere Räume.

  • Ein einfaches Run befüllt keine Params: Wenn Sie auf Run klicken, wird params nicht befüllt. Verwenden Sie hasattr-Standardwerte (mit einem literalen params.NAME-Token), wenn dieselbe Datei sowohl für Run als auch für Test funktionieren soll:

    from quantcraft.inputs import params PERIOD = params.PERIOD if hasattr(params, "PERIOD") else 14
  • Forward-Läufe verwenden dieselben Erkennungsregeln — die Dialoge Bulk Forward und Chart Forward suchen params.NAME auf dieselbe Weise wie der Backtest-Dialog.

Eingabeparameter — Dokumentation (1.0 (latest)) | QuantCraft