6. 三种策略基类:RuleIterator、FactorSorter、GeneralStg

qteasy 中自定义策略通常继承自三种基类之一,按使用场景选择:RuleIterator 适用于择时或单规则迭代;FactorSorter 适用于因子选股;GeneralStg 适用于通用多资产或多规则信号。

6.1. 何时用哪种基类

  • RuleIterator:单标的或单规则、逐周期迭代(如均线择时、MACD 择时)。输入多为单标的或多标的的行情序列,输出为仓位或单一信号。

  • FactorSorter:多标的按某一因子排序,选取前 N 或后 N 名(选股)。需设置 max_sel_countsort_ascending 等。

  • GeneralStg:更通用的多资产、多规则或自定义输入输出形状的策略,当 RuleIterator/FactorSorter 无法满足时使用。

6.2. RuleIterator

  • 输入/输出:通常通过 get_data(dtype_id) 获取 OHLCV 等,在 realize() 中计算并返回一维信号(如目标仓位 0~1)。

  • 典型用法:均线金叉死叉、MACD 柱状图符号等。

  • 简短示例(逻辑示意):

from qteasy import RuleIterator, Parameter

class MyTiming(RuleIterator):
    def __init__(self):
        super().__init__(pars=[Parameter('period', 20)], ...)
    def realize(self):
        close = self.get_data('close')
        # 简单均线规则
        return (close[-1] > close[-self.get_pars()['period']:].mean()).astype(float)

多标的参数(必读)

  • 需要每股不同参数时:必须在 set_shares / Operator.set_shares 之后,用 字典 调用 update_par_values({代码: (参数元组), ...})(或通过 Operator.set_parameter(..., par_values={...}) 等效传入)。字典的键须与当前标的列表中的字符串 完全一致。框架据此建立按标的顺序排列的 per-share 参数;之后在 realize() 里用 get_pars() / update_par_values() 即可,由框架在 generate() 循环内对齐当前股票。

  • 若用元组 / 位置参数初始化:多标的时运行时 全体共享一套 策略参数(单一 _pars)。若本意是「每只股票独立一套参数」却未传字典,易产生静默语义偏差;刻意让所有股票共用一套初值并一起演化 时,用元组是合理选择。

  • default 键(不是 others:字典中除具体股票代码外,可额外提供键 "default",其值为一个参数元组;凡 未在字典中单独列出 的标的,初始化时都会使用该元组作为初值。之后各标的在回测/实盘中的参数仍可在 realize() 内通过 update_par_values 独立演进。实现上 没有 othersrest 等其它魔法键名,请勿使用未文档化的键。

6.3. FactorSorter

  • 输入/输出:获取因子数据(如收益率、波动率),在 realize() 中返回每个标的的因子值;基类按 sort_ascending 排序后取前 max_sel_count 个形成选股列表。

  • 属性:max_sel_count(选股数量)、sort_ascending(True 升序取最小,False 降序取最大)等。

6.4. GeneralStg

  • 输入/输出:更灵活,可自定义所需 DataType 与返回数组形状,适用于多资产权重、多规则组合等。

  • 适用场景:不限于单标的择时或简单因子选股时的自定义逻辑。