跳轉到

核心資料流

這一頁描述的是一般回測與最佳化任務共享的核心流程

總體流程

flowchart LR
    A[外部資料來源] --> B[Quote Adapter]
    B --> C[pandas DataFrame]
    C --> D[DataFeed]
    D --> E[Strategy]
    E --> F[BacktestBot]
    F --> G[FuturesBroker]
    G --> H[state]
    H --> I[analyze_backtest_result]

第 1 層:Quote Adapter

主要入口在 app.pyfetch_data()

它會依商品對應的 source 選擇資料來源:

  • shioaji
  • databento
  • 部分舊路徑仍有 polygon

每個 adapter 最終都要回傳 pandas.DataFrame

第 2 層:DataFrame 標準化

fetch_data() 在取回資料後,還會做交易時段過濾:

  • 日盤
  • 夜盤
  • 全日盤
  • 跨日交易時段切片

因此對回測核心來說,收到的資料通常已經是:

  • 同一商品
  • 指定時間範圍
  • 指定交易時段
  • 已標準化欄位名稱

第 3 層:DataFrame -> DataFeed

src/datafeed/utils.py 會把 DataFrame 轉成 DataFeed

關鍵函式

  • aggregate_dataframe(df, timeframe_minutes)
  • data_feed_from_dataframe(...)
  • data_feed_from_dataframe_with_timeframe(...)

作用

  1. timeframe_minutes > 1,先做 resample
  2. 將每一列轉成 OHLCV
  3. 封裝成 DataFeed

第 4 層:策略初始化

run_backtest() 會做三件重要的策略準備:

  1. 解析 effective_strategy
  2. 透過 STRATEGY_CLASS_MAP 建立策略類別
  3. param_manager(ticker, timeframe, strategy_name) 讀出該策略的獨立參數

這代表:

  • 換策略不只換邏輯
  • 還會換到另一份參數配置

第 5 層:BacktestBot 主循環

BacktestBot.run_backtest() 是核心執行器。

每根 bar 大致流程:

  1. 處理上一輪留下的 pending order
  2. 推進 IndicatorStore
  3. 呼叫策略 on_ohlcv()
  4. 由 broker 執行成交 / 平倉 / 反手 / 紀錄

第 6 層:Broker

FuturesBroker 負責:

  • 現金
  • 保證金
  • 持倉方向與數量
  • 已實現損益
  • order history

分析層後續也是主要從 broker 的歷史資料抽統計。

第 7 層:State 與分析

回測完成後,BacktestBot.get_state() 會把多個子狀態打包:

  • strategy
  • indicators
  • broker
  • data_feed

接著 analyze_backtest_result(state) 會額外算出:

  • total_pnl
  • win_rate
  • profit_factor
  • total_trades
  • max_drawdown
  • max_drawdown_pct

一般回測 vs 最佳化

一般回測

run_backtest(),結果放在 CacheManager

最佳化

optimization_worker.run_one_combination(),本質上仍是:

  • 準備 DataFeed
  • 建策略
  • BacktestBot
  • 做分析

差別只在於:

  • 最佳化會枚舉很多組參數
  • 以多進程批次執行
  • 結果存進 optimization_tasks.results

多區段回測是例外

multi_params / multi_period_backtest.py 目前與主流程有一些分叉,不完全沿用最新的 strategy-aware 架構。
因此若你要做重構或完整規格化,應把它視為需要補齊的一塊,而不是「完全一致的主流程延伸」。