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 與返回數組形狀,適用於多資產權重、多規則組合等。

  • 適用場景:不限於單標的擇時或簡單因子選股時的自定義邏輯。