核心資料流¶
這一頁描述的是一般回測與最佳化任務共享的核心流程。
總體流程¶
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.py 的 fetch_data()。
它會依商品對應的 source 選擇資料來源:
shioajidatabento- 部分舊路徑仍有
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(...)
作用¶
- 若
timeframe_minutes > 1,先做 resample - 將每一列轉成
OHLCV - 封裝成
DataFeed
第 4 層:策略初始化¶
run_backtest() 會做三件重要的策略準備:
- 解析
effective_strategy - 透過
STRATEGY_CLASS_MAP建立策略類別 - 從
param_manager依(ticker, timeframe, strategy_name)讀出該策略的獨立參數
這代表:
- 換策略不只換邏輯
- 還會換到另一份參數配置
第 5 層:BacktestBot 主循環¶
BacktestBot.run_backtest() 是核心執行器。
每根 bar 大致流程:
- 處理上一輪留下的 pending order
- 推進
IndicatorStore - 呼叫策略
on_ohlcv() - 由 broker 執行成交 / 平倉 / 反手 / 紀錄
第 6 層:Broker¶
FuturesBroker 負責:
- 現金
- 保證金
- 持倉方向與數量
- 已實現損益
- order history
分析層後續也是主要從 broker 的歷史資料抽統計。
第 7 層:State 與分析¶
回測完成後,BacktestBot.get_state() 會把多個子狀態打包:
strategyindicatorsbrokerdata_feed
接著 analyze_backtest_result(state) 會額外算出:
total_pnlwin_rateprofit_factortotal_tradesmax_drawdownmax_drawdown_pct
一般回測 vs 最佳化¶
一般回測¶
走 run_backtest(),結果放在 CacheManager。
最佳化¶
走 optimization_worker.run_one_combination(),本質上仍是:
- 準備
DataFeed - 建策略
- 跑
BacktestBot - 做分析
差別只在於:
- 最佳化會枚舉很多組參數
- 以多進程批次執行
- 結果存進
optimization_tasks.results
多區段回測是例外¶
multi_params / multi_period_backtest.py 目前與主流程有一些分叉,不完全沿用最新的 strategy-aware 架構。
因此若你要做重構或完整規格化,應把它視為需要補齊的一塊,而不是「完全一致的主流程延伸」。