7. カスタム戦略: 定義から使用まで
カスタム戦略には以下が必要です: DataType inputs, a realize() implementation, then adding the instance to an Operator と宣言された調整可能なパラメーター。
7.1. 調整可能なパラメータの定義
Parameter (par_range, name, par_type, etc.) and pass pars=[...] in the strategy __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),
])
次に、最適化または手動セットアップで「set_parameter(stg_id, pars={'short_period': 8, 'long_period': 40})」を介して調整します。
7.2. 必要なデータを宣言する
DataType, window_length (lookback), use_latest_data_cycle, etc., so the framework prepares data before runs and realize() reads it via **get_data(dtype_id)**を宣言します。
7.3. Realize() を実装する
realize()takes no arguments; useget_pars()for parameters andget_data(dtype_id)データ用。戻り値: 戦略タイプごと (例: PT は 0 ~ 1 のスカラー/ベクトル位置を返します。PS は選択リストを返します)。
7.4. Operator に追加
add_strategy(MyStg(), run_freq=..., run_timing=...); run_freq/run_timing を使用してグループを決定します。
7.5. 完全なミニサンプル
以下は最小限のデュアル移動平均タイミングの例です (ロジック スケッチ、基本クラスと実際の API ごとの DataType ):
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')
その他の例は、チュートリアルの第 5 章から第 7 章にあります。