聊天視窗

量化投資的智慧:從數據到策略 - 第 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 小結 本章說明了模型選擇、交叉驗證、正則化、評估指標與實務範例,為接下來的風險管理與實盤執行奠定基礎。記住:模型是工具,真正的挑戰在於如何將它們嵌入完整的交易流程,並在市場的波動中保持穩健。