7. 自定義策略:從定義到使用
自定義策略需要:定義可調參數、聲明所需數據(DataType)、實現 realize(),再將策略實例加入 Operator。
7.1. 定義可調參數
使用 Parameter 聲明可調參數(par_range、name、par_type 等),在策略 __init__ 中通過 pars=[…] 傳入:
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(回溯長度)、use_latest_data_cycle 等,以便框架在運行前準備數據並在 realize() 中通過 get_data(dtype_id) 獲取。
7.3. 實現 realize()
realize() 無參數,內部通過 get_pars() 取當前參數、get_data(dtype_id) 取數據。
返回值:按策略類型約定(如 PT 爲 0~1 的倉位標量或向量,PS 爲選股列表等)。
7.4. 加入 Operator
使用 add_strategy(MyStg(), run_freq=…, run_timing=…) 將實例加入 Operator;run_freq/run_timing 決定歸入哪一 Group。
7.5. 完整小示例
以下爲一個最小可運行的雙均線擇時示例(邏輯示意,繼承基類與 DataType 以實際 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')
更多示例見《使用教程》第 5~7 章。