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 等狀態,與實盤一致。

標的維

單步內對所有標的做數組運算(如 op_signalown_amounts 等爲 1D 數組),實現向量化。

優化模式

多組參數通過多進程並行回測;每組內部使用 backtest_flash_steps 等高效路徑,減少內存與計算。

首次運行或參數變化時,Numba 會編譯相關函數,可能帶來一次性的啓動延遲;後續同類型回測會複用緩存,速度更快。

2.3 與 VectorBT 的簡要對比

對比項

qteasy

VectorBT

時間維

順序步進,每步內向量化

全時間軸一次性矩陣運算,無顯式時間循環

狀態與約束

顯式維護 T+1、交割、MOQ 等,貼近實盤

多爲簡化資金曲線,不強調交割/MOQ

適用場景

需要正確模擬 A 股規則、多策略合併、精細成本與交割時

海量參數組合快速篩選、研究向回測

qteasy 在保證狀態正確性與規則可配置的前提下,通過時間維順序 + 標的維向量化 + Numba 單步,兼顧速度;多組參數優化則通過多進程並行彌補“單次不能全矩陣廣播”的差異。

6.3. 3. 本目录与相关文档