6. Strategy 如何運行:時機、數據與參數

6.1. 1. 策略运行时机

策略的運行時機(何時、以何頻率運行)不由策略類內部保存,而由其所處的 Group 決定。Group 的 run_freqrun_timing 在將策略加入 Operator 時指定(如 add_strategy(stg, run_freq='d', run_timing='close'))。因此,同一策略實例放入不同 run_freq/run_timing 的 Group,就會在不同時刻被調用。

6.2. 2. 单步运行流程(细化)

當前時間步(step_index):

  1. 查 group_timing_table:取該步對應行,得到本步要運行的 Group 列表(取值爲 1 的列)。

  2. 對每個運行中的 Group

    • 對該 Group 內每個 Strategy:根據其 data_types、window_length 與當前步,從已準備的數據中切出本步的數據窗口,並調用 update_running_data_window 注入到該策略實例(按 dtype_id 寫入)。

    • 依次調用該 Group 內每個策略的 generate()(內部會調用無參的 realize()),收集各策略返回的信號,組成列表。

    • 用該 Group 的 blender 將列表中的信號混合成該組的一個合併信號。

  3. 若本步有多個 Group 運行:再按 group_merge_type 將各組合並信號合併爲一個(或分別輸出,依實現而定)。

  4. 該步的最終信號交給上層:回測時交給 Backtester 解析爲買賣並更新持倉,實盤時交給 Trader/Broker 生成訂單。

6.3. 3. Strategy 内部:realize() 与 get_pars / get_data

  • realize():無參數。策略邏輯只在此方法內實現;不通過參數接收數據或時間,而是通過 get_pars(name, …) 取可調參數、get_data(dtype_id) 取本步已注入的數據窗口。

  • 返回值:標量或一維數組,依策略基類而定(RuleIterator 常爲標量,FactorSorter 爲因子數組,GeneralStg 爲每資產一個信號)。同一段 realize() 在回測與實盤中複用,保證行爲一致。

6.4. 4. 可调参数(Parameter)

  • 定義:在策略類的 init 中通過 pars(Parameter 列表或字典)定義可調參數的名稱、類型、取值範圍等。

  • 運行前設置:通過 set_parameter(如 op.set_parameter(stg_id, pars=(...)))在運行前寫入當前要用的參數值。

  • 優化:Optimizer 在參數空間(由 Parameter 的 par_range 等確定)上採樣或搜索,每組參數 set 到 Operator 後執行一次回測,根據目標函數(如夏普比)彙總結果,從而找到較優參數組合。

6.5. 5. 三种策略基类的输入/输出差异

基類

輸入(get_data 等)

輸出(realize 返回值)

典型用途

RuleIterator

單資產或多資產數據窗口,按 dtype_id 取

標量(如 1/-1/0),同一規則迭代作用於所有資產

擇時、單規則多標的

FactorSorter

多資產截面(如每隻股票的因子值)

一維因子數組,引擎按排序與篩選規則選股

因子選股

GeneralStg

多資產、多 dtype 的窗口

一維信號數組(每資產一個目標倉位或比例)

通用多資產信號

6.6. 6. 小结

同一套“按步 → 準備數據 → 注入 → realize() → 混合”的流程,同時服務回測與實盤:策略不關心當前是回測還是實盤,只依賴 get_pars/get_data 與所屬 Group 的時機;運行層負責在不同模式下提供對應數據並處理輸出信號。更多實現細節見《使用教程》與 API 參考。