返回目錄
A
量化投資的智慧:從數據到策略 - 第 2 章
第2章:模型構建與評估
發布於 2026-02-21 16:59
# 第2章:模型構建與評估
量化投資不僅需要高品質的資料與可解釋的特徵,還必須選擇合適的模型並嚴格評估其表現。這一章將帶領讀者從基礎統計模型到機器學習、甚至強化學習的多層面選擇,並說明如何在實務中避免過擬合、確保泛化能力。
## 2.1 模型選擇:從簡單到複雜
| 模型類型 | 特點 | 適用場景 |
|----------|------|----------|
| 線性迴歸 | 可解釋性高、訓練快速 | 低波動市場、線性關係明顯 |
| 隨機森林 | 抗噪音、可處理非線性 | 大量特徵、非線性關係 |
| XGBoost / LightGBM | 高效、可處理缺失值 | 競賽級別、特徵交互強 |
| LSTM / Transformer | 時序依賴、長期記憶 | 複雜時序預測、長序列 |
| DQN / PPO | 強化學習、行為策略 | 需要動態決策、環境互動 |
在實務上,常見的做法是先以線性迴歸或隨機森林做基線,再逐步引入更複雜的模型,以驗證模型是否真的帶來額外收益。
## 2.2 交叉驗證與正則化
過擬合是量化模型最常見的問題。以下兩個技術能有效降低風險:
1. **K-fold 交叉驗證**:將資料分成 K 份,每次用 K-1 份訓練、1 份驗證,最後取平均。
2. **正則化(L1 / L2)**:在損失函數中加入懲罰項,減少模型複雜度。
python
from sklearn.model_selection import KFold
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
import numpy as np
X, y = ... # 特徵與目標
kf = KFold(n_splits=5, shuffle=True, random_state=42)
rmse_list = []
for train_idx, val_idx in kf.split(X):
X_train, X_val = X[train_idx], X[val_idx]
y_train, y_val = y[train_idx], y[val_idx]
model = Ridge(alpha=1.0) # L2 正則化
model.fit(X_train, y_train)
pred = model.predict(X_val)
rmse = np.sqrt(mean_squared_error(y_val, pred))
rmse_list.append(rmse)
print('平均 RMSE:', np.mean(rmse_list))
## 2.3 模型評估指標
- **Sharpe Ratio**:衡量風險調整後的報酬。
- **Sortino Ratio**:只考慮下行風險。
- **Information Ratio**:相對基準指數的超額報酬。
- **Precision / Recall**:對於分類型交易訊號。
python
import pandas as pd
import numpy as np
def sharpe_ratio(returns, risk_free=0.0):
excess = returns - risk_free
return np.mean(excess) / np.std(excess) * np.sqrt(252)
# 假設 returns 是每日報酬率
returns = pd.Series([...])
print('Sharpe Ratio:', sharpe_ratio(returns))
## 2.4 實務案例:以 S&P 500 應用 LightGBM
以下示範如何用 LightGBM 預測下一日收盤價,並以報酬率作為回測指標。
python
import lightgbm as lgb
import pandas as pd
from sklearn.model_selection import train_test_split
# 讀取資料
data = pd.read_csv('sp500_features.csv')
X = data.drop(columns=['next_close'])
y = data['next_close']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
train_data = lgb.Dataset(X_train, label=y_train)
params = {
'objective': 'regression',
'metric': 'rmse',
'verbosity': -1,
'boosting_type': 'gbdt',
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9
}
model = lgb.train(params, train_data, num_boost_round=500)
pred = model.predict(X_test)
# 以預測值與實際值計算報酬率
returns = pd.Series((pred - X_test['prev_close']) / X_test['prev_close'])
print('策略 Sharpe Ratio:', sharpe_ratio(returns))
> **注意**:這裡的預測目標是「下一日收盤價」,並非直接預測買賣訊號。實際交易策略需要將預測值轉化為「買進」或「賣出」決策,並加上滑點、手續費等實務成本。
## 2.5 小結
本章說明了模型選擇、交叉驗證、正則化、評估指標與實務範例,為接下來的風險管理與實盤執行奠定基礎。記住:模型是工具,真正的挑戰在於如何將它們嵌入完整的交易流程,並在市場的波動中保持穩健。