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; useget_pars()for parameters andget_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.