6. 回測引擎與性能
本章從使用與結果角度說明 qteasy 的回測引擎如何工作,以及性能與向量化的實現方式,便於用戶理解回測速度與正確性的來源。更底層的架構說明見《架構與設計》中的 回測引擎與性能(設計視角)。
6.1. 1. 回测引擎概览
回測入口與流程已在 回測概覽 與 如何運行回測 中說明:通過 qt.run(op, mode=1, ...) 進入回測模式,內部按 group_timing_table 的每個時間步運行策略、解析信號並模擬成交。
與“逐 bar 事件驅動”或“全時間軸一次性矩陣運算”不同,qteasy 採用 時間維順序步進、單步內標的維向量化 的方式:
時間維:按真實交易節奏順序執行每個時間步,以正確維護現金、持倉、交割隊列(如 T+1)等狀態。
標的維:在每個時間步內,對資產池中所有標的的買賣量、費用、持倉更新等做 向量化計算(NumPy 數組 + Numba 加速),單步效率高。
這樣既保證了與實盤一致的狀態與規則,又避免了純事件驅動下的逐筆循環帶來的性能損失。
6.2. 2. 性能与向量化
2.1 核心計算加速
回測與交易結果計算中的以下核心函數均使用 Numba JIT(@njit(nogil=True, cache=True))加速:
backtest_step:單步內對整批標的計算買賣量、費用、持倉與交割更新。
calculate_trade_results:交易結果與資金變動計算。
backtest_batch_steps:在 Numba 內按時間步循環調用
backtest_step,完成整段回測。backtest_flash_steps:優化模式下使用,僅保留最終資金與持倉以節省內存,同樣在 Numba 內完成批量步進。
信號混合(如多策略合併)在 blender 模塊中部分算子也使用 @njit 加速。因此,回測主體是 向量化 + Numba 實現的,而非純 Python 循環。
2.2 時間維順序與標的維向量化
維度 |
做法說明 |
|---|---|
時間維 |
順序步進,以正確維護 T+1、交割週期、MOQ 等狀態,與實盤一致。 |
標的維 |
單步內對所有標的做數組運算(如 |
優化模式 |
多組參數通過多進程並行回測;每組內部使用 |
首次運行或參數變化時,Numba 會編譯相關函數,可能帶來一次性的啓動延遲;後續同類型回測會複用緩存,速度更快。
2.3 與 VectorBT 的簡要對比
對比項 |
qteasy |
VectorBT |
|---|---|---|
時間維 |
順序步進,每步內向量化 |
全時間軸一次性矩陣運算,無顯式時間循環 |
狀態與約束 |
顯式維護 T+1、交割、MOQ 等,貼近實盤 |
多爲簡化資金曲線,不強調交割/MOQ |
適用場景 |
需要正確模擬 A 股規則、多策略合併、精細成本與交割時 |
海量參數組合快速篩選、研究向回測 |
qteasy 在保證狀態正確性與規則可配置的前提下,通過時間維順序 + 標的維向量化 + Numba 單步,兼顧速度;多組參數優化則通過多進程並行彌補“單次不能全矩陣廣播”的差異。
6.3. 3. 本目录与相关文档
回測結果與評價:3. 回測結果的結構、5. 回測結果評價與分析。
架構與實現細節:設計:回測引擎與性能、設計:設計初衷與獨特優勢。