返回目錄
A
數據驅動投資分析:從基礎到量化交易 - 第 4 章
第四章:機器學習模型構建
發布於 2026-03-04 18:29
## 第四章:機器學習模型構建
本章將帶領讀者從監督式與非監督式方法出發,學習如何在高頻資料中提煉「信號」並將其量化為可執行策略。整體流程可概括為:
| 步驟 | 目的 | 主要工具 | 例子 |
|------|------|----------|------|
| 資料前處理 | 去除缺失、異常、同步時間 | pandas, numpy, scipy | 交易時序資料清洗 |
| 特徵工程 | 生成有價值特徵 | TA-Lib, scikit‑learn | 技術指標、成交量比、情緒分數 |
| 模型選擇 | 依據問題類型選擇最佳模型 | XGBoost, LightGBM, LSTM, K‑Means | 方向預測、聚類波動模式 |
| 交叉驗證 | 評估模型穩健性 | TimeSeriesSplit, Walk‑Forward Validation | 高頻交易策略回測 |
| 調參與優化 | 提升模型表現 | GridSearchCV, RandomizedSearchCV, Optuna | 條件搜尋、貝葉斯優化 |
| 監督與非監督結合 | 混合式策略 | Autoencoder, IsolationForest | 異常偵測、風險預警 |
---
### 4.1 監督式方法
監督式學習以「已標記」的樣本學習輸入到輸出之間的映射,適用於價格走勢預測、方向預測、波動率預測等問題。
#### 4.1.1 典型問題與目標
- **方向預測**:
- 標籤:
- 1 → 當日收盤價 > 前日收盤價
- 0 → 當日收盤價 ≤ 前日收盤價
- **波動率預測**:
- 標籤:
- 連續 5 分鐘內標準差 > 95th 百分位
- 其他
#### 4.1.2 典型模型
| 模型 | 優點 | 缺點 | 適用場景 |
|------|------|------|----------|
| Logistic Regression | 可解釋性高 | 易受非線性影響 | 方向預測、二元分類 |
| Random Forest / Gradient Boosting | 高準確率、抗過擬合 | 訓練時間較長 | 多特徵非線性關係 |
| XGBoost / LightGBM | 高效、可處理缺失 | 需要調參 | 大型資料集、特徵互動 |
| LSTM / GRU | 捕捉長期序列依賴 | 需要大量資料 | 高頻時序預測 |
#### 4.1.3 代碼示例:使用 XGBoost 進行方向預測
import pandas as pd
from xgboost import XGBClassifier
from sklearn.model_selection import TimeSeriesSplit, GridSearchCV
from sklearn.metrics import roc_auc_score, precision_recall_fscore_support
# 讀取高頻交易資料(每 1 分鐘)
# 假設 df 包含 ['open', 'high', 'low', 'close', 'volume']
df = pd.read_csv('highfreq.csv', parse_dates=['timestamp'], index_col='timestamp')
# 產生技術指標(示例使用簡單移動平均)
window = 5
for w in [5, 10, 20]:
df[f'SMA_{w}'] = df['close'].rolling(w).mean()
# 標籤:1 代表當日收盤價上升
labels = (df['close'].shift(-1) > df['close']).astype(int)
# 特徵矩陣
X = df.dropna()
X = X.iloc[:-1] # 與 labels 對齊
# 時序交叉驗證
tscv = TimeSeriesSplit(n_splits=5)
# XGBoost 參數範例
param_grid = {
'n_estimators': [200, 400],
'max_depth': [3, 5, 7],
'learning_rate': [0.05, 0.1],
'subsample': [0.8, 1.0]
}
model = XGBClassifier(use_label_encoder=False, eval_metric='logloss')
grid = GridSearchCV(model, param_grid, cv=tscv, scoring='roc_auc', verbose=1)
grid.fit(X, labels)
print('Best params:', grid.best_params_)
print('Best AUC:', grid.best_score_)
# 預測與評估
pred_proba = grid.predict_proba(X)[:, 1]
roc_auc = roc_auc_score(labels, pred_proba)
precision, recall, f1, _ = precision_recall_fscore_support(labels, grid.predict(X), average='binary')
print(f'ROC‑AUC: {roc_auc:.4f} | Precision: {precision:.4f} | Recall: {recall:.4f} | F1: {f1:.4f}')
> **實務提醒**:
> 1. **資料時間戳對齊**:高頻資料往往包含多個市場(交易所、板塊)不同的時間戳,務必統一時區並對齊。
> 2. **滑點與交易成本**:模型評估時若不扣除滑點、手續費,往往導致策略實際表現不佳。
> 3. **過擬合風險**:高頻資料特徵繁多,須謹慎使用正則化與交叉驗證。
---
### 4.2 非監督式方法
非監督式學習不依賴標籤,主要用於特徵降維、聚類、異常偵測等。
#### 4.2.1 主成分分析(PCA)
PCA 能將高維特徵投影至低維空間,同時保留最大方差,常用於降噪與特徵選擇。
python
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95) # 保留 95% 變異
X_reduced = pca.fit_transform(X)
print('原始特徵維度:', X.shape[1])
print('降維後維度:', X_reduced.shape[1])
#### 4.2.2 聚類(K‑Means)
K‑Means 可將市場狀態分為若干類別,進而根據不同類別制定不同策略。
python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4, random_state=42)
clusters = kmeans.fit_predict(X)
print('聚類中心數量:', len(kmeans.cluster_centers_))
#### 4.2.3 異常偵測(Isolation Forest)
Isolation Forest 以「孤立」異常點為原理,適用於偵測突發高波動或市場失常。
python
from sklearn.ensemble import IsolationForest
iso = IsolationForest(contamination=0.01, random_state=42)
outliers = iso.fit_predict(X)
print('偵測到的異常比例:', (outliers==-1).mean())
> **應用範例**:在高頻交易中,可先利用 Isolation Forest 過濾出「正常」波動區間,再將剩餘資料送入監督式分類模型,以提升信號純度。
---
### 4.3 特徵工程
特徵工程是機器學習成功關鍵,尤其在金融領域,特徵的質量直接影響預測精度。
#### 4.3.1 典型金融特徵
| 類別 | 具體指標 |
|------|-----------|
| 技術指標 | SMA, EMA, RSI, MACD, Bollinger Bands |
| 成交量特徵 | 成交量均值、成交量變異、買賣壓力比率 |
| 波動率特徵 | ATR, Historical Volatility, Implied Volatility |
| 情緒指標 | NLP 分析的新聞情緒分數、社交媒體熱度 |
| 交叉特徵 | 兩個指標之比值、乘積、相對變化 |
#### 4.3.2 特徵縮放與編碼
- **標準化**:`(x - mean)/std`,適用於正態分布特徵。
- **Min‑Max**:將特徵縮放至 [0,1],適用於梯度提升、神經網路。
- **類別編碼**:One‑Hot、Target Encoding,金融中常見「交易策略類別」等。
#### 4.3.3 重要性評估
使用模型內建的重要性(如 XGBoost 的 `feature_importances_`)或外部方法(SHAP、Permutation Importance)。
python
import shap
explainer = shap.TreeExplainer(grid.best_estimator_)
shap_values = explainer.shap_values(X)
shap.summary_plot(shap_values, X)
> **注意**:金融市場特徵經常存在「資訊衝擊」或「市場微結構效應」,因此特徵選擇時需結合交易成本與滑點影響。
---
### 4.4 交叉驗證(Cross‑Validation)
在時間序列資料中,傳統的 `KFold` 會破壞時間順序,導致前瞻性偏差。以下是適合金融時序的交叉驗證策略。
#### 4.4.1 TimeSeriesSplit
提供「固定訓練集 + 增長驗證集」的分割方式。
python
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for fold, (train_idx, val_idx) in enumerate(tscv.split(X)):
X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
y_train, y_val = labels.iloc[train_idx], labels.iloc[val_idx]
# 訓練模型
# ...
#### 4.4.2 Walk‑Forward Validation
每一次驗證都向前滑動訓練窗口,最貼近實際交易情境。
| 步驟 | 說明 |
|------|------|
| 1 | 初始訓練集:前 30 天 |
| 2 | 驗證集:第 31 天 |
| 3 | 滑動:將第 30 天加入訓練集,移除第 1 天 |
| 4 | 重複至最後一天 |
> **實務建議**:若交易策略包含持倉期間,驗證集應至少比持倉期間長,以免過度擬合。
---
### 4.5 模型調參與優化
良好的模型調參能顯著提升預測表現。常用方法包括 Grid Search、Random Search 與貝葉斯優化(Optuna)。
#### 4.5.1 Grid Search
穩定但計算量大,適合參數空間較小。
python
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [200, 400],
'max_depth': [3, 5, 7],
'learning_rate': [0.05, 0.1],
}
#### 4.5.2 Random Search
在大範圍內隨機抽樣,節省時間。
python
from sklearn.model_selection import RandomizedSearchCV
param_distributions = {
'n_estimators': [200, 400, 600, 800],
'max_depth': [3, 5, 7, 9],
'learning_rate': [0.01, 0.05, 0.1, 0.2],
}
#### 4.5.3 貝葉斯優化(Optuna)
利用先前試驗結果推導新參數,效率高。
python
import optuna
from optuna.samplers import TPESampler
def objective(trial):
param = {
'n_estimators': trial.suggest_int('n_estimators', 100, 1000),
'max_depth': trial.suggest_int('max_depth', 3, 10),
'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3, log=True),
}
model = XGBClassifier(**param, use_label_encoder=False, eval_metric='logloss')
# 交叉驗證計算 AUC
auc = cross_val_score(model, X, labels, cv=tscv, scoring='roc_auc').mean()
return auc
study = optuna.create_study(direction='maximize', sampler=TPESampler(seed=42))
study.optimize(objective, n_trials=100)
print('Best params:', study.best_params)
> **技巧**:
> 1. **早停**:在訓練過程中使用 `early_stopping_rounds`,可防止過擬合。
> 2. **多指標評估**:在金融中不僅看準確率,還應關注 Sharpe、Sortino、信息比率等。
> 3. **穩健性測試**:在不同市場、不同時間段做多次驗證,確保模型不受單一環境影響。
---
### 4.6 模型部署前的「可行性」檢驗
模型在理論上表現優秀,實際交易時還需考量以下因素。
| 項目 | 重要性 | 檢驗方式 |
|------|--------|----------|
| 滑點 | 高 | 模擬交易時引入滑點模型(例如基於 VWAP) |
| 手續費 | 中 | 根據券商結構調整策略閾值 |
| 風險控制 | 高 | 設置止損、風險敞口上限 |
| 資金流動性 | 中 | 檢查持倉與可交易量是否匹配 |
| 計算延遲 | 高 | 監控模型推斷時間,確保低於交易窗口 |
> **案例**:
> 在交易量較低的時段,使用「動態滑點」模型(根據當前成交量自適應調整滑點大小)可大幅提升策略實際報酬。
---
### 4.7 小結
1. **監督式模型**:適合方向、波動率預測,常用 XGBoost、LightGBM、LSTM 等。
2. **非監督式模型**:PCA、聚類、Isolation Forest 等,主要用於特徵降維、異常偵測與市場狀態分類。
3. **特徵工程**:金融特徵的質量決定模型表現,特徵選擇與重要性評估不可忽視。
4. **時間序列交叉驗證**:TimeSeriesSplit 與 Walk‑Forward Validation 是避免前瞻性偏差的關鍵。
5. **調參**:Grid、Random、Optuna 等方法皆可,重點是使用多指標評估。
6. **實務可行性**:滑點、手續費、風險控制等都需在策略前期評估。
> **下一章**:將帶您進入 **量化策略設計與回測**,學習如何將上述模型轉化為可執行的交易策略,並在模擬環境中驗證其效能。