返回目錄
A
金融數據科學:從基礎到量化交易 - 第 5 章
5. 機器學習在金融的應用
發布於 2026-03-04 09:47
# 第五章 機器學習在金融的應用
本章將聚焦於將決策樹、隨機森林、梯度提升、以及神經網路等機器學習方法,引入金融領域的實務問題。重點不只是演算法的數學推導,而是如何在真實金融資料中構造特徵、選擇合適模型、進行驗證與部署,並兼顧風險管理與合規性。
---
## 5.1 先備知識
| 項目 | 內容 |
|------|------|
| **資料結構** | 時序資料、表格資料、非結構化文字、影像/音訊資料(新聞、社交媒體) |
| **核心概念** | *過擬合*、*偏差-變異性*、*資訊損失*、*特徵重要性* |
| **評估指標** | 回測績效(Sharpe、Sortino、Max Drawdown)、分類評估(Accuracy、AUC、Precision‑Recall) |
---
## 5.2 決策樹(Decision Tree)
### 5.2.1 基本原理
決策樹是一種可解釋性極高的分類與迴歸模型。通過在每個節點上對一個特徵做二元切分,最終將資料分成若干葉節點,葉節點上存放統計值(平均值、類別比例)。
### 5.2.2 典型應用
| 任務 | 目標 | 典型特徵 |
|------|------|----------|
| 風險分類 | 是否逾期 | 信用分數、收入、負債比率 |
| 交易信號 | 上漲/下跌 | 5 日、20 日移動平均差、成交量、RSI |
### 5.2.3 優點與限制
| 優點 | 限制 |
|------|------|
| 高度可解釋 | 容易過擬合、對噪音敏感 |
| 無需資料標準化 | 對連續特徵分割不夠靈活 |
### 5.2.4 範例程式碼
python
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.model_selection import train_test_split
# 讀取範例資料
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 建模
clf = DecisionTreeClassifier(max_depth=5, min_samples_leaf=50, random_state=42)
clf.fit(X_train, y_train)
# 預測與評估
pred = clf.predict(X_test)
print('Accuracy:', clf.score(X_test, y_test))
# 可視化結構
print(export_text(clf, feature_names=list(X.columns)))
---
## 5.3 隨機森林(Random Forest)
### 5.3.1 基本原理
隨機森林是多棵決策樹的集成。每棵樹在訓練時使用 bootstrap 樣本,並在節點切分時隨機挑選特徵子集,從而降低各樹之間的相關性,提升整體泛化能力。
### 5.3.2 重要參數
| 參數 | 含義 |
|------|------|
| n_estimators | 樹的數量,越多越穩健但計算成本上升 |
| max_features | 每個節點隨機挑選的特徵數量(auto、sqrt、log2) |
| min_samples_leaf | 葉節點最小樣本數 |
### 5.3.3 典型應用
| 任務 | 目標 | 典型特徵 |
|------|------|----------|
| 信用風險 | 逾期概率 | 多維財務指標、交易行為、地理位置 |
| 市場預測 | 方向 | 技術指標、宏觀經濟變數、新聞情緒 |
### 5.3.4 範例程式碼
python
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
rf = RandomForestClassifier(n_estimators=200, max_depth=10, min_samples_leaf=20, random_state=42)
rf.fit(X_train, y_train)
prob = rf.predict_proba(X_test)[:, 1]
print('AUC:', roc_auc_score(y_test, prob))
---
## 5.4 梯度提升機(Gradient Boosting)
### 5.4.1 基本原理
梯度提升機(GBM)是一種逐步建模的集成方法,每棵樹試圖修正前一棵樹的殘差。常見實作包括 XGBoost、LightGBM、CatBoost。它在金融風險評分、定價模型中表現尤為優秀。
### 5.4.2 主要優勢
- **高精度**:能捕捉複雜非線性關係。
- **可處理缺失值**:內部自動學習缺失處理策略。
- **特徵重要性輸出**:可快速判斷關鍵因子。
### 5.4.3 典型應用
| 任務 | 目標 | 典型特徵 |
|------|------|----------|
| 信用分數 | 風險分級 | 交易頻率、逾期歷史、收入變動 |
| 期權定價 | 隱含波動率預測 | 近期期權價格、股價回報、利率 |
### 5.4.4 範例程式碼(XGBoost)
python
import xgboost as xgb
from sklearn.metrics import mean_squared_error
# 準備 DMatrix
train_dmat = xgb.DMatrix(X_train, label=y_train)
val_dmat = xgb.DMatrix(X_test, label=y_test)
param = {
'objective': 'binary:logistic',
'eval_metric': 'auc',
'max_depth': 6,
'eta': 0.1,
'subsample': 0.8,
'colsample_bytree': 0.8
}
num_round = 500
model = xgb.train(param, train_dmat, num_round, [(val_dmat, 'eval')])
pred = model.predict(val_dmat)
print('AUC:', roc_auc_score(y_test, pred))
---
## 5.5 神經網路(Deep Learning)
### 5.5.1 基本結構
- **全連接網路**(MLP):適用於結構化特徵。
- **卷積神經網路**(CNN):可處理時序或圖像資料,例如行情走勢圖。
- **循環神經網路**(RNN / LSTM / GRU):專為長序列建模,適用於股價、匯率等。
### 5.5.2 典型應用
| 任務 | 目標 | 典型特徵 |
|------|------|----------|
| 交易信號 | 上漲/下跌 | 1 歲行情圖、技術指標、宏觀新聞詞向量 |
| 風險預測 | 風險分級 | 財務數據 + 交互式特徵 |
### 5.5.3 重要技巧
- **正則化**:dropout、L1/L2。
- **序列填補**:使用 `tf.keras.layers.TimeDistributed`。
- **預訓練詞向量**:GloVe、BERT 的金融版本。
### 5.5.4 範例程式碼(LSTM 進行股價方向預測)
python
import numpy as np
import tensorflow as tf
from sklearn.preprocessing import StandardScaler
# 生成序列資料
seq_len = 20
features = df[['close', 'volume']].values
scaler = StandardScaler()
features = scaler.fit_transform(features)
X, y = [], []
for i in range(len(features)-seq_len-1):
X.append(features[i:i+seq_len])
y.append(int(features[i+seq_len,0] > features[i+seq_len-1,0]))
X, y = np.array(X), np.array(y)
# 分割
X_train, X_test = X[:int(len(X)*0.8)], X[int(len(X)*0.8):]
y_train, y_test = y[:int(len(y)*0.8)], y[int(len(y)*0.8):]
# 建模
model = tf.keras.Sequential([
tf.keras.layers.LSTM(64, return_sequences=True, input_shape=(seq_len, features.shape[1])),
tf.keras.layers.LSTM(32),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=20, batch_size=64, validation_split=0.1)
loss, acc = model.evaluate(X_test, y_test)
print('Test accuracy:', acc)
---
## 5.6 特徵工程(Feature Engineering)
### 5.6.1 技術指標作為特徵
| 指標 | 公式/意義 |
|------|-----------|
| SMA | 簡單移動平均 |
| EMA | 指數加權移動平均 |
| RSI | 相對強弱指標 |
| MACD | 移動平均收斂/發散指標 |
### 5.6.2 宏觀與新聞特徵
- **宏觀指標**:GDP、CPI、失業率、利率變化。
- **新聞情緒**:利用 NLP 生成情緒分數或關鍵詞頻率。
### 5.6.3 非結構化資料轉結構化
- **文本**:TF‑IDF、Word2Vec、BERT。
- **圖像**:CNN 提取特徵,再作為模型輸入。
### 5.6.4 交互特徵與多項式特徵
python
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)
---
## 5.7 模型選擇與調參
| 步驟 | 方法 |
|------|------|
| 交叉驗證 | K‑Fold、TimeSeriesSplit |
| 網格搜尋 | GridSearchCV |
| 隨機搜尋 | RandomizedSearchCV |
| 貝葉斯優化 | Optuna、Hyperopt |
| 早停與學習率調整 | ReduceLROnPlateau、EarlyStopping |
### 5.7.1 風險控制
- **過擬合指標**:train‑test gap、validation loss、sharpe ratio 的不一致。
- **概念漂移**:使用滑動窗口重新訓練、模型漂移檢測。
---
## 5.8 實務部署建議
| 階段 | 內容 |
|------|------|
| 模型封裝 | 將模型封裝為 REST API 或 gRPC,使用 Docker 部署 |
| 監控 | 追蹤預測值、交易量、延遲、資金流動 |
| 風險閾值 | 設定最大單筆損失、最大敞口、回撤閾值 |
| 合規審核 | 模型白盒說明、資料來源審查、回測結果文件 |
---
## 5.9 案例:股票市場的多模態預測
| 步驟 | 描述 |
|------|------|
| 資料收集 | 日收盤價、成交量、技術指標、財報、新聞、Twitter 情緒 |
| 特徵組合 | 5 日 SMA、14 日 RSI、成交量變化、情緒分數 |
| 模型 | XGBoost + LSTM 融合:XGBoost 做特徵重要性排序,LSTM 捕捉序列長期依賴 |
| 評估 | AUC、Sharpe、勝率、最大回撤 |
| 部署 | 透過雲端批次作業,每日凌晨自動回測並產生交易信號 |
**結果**:相較單純的技術指標策略,結合多源特徵後,AUC 從 0.65 提升至 0.78,Sharpe Ratio 從 0.45 提升至 0.63,最大回撤由 20% 降至 12%。
---
## 5.10 常見陷阱與解決方案
| 陷阱 | 症狀 | 解決方案 |
|------|------|----------|
| **資料洩漏** | 交叉驗證結果過於理想 | 使用時間序列分割、嚴格區分訓練/測試 |
| **過度擬合** | 模型在驗證集表現良好,但實盤失敗 | 加入正則化、減少特徵數、增大樣本量 |
| **概念漂移** | 長期訓練後模型失效 | 定期重新訓練、使用漂移檢測指標 |
| **模型不透明** | 合規審核失敗 | 選擇可解釋模型、提供特徵重要性報告 |
---
## 5.11 小結
本章介紹了從基礎決策樹到高階神經網路,在金融資料中實踐機器學習的完整流程。關鍵點包括:
1. **特徵工程**:多源資料整合與可解釋特徵設計。
2. **模型選擇**:根據資料特性選擇適合的基礎或集成模型。
3. **評估與驗證**:使用時間序列交叉驗證、風險指標同步評估。
4. **持續迭代**:模型監控、漂移偵測與再訓練。
接下來的章節將進一步探討如何將這些模型落地至實時交易平台,並討論合規與倫理層面的挑戰。祝你在實務中順利應用這些技術,創造穩健的投資績效。