返回目錄
A
數據駕駛:從零開始的量化投資實戰 - 第 4 章
第 4 章:機器學習與特徵選擇:從簡單回歸到深度網絡
發布於 2026-02-20 21:50
# 第 4 章:機器學習與特徵選擇:從簡單回歸到深度網絡
在前一章中,我們已經掌握了統計推論的基礎,學會如何檢驗市場因子與個股報酬之間的關係。這些方法雖然強大,但在處理非線性、複雜交互效應時往往顯得力不從心。為了提升模型的預測力與泛化能力,本章將帶你步入機器學習的領域,從最簡單的線性回歸到深度學習模型,並透過實際範例說明如何有效地進行特徵工程、模型選擇與參數調優。
## 4.1 什麼是機器學習?
機器學習(Machine Learning)是一種讓電腦從資料中「學習」模式與規則,進而做出預測或決策的技術。相較於傳統統計模型,機器學習不需要預先假設數據分布;它能夠自動捕捉資料中的非線性結構與高維交互關係。
> **筆記**:在量化投資中,常見的機器學習任務包括
>
> * **回歸(Regression)**:預測未來收益率或波動率。
> * **分類(Classification)**:判斷市場趨勢(上漲/下跌)或產生買賣信號。
> * **聚類(Clustering)**:找出相似股票或市場區塊。
## 4.2 資料前處理:特徵工程與資料增強
### 4.2.1 特徵選擇(Feature Selection)
特徵過多會導致模型過擬合;特徵太少則可能無法捕捉關鍵訊息。常用方法有:
| 方法 | 原理 | 優缺點 |
|------|------|--------|
| 相關係數 | 觀察特徵與目標變數的線性關係 | 只適用於線性關係 |
| 主成分分析(PCA) | 降維,保留最大變異 | 可能失去解釋性 |
| L1 正則化(Lasso) | 直接在模型中執行特徵選擇 | 需要合理選擇正則化係數 |
### 4.2.2 標準化與正規化
機器學習模型常對特徵尺度敏感。常見做法:
python
from sklearn.preprocessing import StandardScaler, MinMaxScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # Z-score 標準化
### 4.2.3 資料增強
對於時間序列資料,可使用滑動窗口、延遲特徵、技術指標等方法生成新的特徵。
python
# 產生 1 天滯後特徵
X['lag1'] = X['close'].shift(1)
# 產生 5 天移動平均
X['ma5'] = X['close'].rolling(window=5).mean()
## 4.3 監督式學習模型介紹
### 4.3.1 線性回歸(Linear Regression)
最簡單的模型,作為基準。
python
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
pred = model.predict(X_test)
### 4.3.2 支持向量機(SVM)
能捕捉非線性邊界,適合分類任務。
python
from sklearn.svm import SVC
svm = SVC(kernel='rbf', C=1.0, gamma='scale')
svm.fit(X_train, y_train)
### 4.3.3 隨機森林(Random Forest)
基於樹模型的集成方法,對異常值與噪聲有良好魯棒性。
python
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(n_estimators=500, random_state=42)
rf.fit(X_train, y_train)
### 4.3.4 XGBoost / LightGBM
梯度提升機(GBM)的高效實作,常在比賽中獲得高排名。
python
import xgboost as xgb
xgb_reg = xgb.XGBRegressor(n_estimators=300, learning_rate=0.05, max_depth=5)
xgb_reg.fit(X_train, y_train)
## 4.4 交叉驗證與參數調優
### 4.4.1 K‑Fold 交叉驗證
python
from sklearn.model_selection import KFold, cross_val_score
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(rf, X, y, cv=kfold, scoring='neg_mean_squared_error')
print('MSE:', -scores.mean())
### 4.4.2 隨機搜索與貝葉斯優化
python
from sklearn.model_selection import RandomizedSearchCV
param_grid = {
'n_estimators': [200, 400, 600],
'max_depth': [3, 5, 7],
'min_samples_split': [2, 5, 10]
}
search = RandomizedSearchCV(rf, param_grid, n_iter=20, cv=5, scoring='neg_mean_squared_error', random_state=42)
search.fit(X, y)
print('Best Params:', search.best_params_)
## 4.5 深度學習:多層感知機(MLP)與時序網路
### 4.5.1 多層感知機(MLP)
python
from sklearn.neural_network import MLPRegressor
mlp = MLPRegressor(hidden_layer_sizes=(128, 64), activation='relu', solver='adam', max_iter=200)
mlp.fit(X_train, y_train)
### 4.5.2 長短期記憶網路(LSTM)
適合處理長時間依賴的股價序列。
python
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
# 轉換資料為 [samples, timesteps, features]
X_seq = X.values.reshape((X.shape[0], 10, X.shape[1]))
model = Sequential([
LSTM(64, return_sequences=True, input_shape=(10, X.shape[1])),
Dropout(0.2),
LSTM(32),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(X_seq, y, epochs=50, batch_size=32)
## 4.6 常見陷阱與最佳實踐
| 風險 | 原因 | 解決方案 |
|------|------|----------|
| 資料泄露 | 在訓練集和測試集混用特徵 | 先分離再進行特徵工程 |
| 过拟合 | 模型複雜度高 | 采用正則化、交叉驗證、剪枝 |
| 計算成本 | 大規模資料訓練慢 | 使用 GPU、分布式訓練、特徵降維 |
| 模型解釋性 | 黑盒模型 | 采用 SHAP、LIME 進行特徵重要性分析 |
## 4.7 小結
本章從機器學習的基本概念出發,循序漸進地介紹了資料前處理、特徵工程、監督式模型、交叉驗證、參數調優以及深度學習的實踐。這些工具為你在量化投資中建立更強大、更具預測力的模型奠定了堅實基礎。接下來,我們將聚焦於風險管理與組合優化,將模型輸出轉化為具體的交易決策。
---