6. Strategy 如何運行:時機、數據與參數
6.1. 1. 策略运行时机
策略的運行時機(何時、以何頻率運行)不由策略類內部保存,而由其所處的 Group 決定。Group 的 run_freq、run_timing 在將策略加入 Operator 時指定(如 add_strategy(stg, run_freq='d', run_timing='close'))。因此,同一策略實例放入不同 run_freq/run_timing 的 Group,就會在不同時刻被調用。
6.2. 2. 单步运行流程(细化)
對當前時間步(step_index):
查 group_timing_table:取該步對應行,得到本步要運行的 Group 列表(取值爲 1 的列)。
對每個運行中的 Group:
對該 Group 內每個 Strategy:根據其 data_types、window_length 與當前步,從已準備的數據中切出本步的數據窗口,並調用 update_running_data_window 注入到該策略實例(按 dtype_id 寫入)。
依次調用該 Group 內每個策略的 generate()(內部會調用無參的 realize()),收集各策略返回的信號,組成列表。
用該 Group 的 blender 將列表中的信號混合成該組的一個合併信號。
若本步有多個 Group 運行:再按 group_merge_type 將各組合並信號合併爲一個(或分別輸出,依實現而定)。
該步的最終信號交給上層:回測時交給 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 參考。