6. Drei Strategie-Basisklassen: RuleIterator, FactorSorter, GeneralStg

Benutzerdefinierte Strategien in qteasy erben normalerweise eine von drei Basisklassen: RuleIterator für Timing oder Einzelregeliteration; FactorSorter für die faktorbasierte Aktienauswahl; GeneralStg für allgemeine Multi-Asset- oder Multi-Regel-Signale.

6.1. Welche Basisklasse verwendet werden soll

  • RuleIterator: Einzelinstrument- oder Einzelregel-Iteration pro Periode (z. B. MA- oder MACD-Timing). Inputs sind in der Regel Preisreihen; Der Ausgang ist ein Positions- oder Skalarsignal.

  • FactorSorter: Ordnen Sie mehrere Instrumente nach einem Faktor und wählen Sie das obere oder untere N aus. Legen Sie max_sel_count, sort_ascending usw. fest.

  • GeneralStg: Flexiblere Multi-Asset-, Multi-Regel- oder benutzerdefinierte I/O-Formen, wenn „RuleIterator“/„FactorSorter“ nicht ausreichen.

6.2. RuleIterator

  • Eingabe/Ausgabe: Rufen Sie normalerweise OHLCV über „get_data(dtype_id)“ ab und geben Sie ein 1-D-Signal in „realize()“ zurück (z. B. Zielposition 0–1).

  • Typische Verwendung: MA-Crossovers, MACD-Histogrammzeichen usw.

  • Kurzes Beispiel (Logikskizze):

from qteasy import RuleIterator, Parameter

class MyTiming(RuleIterator):
    def __init__(self):
        super().__init__(pars=[Parameter('period', 20)], ...)
    def realize(self):
        close = self.get_data('close')
        # 简单均线规则
        return (close[-1] > close[-self.get_pars()['period']:].mean()).astype(float)

Multi-Instrumenten-Parameter (Pflichtlektüre)

  • Parameter pro Freigabe: Rufen Sie nach „set_shares“ / „Operator.set_shares“ „update_par_values({code: (param_tuple), …})“ mit einem dict auf (oder übergeben Sie „Operator.set_parameter(…, par_values={…})“). Die Schlüssel müssen genau mit den Freigabecodes in der aktuellen Liste übereinstimmen. Das Framework erstellt pro Freigabe Parameterarrays. Verwenden Sie in „realize()“ „get_pars()“ / „update_par_values()“ und das Framework richtet die aktuelle Freigabe in „generate()“ aus.

  • Tupel/Positionsinit: Bei mehreren Freigaben verwendet die Laufzeit einen gemeinsam genutzten Parametersatz (einzelne „_pars“). Wenn Sie Parameter pro Aktie vorgesehen, aber ein Diktat weggelassen haben, kann die Semantik stillschweigend abweichen. Tupel sind in Ordnung, wenn alle Anteile Anfangswerte teilen und sich gemeinsam weiterentwickeln sollten.

  • Standardschlüssel (nicht „andere“): Neben expliziten Freigabecodes kann ein „Standard“-Schlüssel ein Parametertupel enthalten, das für jede Freigabe verwendet wird, die im Diktat nicht aufgeführt ist. Parameter pro Freigabe können in „realize()“ über „update_par_values“ weiterhin unabhängig weiterentwickelt werden. Es gibt keinen magischen Schlüssel „Andere“ oder „Rest“ – verwenden Sie keine undokumentierten Schlüssel.

6.3. FactorSorter

  • Eingabe/Ausgabe: Faktordaten abrufen (Renditen, Volatilität usw.), Faktorwerte pro Aktie in „realize()“ zurückgeben; Die Basisklasse sortiert nach sort_ascending und wählt die besten max_sel_count Anteile aus.

  • Attribute: „max_sel_count“ (Auswahlanzahl), „sort_ascending“ (True = Kleinster zuerst, False = Größter zuerst) usw.

6.4. GeneralStg

  • Eingabe/Ausgabe: Flexible benutzerdefinierte „DataType“-Eingabe- und Ausgabe-Array-Formen; Multi-Asset-Gewichte, Multi-Regel-Mischungen usw.

  • Verwenden, wenn: Benutzerdefinierte Logik, die über die einfache Zeit- oder Faktorauswahl hinausgeht.