返回目錄
A
AI與金融風險管理:數據科學的實務指南 - 第 3 章
第三章 機器學習模型基礎
發布於 2026-03-06 17:41
# 第三章 機器學習模型基礎
本章作為「AI與金融風險管理」的核心技術基礎,將系統化介紹機器學習(ML)在金融領域的應用框架。從監督式與非監督式學習的概念到特徵工程、模型評估,並配合實務範例,讓讀者能在真實金融數據上快速落地。
---
## 3.1 監督式學習 vs. 非監督式學習
| | 監督式學習 | 非監督式學習 |
|---|---|---|
| 目標 | 依據標籤資料預測輸出 | 從未標籤資料中挖掘結構/模式 |
| 常見演算法 | 回歸、決策樹、SVM、神經網路 | K‑means、DBSCAN、PCA、Autoencoder |
| 金融應用 | 信用違約預測、交易量預測、價格走勢分類 | 客戶細分、欺詐偵測、風險敞口分類 |
| 需要的資料 | 標籤 + 特徵 | 只需特徵 |
### 3.1.1 監督式學習示例:信用違約預測
python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import roc_auc_score
# 讀取經過清理的信用資料
df = pd.read_csv("credit_data.csv")
X = df.drop(columns=["default_flag"])
y = df["default_flag"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = GradientBoostingClassifier()
model.fit(X_train, y_train)
preds = model.predict_proba(X_test)[:, 1]
print("AUC:", roc_auc_score(y_test, preds))
> **實務提醒**:在金融場景中,資料偏斜(例如違約樣本遠少於未違約)常見,需採用 SMOTE、類別權重或成本敏感學習等技術。
### 3.1.2 非監督式學習示例:客戶細分
python
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
X = df.drop(columns=["customer_id", "default_flag"])
X_scaled = StandardScaler().fit_transform(X)
kmeans = KMeans(n_clusters=4, random_state=42)
labels = kmeans.fit_predict(X_scaled)
df["segment"] = labels
print(df["segment"].value_counts())
> **實務提醒**:在細分後的群組上,可進一步使用監督式模型做風險評分,提升策略靈活性。
## 3.2 特徵工程:從資料到模型的關鍵橋樑
### 3.2.1 權重與標準化
金融資料常常存在不同量級(例如利息率 vs. 交易金額)。使用標準化(`StandardScaler`)或最小-最大縮放(`MinMaxScaler`)能提升模型收斂速度。
### 3.2.2 時間序列特徵
金融資料往往是時間序列。常見時間序列特徵包括:
- **滯後特徵**:前 1、3、6 期的價格或指標。
- **移動平均 / 指數平滑**:簡單移動平均(SMA)或指數加權移動平均(EMA)。
- **技術指標**:如 RSI、MACD、布林帶等。
- **波動率指標**:VIX、ATR、Historical Volatility。
#### 範例:滯後特徵與移動平均
python
import pandas as pd
prices = pd.read_csv("price_series.csv", parse_dates=["date"]).set_index("date")
prices['lag_1'] = prices['close'].shift(1)
prices['lag_3'] = prices['close'].shift(3)
prices['SMA_20'] = prices['close'].rolling(window=20).mean()
prices['SMA_50'] = prices['close'].rolling(window=50).mean()
prices = prices.dropna()
### 3.2.3 欠缺值處理
在金融數據中,缺失值往往代表「無交易」或「資料不完整」。常見處理方式:
- **前向填充/後向填充**:適用於交易日缺失。
- **插值**:線性或樣條插值,保持時序連續性。
- **刪除**:若缺失比例極低,可直接刪除。
- **建模特定處理**:如使用「缺失指標」作為額外特徵。
### 3.2.4 交互特徵與多項式特徵
有時兩個變數之間的交互能捕捉更複雜的風險關係。使用 `PolynomialFeatures` 可自動生成交互項,但需留意維度爆炸。
python
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False)
X_poly = poly.fit_transform(X)
## 3.3 模型評估:確保模型可靠與可解釋
### 3.3.1 監督式評估指標
| 指標 | 何時使用 | 公式 / 說明 |
|---|---|---|
| **準確率** | 二分類簡易衡量 |
| **AUC‑ROC** | 判斷分數排序 |
| **KS 統計** | 常用於信用風險 |
| **Brier Score** | 預測概率偏差 |
| **Log Loss** | 需要概率輸出 |
| **混淆矩陣** | 觀察 TP/FP/ FN 等 |
> **案例**:在信用違約預測中,銀行更關注 **召回率(Recall)** 或 **K-S**,以避免漏判違約者。
### 3.3.2 交叉驗證
- **K‑fold CV**:保持樣本隨機性,減少過擬合。
- **時序 CV**:對時間序列資料使用「滑動窗口」或「前向擴展」驗證。
python
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(X):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
# 訓練與評估
### 3.3.3 模型可解釋性工具
- **SHAP**:基於 Shapley value 的特徵重要度。
- **LIME**:局部可解釋模型。
- **Partial Dependence Plots (PDP)**:視覺化特徵與預測的關係。
> **實務提醒**:金融監管部門常要求可解釋性,特別是在信貸決策中。使用 SHAP 生成「特徵重要度圖」並嵌入風險報告能大幅提升合規信度。
## 3.4 實務流程圖:從資料到模型部署
[資料蒐集] → [資料清理 & 特徵工程] → [特徵選擇] → [模型選擇 & 訓練] → [模型評估 & 可解釋性] → [模型簽名 & 上線] → [監控 & 重訓]
### 3.4.1 模型簽名(Model Sign‑off)
- **版本控制**:使用 `MLflow` 或 `DVC` 追蹤模型版本。
- **性能基準**:設定最小 AUC、KS 等門檻。
- **合規審核**:由風險部門驗證可解釋性報告。
### 3.4.2 持續監控
- **漂移檢測**:監控輸入分佈與預測分佈漂移。
- **回測**:定期使用歷史資料重新評估模型。
- **警報**:當性能下降超過門檻時自動發送通知。
---
## 3.5 小結與延伸
本章梳理了機器學習基礎概念與金融實務中的關鍵環節,為後續信用風險預測、情境分析與操作風險監測奠定技術基礎。下一章將以實際案例(邏輯回歸、決策樹、XGBoost)進一步展示模型構建與驗證流程,並引入「模型治理」的完整管線。
> **筆者提示**:在金融環境中,模型的「可解釋性」與「合規性」往往與「表現」同等重要。請務必在設計階段就將可解釋性工具納入流程,並確保有明確的模型簽名與審核機制。