quant-lit進階課程 ▸ Lesson 7

進階課程 · Lesson 7

Lesson 7:樣本外驗證與 walk-forward

來源:Codex 製作

學習目標

1. 三段資料的不同職責

若看到 test 結果後再改策略,test 就已成為新的 validation。需要保留新的未見資料或進入真正 forward test。

2. 為何不能隨機 shuffle

金融資料有時間依賴、regime 與重疊標籤。隨機切割會讓未來 regime 的資訊進入訓練,也可能讓相鄰樣本同時落在 train 與 test。基本做法應保持時間順序;有重疊持有期時,還要考慮 purge/embargo,避免標籤期間交疊。

3. Walk-forward 設計

Expanding window:

Train 2016–2019 → Test 2020
Train 2016–2020 → Test 2021
Train 2016–2021 → Test 2022

Rolling window:

Train 2016–2019 → Test 2020
Train 2017–2020 → Test 2021
Train 2018–2021 → Test 2022

Expanding 保留所有歷史,估計較穩;rolling 更能適應 regime change,但樣本較少、參數可能更不穩定。

4. 每一 fold 必須重做什麼

在每個 train fold 內重新:

先用全資料標準化再切 fold,仍屬 leakage。

5. OOS 結果如何彙總

不要平均各 fold Sharpe。應串接所有 chronological OOS returns,再以同一頻率計算整體 CAGR、volatility、Sharpe 與 drawdown;同時分 fold 報告穩定性。

觀察:

6. Parameter sensitivity

穩健策略通常在一片參數區域有效,而不是只有單一尖峰。例如 SMA window 18–24 都合理,通常比只有 21 有效、20 與 22 皆失敗可信。這不是證明 alpha,而是排除對單點參數的脆弱依賴。

Python 實作

執行:

python .\code\walk_forward_demo.py

範例只在 train window 中選擇移動平均參數,再套用到下一段 test,最後串接 OOS returns。請比較 expanding 與 rolling 的參數穩定性。

通關判準

你應能標出每一個時間點屬於 train、validation 或 test,並證明所有 fit 與參數選擇只使用該 test 之前的資料。

上一課Lesson 6