【架構解析】AutoML 三部曲:基礎調參、巨量降維與特徵煉金的戰略差異
在建構自動化量化交易系統時,我們面臨的挑戰會隨著「特徵數量」與「資料複雜度」急遽上升。為了應對不同的戰場,我們開發了三支核心的 AutoML 腳本:demo_automl_basic、demo_automl_massive 與 demo_automl_tsfresh。
這三者的核心差異在於:特徵是從哪裡來的?Optuna 在其中扮演什麼角色?
1. 基礎參數與開關控制 (demo_automl_basic.py)
定位:手動實驗室的「代工廠」
-
特徵來源:完全由人類(開發者)在程式碼中「手寫硬刻」出來的。
-
運作邏輯:我們預先寫好了
if use_sin_transform:或volume * weight的數學公式,Optuna 只是負責去嘗試 True/False 以及 0.1~5.0 之間的數值。 -
優勢:極度輕量、執行速度極快。模型產出的邏輯完全在人類的掌控與理解範圍內。
-
痛點與極限:機器無法發明您沒有寫進程式碼裡的公式。如果您的 Java 系統吐出了 100 個指標,您不可能手寫出所有的組合讓 Optuna 去測。
2. 巨量特徵的殘酷淘汰賽 (demo_automl_massive.py)
定位:高維度雜訊的「垃圾焚化爐」
-
特徵來源:由外部系統(如您的 Java
MLSectionData鋪平後的結果)大量灌入。特徵已經固定,但數量龐大(例如 1,200 維),其中包含大量市場底噪。 -
運作邏輯:Optuna 的主力武器變成了 L1 正規化 (
reg_alpha)。它的任務不是去發明公式,而是找出一個「最嚴格的篩選標準」,強迫 XGBoost 把對勝率沒有幫助的特徵權重無情地壓成0.0。 -
優勢:完美解決「維度災難」。跑完這支腳本,您會得到一份「倖存者排行榜」,可以直接拿這份名單回頭優化 Java 端的特徵收集邏輯,大幅降低系統 I/O 與推論延遲。
-
痛點與極限:它只能幫您「刪減」現有特徵,如果原本餵進去的特徵群中根本沒有包含「獲利密碼」,它也無法憑空生出來。
3. 時間序列煉金術士 (demo_automl_tsfresh.py)
定位:未知 Alpha 訊號的「發明家」
-
特徵來源:機器自己「無中生有」算出來的。您只需提供最原始的連續時間步長資料(例如連續 16 根 K 棒的某個基礎值)。
-
運作邏輯:這是一個兩階段的重型兵工廠。先由
tsfresh利用上千種數學公式(傅立葉轉換、小波轉換、偏度、極值)進行「暴力展開」,再由Optuna + XGBoost進行「試金淘汰」。 -
優勢:能夠抓出人類肉眼與直覺絕對無法發現的市場隱藏週期與非線性訊號。
-
痛點與極限:運算成本極高(需要極大的 CPU 算力與記憶體)。且產出的公式較為複雜,需要量化工程師人工解讀並決定是否要實作回低延遲的交易系統中。
📊 總結比較矩陣
| 比較維度 | demo_automl_basic (基礎調參) | demo_automl_massive (巨量降維) | demo_automl_tsfresh (時間序列煉金) |
|---|---|---|---|
| 輸入特徵數 | 極少 (通常 < 20) | 海量 (1,000 ~ 10,000+) | 基礎時間序列 (由套件擴增至千/萬維) |
| 特徵組合方式 | 人類手動寫死 if-else |
依賴樹狀模型的非線性切分 | tsfresh 自動套用數千種進階數學公式 |
| Optuna 主要任務 | 尋找最佳閾值與組合權重 | 尋找最佳 L1 正規化強度以砍除雜訊 | 結合自動發明的特徵,尋找極致勝率參數 |
| 輸出價值 (Output) | 最佳參數配方字典 (best_params) |
倖存特徵排行榜名單 (Feature Selection) | 人類意想不到的新指標公式 (Alpha Discovery) |
| 您的系統應用場景 | 對已經確定的幾個 T3 衍生指標進行權重微調。 | 將 Java 產出的 MLFrame 16 個 Section 鋪平後,剔除無用區塊。 |
探索連續 16 個 gapSize 是否存在未知的傅立葉低頻週期賺錢訊號。 |
💡 實戰架構結論
在頂級的量化研發流程中,這三者是線性結合的:
-
先用
tsfresh(腳本 3) 探索原始陣列資料,找到隱藏的數學公式。 -
將這些數學公式在 Java 端實作出來,連同原本的領域特徵,產生數千維的大型 Parquet 表格,丟入
massive(腳本 2) 進行降維與清洗。 -
最後,拿著清洗後僅存的數十個黃金特徵,放入
basic(腳本 1) 的邏輯中做最後的權重與閥值微調,並將這個輕量級的終極模型部署上線。
這份比較表能幫助團隊更清楚在不同的研發階段該掏出哪一種武器。您接下來會希望我們先將您的 Java MLFrame 轉換成 Parquet,然後用 demo_automl_massive.py 實際跑一次真實資料的「倖存者淘汰賽」嗎?