8. エンジンとパフォーマンスのバックテスト (設計の観点)

この章では、より深い理解が必要な読者や技術的な選択を行っている読者向けに、アーキテクチャと実装の観点から、qteasy のバックテスト エンジンがベクトル化と Numba をどのように使用するか、VectorBT などのフレームワークとどのように異なるかについて説明します。使用レベルの説明については、「6. 使用レベルの説明」を参照してください。バックテスト エンジンとパフォーマンス](…/back_testing/6.%20backtest_engine_and_performance.md)「バックテストと取引戦略の評価」。

8.1. 1. 回测引擎在整体中的位置

バックテスト モード (mode=1) のワークフローは、バックテスト、ライブ トレーディング、および最適化 にまとめられています。履歴データの準備 → Backtester の構築 → group_timing_table に従って Operator を段階的に実行してシグナルを生成 → シグナルを解析して約定をシミュレート → 評価して出力します。このうち、「信号の解析とフィルのシミュレート」は backtest モジュールの Numba 関数によって処理され、「時間次元に沿ったシーケンシャル、インストゥルメント次元に沿ったベクトル化」を実現します。

8.2. 2. Numba 使用点与向量化结构

2.1 コア機能

qteasy/backtest.py:

  • バックテストステップ: @njit(nogil=True, cache=True)。単一のステップ内で、シグナルと現在のポジション、現金、決済キューに基づいて、売買数量、手数料、ポジションの更新、決済キューの更新を計算します。機器のバッチ全体に対して配列演算を実行します。

  • calculate_trade_results: @njit、取引結果と現金変動の計算に使用されます。

  • backtest_batch_steps: @njit(nogil=True, cache=True)。 Numba 内で signal_count (タイム ステップ数) ごとにループします。各ステップで backtest_step を呼び出してバックテスト セグメント全体を完了し、「時間次元に沿って順次、機器次元に沿ってベクトル化」を実現します。

  • backtest_flash_steps: @njit(nogil=True, cache=True)backtest_batch_steps と似ていますが、複数のパラメーター セットをバックテストする際の最適化フェーズ中にメモリを節約するために、中間のキャッシュとポジション シリーズは保持されず、最終状態のみが保持されます。

qteasy/blender.py では、信号ブレンディングに使用される一部の演算子 (op_sumop_floor など) は加速のために @njit も使用します。

2.2 機器次元に沿った時間次元の順序付けとベクトル化

  • 時間ディメンションは連続的である必要があります: 決済キュー、T+1、MOQ などの状態があるため、次の取引は現在のポジションと決済状態に依存するため、時間軸に沿って完全に並列化したり、一度に行列化したりすることはできません。

  • 商品次元のベクトル化: 各タイム ステップ内で、すべての商品のシグナル、ポジション、売買数量、手数料などに対して NumPy 配列と Numba 内のインライン操作を使用し、Python レベルのループを回避します。

したがって、単一のバックテストは、1 つの Numba レイヤー内のタイムステップ ループ + 各ステップ内のベクトル化された計算 として理解できます。

2.3 最適化段階

qteasy/optimization.py では、複数のパラメーター セットがマルチプロセッシングを介してバックテストを並行して実行します (例: ProcessPoolExecutor)。各セット内では、backtest_flash_steps などのパスを使用し、最終的なキャッシュ/ポジションのみを保持してメモリ使用量を削減し、スループットを向上させます。

8.3. 3. 与 VectorBT 的架构差异

寸法

qteasy

VectorBT

時間の次元

順次ステップ (for ループ ステップ)、各ステップ内でベクトル化

明示的なタイム ループを使用しない、タイムライン全体にわたるワンショット マトリックス演算

資産の次元

各ステップで、すべてのアセット (1D 配列) に対して配列操作を実行します。

楽器と時間が一緒に放送に参加します。複数の戦略/複数のパラメータ セットを一度にブロードキャストできます。

コアの加速

backtest_stepbacktest_batch_stepsbacktest_flash_steps などは @njit です。シグナル解析、決済/配送キューなどにもNumbaが使用されます。

NumPy + Numba、純粋な配列演算として表現される戦略

状態と制約

現金、ポジション、決済/配送キュー (T+1 など) を明示的に維持します。状態は次の取引に依存するため、時間ディメンションは連続的である必要があります。

T+1/決済/MOQ を重視せず、ほとんどが単純化された資本曲線なので、完全なマトリックスを簡単に構築できます。

結論: qteasy には「ベクトル化/Numba が欠けている」わけではありません。むしろ、状態の正確性 (T+1、決済、MOQ、複数戦略のマージなど) を保証することを前提として、「時間順 + 手段次元のベクトル化 + ステップごとの Numba」という妥協案を選択しました。それと VectorBT の「フルマトリックス ブロードキャスト」には、それぞれ独自の適用可能なシナリオがあります (qteasy は厳格なルールとライブ取引との一貫性を重視する一方、VectorBT は大規模なパラメーター グリッド上の迅速なスクリーニングを重視します)。

8.4. 4. 相关文档