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