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 章。