聊天視窗

金融數據科學實戰:從原始數據到智能投資 - 第 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`。