返回目錄
A
量化投資的智慧:從數據到策略 - 第 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()}
> **最後一句**:模型的生命週期並非一次完成,而是 **不斷迭代、監控、回測** 的過程。唯有把這套流程寫進「程式碼」與「日誌」,才能在市場變動中保持競爭力。
---
> **章節收尾**:從簡單的回歸到複雜的深度學習,模型的選擇取決於資料量、特徵非線性、解釋性需求與運算成本。嚴謹的時間序列驗證、特徵正則化與風險調整績效指標,將為你量化投資的「決策力」提供堅實支撐。下一章,我們將聚焦於 **風險管理** 與 **執行成本**,讓策略從理論走向實盤。