7. Benutzerdefinierte Strategien: Von der Definition bis zur Anwendung

Eine benutzerdefinierte Strategie erfordert: einstellbare Parameter, deklarierte „DataType“-Eingaben, eine „realize()“-Implementierung und dann das Hinzufügen der Instanz zu einem „Operator“.

7.1. Definieren Sie einstellbare Parameter

Deklarieren Sie einstellbare Parameter mit Parameter (par_range, name, par_type usw.) und übergeben Sie pars=[...] in der Strategie __init__:

from qteasy import BaseStrategy, Parameter

class MyStg(BaseStrategy):
    def __init__(self):
        super().__init__(pars=[
            Parameter('short_period', (5, 20), 10),
            Parameter('long_period', (20, 60), 30),
        ])

Stellen Sie dann über „set_parameter(stg_id, pars={'short_period': 8, 'long_period': 40})“ die Optimierung oder die manuelle Einrichtung ein.

7.2. Erforderliche Daten deklarieren

Deklarieren Sie DataType, window_length (Lookback), use_latest_data_cycle usw., damit das Framework Daten vor der Ausführung vorbereitet und realize() sie über get_data(dtype_id) liest.

7.3. Implementieren Sie real()

  • realize() takes no arguments; use get_pars() for parameters and get_data(dtype_id) für Daten.

  • Rückgabewert: Pro Strategietyp (z. B. PT gibt Skalar-/Vektorpositionen in 0–1 zurück; PS gibt eine Auswahlliste zurück).

7.4. Zu Operator hinzufügen

Verwenden Sie add_strategy(MyStg(), run_freq=..., run_timing=...); run_freq/run_timing, um die Gruppe zu bestimmen.

7.5. Vollständiges Mini-Beispiel

Nachfolgend finden Sie ein minimales Dual-Moving-Average-Timing-Beispiel (Logikskizze; Basisklasse und „DataType“ pro tatsächlicher API):

import qteasy as qt
from qteasy import RuleIterator, Parameter

class DMA(RuleIterator):
    def __init__(self):
        super().__init__(pars=[
            Parameter('short_period', (5, 20), 10),
            Parameter('long_period', (20, 60), 30),
        ])
    def realize(self):
        close = self.get_data('close')
        p = self.get_pars()
        short = close[-p['short_period']:].mean()
        long_ = close[-p['long_period']:].mean()
        return 1.0 if short > long_ else 0.0

op = qt.Operator(signal_type='PT', run_freq='d')
op.add_strategy(DMA(), run_freq='d', run_timing='open')

Weitere Beispiele finden Sie in den Tutorials, Kapitel 5–7.