返回目錄
A
AI與金融風險管理:數據科學的實務指南 - 第 2 章
第二章 風險量化:從統計到機器學習
發布於 2026-03-06 17:16
# 第二章 風險量化:從統計到機器學習
> 在前一章,我們搭起了「從數據到決策」的實務框架,並學會了如何透過監控、維護與合規確保模型持續可用。接下來,我們將聚焦於 **風險量化** 的核心技術,從傳統的統計指標(VaR、CVaR、壓力測試)切入,再逐步引入機器學習與深度學習,讓風險預測更為精準、更能應對動態市場。
---
## 2.1 為何要量化風險?
- **定量評估**:給出風險大小的數值,方便資本分配、資產配置。
- **監控變化**:追蹤風險指標的趨勢,及時調整投資策略。
- **合規要求**:許多監管機構(巴塞爾協議、MiFID II)要求使用VaR等指標作為風險管理基礎。
在實務中,我們通常需要 **多層級** 的量化:
1. **日內波動**:短期波動率、成交量變化。
2. **中長期風險**:VaR、CVaR、資產負債匹配。
3. **宏觀壓力**:情境測試、情景分析。
## 2.2 傳統統計方法
### 2.2.1 Value at Risk (VaR)
> **VaR** 是在給定置信度下,未來某段時間內投資組合可能的最大損失。常見估計方法有歷史模擬法、參數法(正態分佈)、蒙地卡羅。
```python
import pandas as pd
import numpy as np
# 假設 daily_returns 為每日報酬率 DataFrame
confidence_level = 0.95
var = -np.percentile(daily_returns, (1 - confidence_level) * 100)
print(f"{confidence_level*100:.0f}% 置信度下的 VaR: {var:.4f}")
```
### 2.2.2 Conditional VaR (CVaR) / Expected Shortfall
> CVaR 進一步衡量 VaR 以上的平均損失,提供更保守的風險估計。
```python
# CVaR 計算
cvar = -daily_returns[daily_returns <= -var].mean()
print(f"CVaR: {cvar:.4f}")
```
### 2.2.3 壓力測試與情境分析
- **壓力測試**:模擬極端市場事件(如金融危機、流動性缺口)對投資組合的衝擊。
- **情境分析**:設定特定情境參數(利率上升、匯率波動),透過回測或模擬計算損益。
> 典型流程:
> 1. 定義情境參數(如 +200 bps 的利率上升)。
> 2. 透過模型重估資產價格。
> 3. 計算投資組合的變化。
## 2.3 進入機器學習領域
傳統方法往往依賴簡化假設(正態分佈、線性關係)。現代機器學習能夠捕捉非線性、交互效應,提升風險預測準確度。以下列出三大類別:
| 類別 | 典型演算法 | 主要應用 | 風險指標 | 範例程式碼 |
|------|------------|----------|----------|------------|
| 監督式 | Random Forest、XGBoost | 信用評分、違約預測 | 満約率、違約概率 | see 2.3.1 |
| 無監督式 | Isolation Forest、Autoencoder | 異常偵測、流動性風險 | 異常分數 | see 2.3.2 |
| 強化式 | DQN、PPO | 交易策略、資產配置 | 回報率、風險調整後回報 | see 2.3.3 |
### 2.3.1 監督式風險預測:信用違約
#### 數據構建
| Feature | 說明 |
|--------|------|
| `loan_amount` | 貸款金額 |
| `term_month` | 期限(月) |
| `interest_rate` | 利率 |
| `employment_length` | 就業年限 |
| `credit_score` | 信用評分 |
| `delinq_2yrs` | 兩年內違約次數 |
| `revol_util` | 循環利用率 |
| `default` | 目標變數(0/1) |
#### 模型訓練
```python
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
X = df.drop(columns=['default'])
y = df['default']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
rf = RandomForestClassifier(n_estimators=300, max_depth=12, random_state=42)
rf.fit(X_train_scaled, y_train)
pred_proba = rf.predict_proba(X_test_scaled)[:, 1]
print("AUC-ROC: %.4f" % roc_auc_score(y_test, pred_proba))
```
> **模型解讀**:可利用 `feature_importances_` 觀察特徵重要度,或採用 SHAP 值進行局部解釋。
### 2.3.2 無監督式異常偵測:流動性風險
```python
from sklearn.ensemble import IsolationForest
# 假設 df_flow 是包含成交量、價格、bid-ask spread 等特徵
iso = IsolationForest(contamination=0.01, random_state=42)
iso.fit(df_flow)
anomaly_scores = iso.decision_function(df_flow)
anomaly_labels = iso.predict(df_flow) # -1 表示異常
# 觀察異常分佈
import matplotlib.pyplot as plt
plt.hist(anomaly_scores, bins=50, alpha=0.7)
plt.title('Isolation Forest anomaly scores')
plt.show()
```
> **異常分數** 與 **置信度閾值** 可透過 ROC 曲線優化,確保偵測率與誤報率之間取得平衡。
### 2.3.3 強化學習:動態資產配置
#### 基本框架
1. **狀態 (State)**:當前市場環境(波動率、利率、宏觀指標)與投資組合配置。
2. **動作 (Action)**:資產配置比例的調整。
3. **報酬 (Reward)**:風險調整後的回報(如夏普率、Sortino Ratio)。
4. **學習目標**:最大化累積報酬。
```python
import gym
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
# 簡化的 Gym 環境:觀測為波動率向量,動作為配置比例
class PortfolioEnv(gym.Env):
def __init__(self, data):
self.data = data
self.current_step = 0
self.n_assets = data.shape[1]
self.action_space = gym.spaces.Box(low=0, high=1, shape=(self.n_assets,))
self.observation_space = gym.spaces.Box(low=0, high=np.inf, shape=(self.n_assets,))
def reset(self):
self.current_step = 0
return self.data.iloc[self.current_step].values
def step(self, action):
self.current_step += 1
if self.current_step >= len(self.data):
done = True
next_state = np.zeros(self.n_assets)
else:
done = False
next_state = self.data.iloc[self.current_step].values
# 簡化報酬計算:使用負風險作為懲罰
reward = -np.dot(action, next_state)
return next_state, reward, done, {}
# 簡單 DQN
class DQN(nn.Module):
def __init__(self, n_state, n_action):
super().__init__()
self.net = nn.Sequential(
nn.Linear(n_state, 64), nn.ReLU(),
nn.Linear(64, 64), nn.ReLU(),
nn.Linear(64, n_action)
)
def forward(self, x):
return self.net(x)
# 訓練迴圈(簡化版)
# ...
```
> **注意**:真實投資環境需考慮交易成本、滑點、資金限制。強化學習模型常需長期、頻繁回測以確保穩定。
## 2.4 大數據與雲端部署
| 技術 | 角色 | 應用場景 |
|------|------|-----------|
| Apache Spark | 分散式計算 | 大規模歷史回測、特徵工程 |
| Kubernetes | 容器編排 | 模型自動化部署、CI/CD |
| Grafana + Prometheus | 監控 | 模型效能、資源利用率 |
| Snowflake / Redshift | 數據倉儲 | 統一資料來源、數據治理 |
> **實務案例**:將 VaR 計算腳本封裝為 Docker 容器,使用 Kubernetes 定時執行,結果輸出至 Snowflake,並透過 Grafana 建立「日內 VaR Dashboard」。
## 2.5 合規與倫理考量
1. **公平性**:機器學習模型可能引入種族、性別偏見。使用工具(如 AI Fairness 360)進行偏見檢測。
2. **可解釋性**:對於決策敏感的金融模型,需提供可解釋的輸出(SHAP、LIME)。
3. **資料隱私**:遵守 GDPR、個人資料保護法,實施資料匿名化、同意管理。
4. **風險治理**:建立「模型簽名」(model sign‑off)流程,確保所有上線模型經過風險審核。
## 2.6 小結與前瞻
本章介紹了從傳統統計指標到先進機器學習方法的完整風險量化流程,並示範了實作範例、雲端部署與合規實踐。未來,我們將進一步探討:
- **多因子模型** 與 **時間序列深度學習** 的結合。
- **可持續金融**(ESG)風險評估框架。
- **聯邦學習** 在跨機構風險共享的應用。
> **筆者提醒**:風險管理是一場長期競賽,科技是加速器,但風險洞察與人性判斷仍是最終的勝負關鍵。保持好奇、謹慎實驗,才能在波動的市場中立於不敗之地。