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. 定义所需数据

在策略中声明 DataTypewindow_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 章。