聊天視窗

量化投資的智慧:從數據到策略 - 第 4 章

4. 模型構建與驗證:從回歸到深度學習

發布於 2026-02-21 17:36

# 4. 模型構建與驗證:從回歸到深度學習 在上一章中,我們已經把數據搬上桌,從技術指標、基本面、情緒、時間序列四大維度完成了特徵工程。此刻,投資信號的核心還未展露:模型。這一章將帶你走進「模型」的世界,從最簡單的線性回歸到複雜的 LSTM,並說明如何透過嚴謹的驗證流程,避免過度擬合、資訊洩漏以及偏差。 ## 4.1 為何選擇機器學習而非傳統策略? | 模型 | 優點 | 缺點 | 適用場景 | |------|------|------|-----------| | 回歸 (Linear, Ridge, Lasso) | 易於解釋、計算成本低 | 只能捕捉線性關係 | 基礎預測、因子選股 | | 樹模型 (Decision Tree, Random Forest, XGBoost) | 可捕捉非線性、特徵重要性直觀 | 易過擬合、對參數敏感 | 多因子組合、風險評估 | | 神經網路 (MLP, LSTM, Transformer) | 擅長高維時序、可學習複雜結構 | 需要大量數據、缺乏可解釋性 | 量化信號融合、跨市場預測 | > **關鍵提醒**:機器學習不是「萬靈藥」——所有模型都必須經過嚴格的資料分割與評估。先把「驗證」做對,再把「模型」做好。 ## 4.2 資料分割:時間序列的洗牌法 傳統的 80/20 隨機分割在時間序列中容易導致 **look‑ahead bias**。我們採用 **時間窗分割 (Walk‑Forward Validation)**,示例程式碼如下: python import pandas as pd from sklearn.model_selection import TimeSeriesSplit # 假設 df 已經包含了所有特徵與目標欄 X = df.drop(columns=['target']) y = df['target'] tscv = TimeSeriesSplit(n_splits=5, test_size=0.2) for train_idx, test_idx in tscv.split(X): X_train, X_test = X.iloc[train_idx], X.iloc[test_idx] y_train, y_test = y.iloc[train_idx], y.iloc[test_idx] # 這裡可插入模型訓練與評估 > **技巧**:在每一次分割時,**重新計算**特徵(尤其是滯後值、滑動統計),確保不「提前」知道未來資訊。 ## 4.3 特徵重要性與正則化 即使特徵數量已被前一章篩選,仍可能存在 **多重共線性**。兩種常見解決方案: 1. **L1 正則化(Lasso)**:可自動將不重要的特徵係數衰減為 0。 2. **PCA**:把高維特徵投影到較低維度,保留 95% 變異量。 python from sklearn.linear_model import LassoCV lasso = LassoCV(cv=5, random_state=42) lasso.fit(X_train, y_train) print('Selected features:', X_train.columns[lasso.coef_ != 0]) > **小結**:正則化不只是「防止過擬合」的工具,也是特徵篩選的重要手段。 ## 4.4 模型選擇:何時轉向深度學習? | 指標 | 典型數值 | 意義 | |------|-----------|------| | **資料量** | ≥ 5 萬筆 | 適合 LSTM、Transformer | | **特徵非線性程度** | 高 | LSTM 可捕捉序列非線性 | | **模型解釋性需求** | 低 | 可考慮神經網路 | | **計算成本** | 高 | 需 GPU 供應 | > **實務案例**:在日內交易信號中,**LSTM** 能有效捕捉價格的「短期慣性」;而在跨市場多因子預測中,**XGBoost** 仍是最常用且易於部署的選擇。 ## 4.5 交叉驗證 vs Walk‑Forward | 方法 | 適用情境 | 優點 | 缺點 | |------|----------|------|------| | k‑Fold CV | 靜態資料 | 速度快、統計穩定 | 會產生時間洩漏 | | Walk‑Forward | 時序資料 | 真實情境、避免洩漏 | 計算成本高、結果波動較大 | > **最佳實務**:對於金融時序,始終採用 **Walk‑Forward**,並在每個迴圈內重新 **標準化** 參數,確保模型不受訓練集統計特性影響。 ## 4.6 性能指標:不只 R² 與 MAE | 指標 | 適用場景 | 公式 | |------|----------|------| | **Sharpe Ratio** | 投資回報衡量 | \(SR = \frac{E[R_p - R_f]}{\sigma_p}\) | | **Sortino Ratio** | 下行風險 | \(SR_{sort} = \frac{E[R_p - R_f]}{\sigma_{down}}\) | | **Information Ratio** | 風險調整績效 | \(IR = \frac{E[R_p - R_b]}{\sigma_{active}}\) | | **Max Drawdown** | 風險暴露 | \(MDD = \max_{t} \frac{V_{peak} - V_{trough}}{V_{peak}}\) | > **提醒**:即使回測表現優異,也要以 **風險調整後的指標** 為主。投資不只是賺錢,更是風險管控。 ## 4.7 模型部署與監控 1. **序列化**:使用 `joblib` 或 `pickle` 存檔。 2. **API**:Flask 或 FastAPI 可將模型包裝為 RESTful 服務。 3. **監控**:實時追蹤 **RMSE、Sharpe Ratio**,一旦下滑 10% 以上即觸發回測。 python import joblib # 服務端 from fastapi import FastAPI import numpy as np app = FastAPI() model = joblib.load('model.pkl') @app.post('/predict') async def predict(features: dict): X = np.array(list(features.values())).reshape(1, -1) pred = model.predict(X) return {'prediction': pred.tolist()} > **最後一句**:模型的生命週期並非一次完成,而是 **不斷迭代、監控、回測** 的過程。唯有把這套流程寫進「程式碼」與「日誌」,才能在市場變動中保持競爭力。 --- > **章節收尾**:從簡單的回歸到複雜的深度學習,模型的選擇取決於資料量、特徵非線性、解釋性需求與運算成本。嚴謹的時間序列驗證、特徵正則化與風險調整績效指標,將為你量化投資的「決策力」提供堅實支撐。下一章,我們將聚焦於 **風險管理** 與 **執行成本**,讓策略從理論走向實盤。