聊天視窗

金融數據科學:從基礎到量化交易 - 第 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. **持續迭代**:模型監控、漂移偵測與再訓練。 接下來的章節將進一步探討如何將這些模型落地至實時交易平台,並討論合規與倫理層面的挑戰。祝你在實務中順利應用這些技術,創造穩健的投資績效。