返回目錄
A
金融數據科學實戰:從原始數據到智能投資 - 第 5 章
第五章:機器學習模型在風險管理中的應用
發布於 2026-03-06 12:57
# 第五章:機器學習模型在風險管理中的應用
在金融業,風險管理不僅是合規與監管的要求,更是投資績效與資本配置的核心。傳統的統計方法(例如 CreditScore、Logistic 回歸、Decision Tree)雖然成熟,但隨著資料量的爆炸、特徵維度的提升與非線性關係的複雜化,機器學習(ML)技術已成為提升風險管理效能的關鍵工具。本章將從實務角度出發,介紹風險分級、信用評分與欺詐偵測的 ML 方法,並提供模型選擇、交叉驗證、特徵重要性、模型融合等完整流程與範例。
## 5.1 風險分級(Risk Tiering)
風險分級是將投資對象或交易對手按風險水平分群,常見於信用風險、操作風險與市場風險。ML 可用於自動化分級,提升一致性與效率。
### 5.1.1 準備資料
| 欄位 | 資料來源 | 例子 |
|------|----------|------|
| 信用歷史 | 信用局 | 逾期次數、逾期金額 |
| 財務比率 | 公司財報 | ROE、負債比率 |
| 行為特徵 | 交易紀錄 | 每日交易量、平均持倉時長 |
> **Python 範例**:使用 `pandas` 讀取資料與簡單前處理。
python
import pandas as pd
# 讀取信用歷史與財務比率
credit = pd.read_csv('credit_history.csv')
financial = pd.read_csv('financial_ratios.csv')
# 合併
data = credit.merge(financial, on='customer_id')
# 處理缺失值
data.fillna(data.mean(), inplace=True)
### 5.1.2 建模方法
| 方法 | 主要特徵 | 優點 | 缺點 |
|------|----------|------|------|
| 隨機森林 | 樹木集合 | 抗過擬合、可解釋性高 | 需大量訓練時間 |
| XGBoost | 梯度提升 | 高預測準確、特徵重要性易解讀 | 參數調整複雜 |
| k-最近鄰 | 鄰近樣本 | 簡單直觀 | 高維資料表現不佳 |
> **Python 範例**:使用 `scikit-learn` 的 RandomForestClassifier。
python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
X = data.drop(columns=['customer_id', 'risk_tier'])
y = data['risk_tier']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
rf = RandomForestClassifier(n_estimators=300, random_state=42)
rf.fit(X_train, y_train)
pred_proba = rf.predict_proba(X_test)[:, 1]
print('ROC AUC:', roc_auc_score(y_test, pred_proba))
## 5.2 信用評分(Credit Scoring)
信用評分系統主要評估借款人還款能力,預測違約風險。ML 方法在特徵選擇與非線性關係捕捉上有顯著優勢。
### 5.2.1 特徵工程
1. **數值標準化**:使用 `StandardScaler` 或 `MinMaxScaler`。
2. **類別編碼**:使用 One-Hot 或 Target Encoding。
3. **衍生特徵**:例如「還款率」= 付款金額 ÷ 貸款金額。
4. **時間特徵**:引入「逾期天數」與「月度季節性」指標。
### 5.2.2 模型對比
| 模型 | 參考指標 | 典型案例 |
|------|----------|----------|
| Logistic 回歸 | AUC, KS | 內部信用模型 |
| Gradient Boosting | AUC, Logloss | 信用卡風險 |
| Neural Network | AUC, Gini | 大規模金融科技平台 |
> **Python 範例**:使用 `XGBoost` 進行信用評分。
python
import xgboost as xgb
# 數據已經做過標準化與編碼
X = data.drop(columns=['customer_id', 'default'])
y = data['default']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
params = {
'objective': 'binary:logistic',
'eval_metric': 'auc',
'max_depth': 6,
'eta': 0.1,
'subsample': 0.8,
'colsample_bytree': 0.8
}
bst = xgb.train(params, dtrain, num_boost_round=500, early_stopping_rounds=20, evals=[(dtest, 'eval')])
pred = bst.predict(dtest)
print('AUC:', roc_auc_score(y_test, pred))
## 5.3 欺詐偵測(Fraud Detection)
金融交易中的欺詐行為難以預測,且樣本不平衡問題嚴重。ML 的異常檢測、監督學習與集成方法在此領域表現突出。
### 5.3.1 資料不平衡處理
- **過採樣**:SMOTE、ADASYN。
- **欠採樣**:RandomUnderSampler、ClusterCentroids。
- **代價敏感學習**:設置不同類別權重。
### 5.3.2 模型選擇
| 方法 | 優點 | 典型工具 |
|------|------|----------|
| Isolation Forest | 無監督、可處理高維 | `sklearn.ensemble.IsolationForest` |
| One-Class SVM | 非線性邊界 | `sklearn.svm.OneClassSVM` |
| LightGBM | 高效、可調整類別權重 | `lightgbm` |
| Deep Autoencoder | 捕捉複雜模式 | `tensorflow.keras` |
> **Python 範例**:使用 LightGBM 與類別權重偵測欺詐。
python
import lightgbm as lgb
from sklearn.metrics import roc_auc_score, f1_score
X = fraud_data.drop(columns=['is_fraud'])
y = fraud_data['is_fraud']
# 設置類別權重
class_weight = {0: 1, 1: 10}
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
train_data = lgb.Dataset(X_train, label=y_train, weight=y_train.map(class_weight))
params = {
'objective': 'binary',
'metric': 'auc',
'learning_rate': 0.05,
'num_leaves': 31,
'bagging_fraction': 0.8,
'feature_fraction': 0.8
}
bst = lgb.train(params, train_data, num_boost_round=200)
pred = bst.predict(X_test)
print('AUC:', roc_auc_score(y_test, pred))
print('F1:', f1_score(y_test, pred > 0.5))
## 5.4 模型選擇與驗證
### 5.4.1 交叉驗證(Cross‑Validation)
- **k‑fold CV**:保證資料覆蓋與統計穩定。
- **TimeSeriesSplit**:適用於時間序列,避免前後資訊泄露。
- **StratifiedKFold**:維持類別比例,適合不平衡問題。
python
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
for train_idx, val_idx in skf.split(X, y):
X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
# 這裡插入模型訓練與評估
### 5.4.2 特徵重要性(Feature Importance)
- **基於樹的模型**:使用 `feature_importances_` 或 `gain`。
- **Permutation Importance**:在任何模型上通用。
- **SHAP 值**:提供局部與全局解釋。
python
import shap
explainer = shap.TreeExplainer(bst)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
### 5.4.3 模型融合(Ensembling)
- **堆疊(Stacking)**:基層模型輸出作為元模型輸入。
- **加權平均**:對多個模型預測加權平均。
- **Bagging**:對同一模型使用不同子樣本。
> **Python 範例**:使用 `scikit‑learn` 的 StackingClassifier。
python
from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
estimators = [
('rf', RandomForestClassifier(n_estimators=200, random_state=42)),
('xgb', xgb.XGBClassifier(n_estimators=200, learning_rate=0.05, random_state=42))
]
stack = StackingClassifier(estimators=estimators, final_estimator=LogisticRegression(), cv=5)
stack.fit(X_train, y_train)
pred = stack.predict_proba(X_test)[:, 1]
print('Stacked AUC:', roc_auc_score(y_test, pred))
## 5.5 實務落地注意事項
| 風險 | 影響 | 建議做法 |
|------|------|----------|
| 監管風險 | 資料隱私、模型合規 | 遵循 GDPR、GLBA;使用 Explainable AI。
| 模型風險 | 過擬合、漂移 | 定期重新訓練;部署監控指標。
| 資料風險 | 欺詐、錯誤標註 | 資料治理、資料清洗;使用資料品質指標。
| 運營風險 | 系統延遲、資源 | 使用容錯、水平擴容;採用雲端服務。
## 5.6 小結
1. **多模型策略**:風險分級、信用評分與欺詐偵測皆可透過多種 ML 方法提升效能。
2. **交叉驗證與特徵重要性**:確保模型泛化與解釋性。
3. **融合技術**:堆疊與加權平均可進一步提升預測準確度。
4. **監管合規**:任何模型部署前須考慮可解釋性與風險監控。
5. **持續迭代**:金融市場與行為模式變化快速,需定期評估與調整模型。
> **後續閱讀**:
> - *《機器學習在金融風險管理中的應用》* by B. Chen
> - *《Explainable AI in Finance》* by J. Zhang
> - 官方文檔:`scikit-learn`, `xgboost`, `lightgbm`, `shap`。