聊天視窗

數據驅動投資分析:從基礎到量化交易 - 第 4 章

第四章:機器學習模型構建

發布於 2026-03-04 18:29

## 第四章:機器學習模型構建 本章將帶領讀者從監督式與非監督式方法出發,學習如何在高頻資料中提煉「信號」並將其量化為可執行策略。整體流程可概括為: | 步驟 | 目的 | 主要工具 | 例子 | |------|------|----------|------| | 資料前處理 | 去除缺失、異常、同步時間 | pandas, numpy, scipy | 交易時序資料清洗 | | 特徵工程 | 生成有價值特徵 | TA-Lib, scikit‑learn | 技術指標、成交量比、情緒分數 | | 模型選擇 | 依據問題類型選擇最佳模型 | XGBoost, LightGBM, LSTM, K‑Means | 方向預測、聚類波動模式 | | 交叉驗證 | 評估模型穩健性 | TimeSeriesSplit, Walk‑Forward Validation | 高頻交易策略回測 | | 調參與優化 | 提升模型表現 | GridSearchCV, RandomizedSearchCV, Optuna | 條件搜尋、貝葉斯優化 | | 監督與非監督結合 | 混合式策略 | Autoencoder, IsolationForest | 異常偵測、風險預警 | --- ### 4.1 監督式方法 監督式學習以「已標記」的樣本學習輸入到輸出之間的映射,適用於價格走勢預測、方向預測、波動率預測等問題。 #### 4.1.1 典型問題與目標 - **方向預測**: - 標籤: - 1 → 當日收盤價 > 前日收盤價 - 0 → 當日收盤價 ≤ 前日收盤價 - **波動率預測**: - 標籤: - 連續 5 分鐘內標準差 > 95th 百分位 - 其他 #### 4.1.2 典型模型 | 模型 | 優點 | 缺點 | 適用場景 | |------|------|------|----------| | Logistic Regression | 可解釋性高 | 易受非線性影響 | 方向預測、二元分類 | | Random Forest / Gradient Boosting | 高準確率、抗過擬合 | 訓練時間較長 | 多特徵非線性關係 | | XGBoost / LightGBM | 高效、可處理缺失 | 需要調參 | 大型資料集、特徵互動 | | LSTM / GRU | 捕捉長期序列依賴 | 需要大量資料 | 高頻時序預測 | #### 4.1.3 代碼示例:使用 XGBoost 進行方向預測 import pandas as pd from xgboost import XGBClassifier from sklearn.model_selection import TimeSeriesSplit, GridSearchCV from sklearn.metrics import roc_auc_score, precision_recall_fscore_support # 讀取高頻交易資料(每 1 分鐘) # 假設 df 包含 ['open', 'high', 'low', 'close', 'volume'] df = pd.read_csv('highfreq.csv', parse_dates=['timestamp'], index_col='timestamp') # 產生技術指標(示例使用簡單移動平均) window = 5 for w in [5, 10, 20]: df[f'SMA_{w}'] = df['close'].rolling(w).mean() # 標籤:1 代表當日收盤價上升 labels = (df['close'].shift(-1) > df['close']).astype(int) # 特徵矩陣 X = df.dropna() X = X.iloc[:-1] # 與 labels 對齊 # 時序交叉驗證 tscv = TimeSeriesSplit(n_splits=5) # XGBoost 參數範例 param_grid = { 'n_estimators': [200, 400], 'max_depth': [3, 5, 7], 'learning_rate': [0.05, 0.1], 'subsample': [0.8, 1.0] } model = XGBClassifier(use_label_encoder=False, eval_metric='logloss') grid = GridSearchCV(model, param_grid, cv=tscv, scoring='roc_auc', verbose=1) grid.fit(X, labels) print('Best params:', grid.best_params_) print('Best AUC:', grid.best_score_) # 預測與評估 pred_proba = grid.predict_proba(X)[:, 1] roc_auc = roc_auc_score(labels, pred_proba) precision, recall, f1, _ = precision_recall_fscore_support(labels, grid.predict(X), average='binary') print(f'ROC‑AUC: {roc_auc:.4f} | Precision: {precision:.4f} | Recall: {recall:.4f} | F1: {f1:.4f}') > **實務提醒**: > 1. **資料時間戳對齊**:高頻資料往往包含多個市場(交易所、板塊)不同的時間戳,務必統一時區並對齊。 > 2. **滑點與交易成本**:模型評估時若不扣除滑點、手續費,往往導致策略實際表現不佳。 > 3. **過擬合風險**:高頻資料特徵繁多,須謹慎使用正則化與交叉驗證。 --- ### 4.2 非監督式方法 非監督式學習不依賴標籤,主要用於特徵降維、聚類、異常偵測等。 #### 4.2.1 主成分分析(PCA) PCA 能將高維特徵投影至低維空間,同時保留最大方差,常用於降噪與特徵選擇。 python from sklearn.decomposition import PCA pca = PCA(n_components=0.95) # 保留 95% 變異 X_reduced = pca.fit_transform(X) print('原始特徵維度:', X.shape[1]) print('降維後維度:', X_reduced.shape[1]) #### 4.2.2 聚類(K‑Means) K‑Means 可將市場狀態分為若干類別,進而根據不同類別制定不同策略。 python from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=4, random_state=42) clusters = kmeans.fit_predict(X) print('聚類中心數量:', len(kmeans.cluster_centers_)) #### 4.2.3 異常偵測(Isolation Forest) Isolation Forest 以「孤立」異常點為原理,適用於偵測突發高波動或市場失常。 python from sklearn.ensemble import IsolationForest iso = IsolationForest(contamination=0.01, random_state=42) outliers = iso.fit_predict(X) print('偵測到的異常比例:', (outliers==-1).mean()) > **應用範例**:在高頻交易中,可先利用 Isolation Forest 過濾出「正常」波動區間,再將剩餘資料送入監督式分類模型,以提升信號純度。 --- ### 4.3 特徵工程 特徵工程是機器學習成功關鍵,尤其在金融領域,特徵的質量直接影響預測精度。 #### 4.3.1 典型金融特徵 | 類別 | 具體指標 | |------|-----------| | 技術指標 | SMA, EMA, RSI, MACD, Bollinger Bands | | 成交量特徵 | 成交量均值、成交量變異、買賣壓力比率 | | 波動率特徵 | ATR, Historical Volatility, Implied Volatility | | 情緒指標 | NLP 分析的新聞情緒分數、社交媒體熱度 | | 交叉特徵 | 兩個指標之比值、乘積、相對變化 | #### 4.3.2 特徵縮放與編碼 - **標準化**:`(x - mean)/std`,適用於正態分布特徵。 - **Min‑Max**:將特徵縮放至 [0,1],適用於梯度提升、神經網路。 - **類別編碼**:One‑Hot、Target Encoding,金融中常見「交易策略類別」等。 #### 4.3.3 重要性評估 使用模型內建的重要性(如 XGBoost 的 `feature_importances_`)或外部方法(SHAP、Permutation Importance)。 python import shap explainer = shap.TreeExplainer(grid.best_estimator_) shap_values = explainer.shap_values(X) shap.summary_plot(shap_values, X) > **注意**:金融市場特徵經常存在「資訊衝擊」或「市場微結構效應」,因此特徵選擇時需結合交易成本與滑點影響。 --- ### 4.4 交叉驗證(Cross‑Validation) 在時間序列資料中,傳統的 `KFold` 會破壞時間順序,導致前瞻性偏差。以下是適合金融時序的交叉驗證策略。 #### 4.4.1 TimeSeriesSplit 提供「固定訓練集 + 增長驗證集」的分割方式。 python from sklearn.model_selection import TimeSeriesSplit tscv = TimeSeriesSplit(n_splits=5) for fold, (train_idx, val_idx) in enumerate(tscv.split(X)): X_train, X_val = X.iloc[train_idx], X.iloc[val_idx] y_train, y_val = labels.iloc[train_idx], labels.iloc[val_idx] # 訓練模型 # ... #### 4.4.2 Walk‑Forward Validation 每一次驗證都向前滑動訓練窗口,最貼近實際交易情境。 | 步驟 | 說明 | |------|------| | 1 | 初始訓練集:前 30 天 | | 2 | 驗證集:第 31 天 | | 3 | 滑動:將第 30 天加入訓練集,移除第 1 天 | | 4 | 重複至最後一天 | > **實務建議**:若交易策略包含持倉期間,驗證集應至少比持倉期間長,以免過度擬合。 --- ### 4.5 模型調參與優化 良好的模型調參能顯著提升預測表現。常用方法包括 Grid Search、Random Search 與貝葉斯優化(Optuna)。 #### 4.5.1 Grid Search 穩定但計算量大,適合參數空間較小。 python from sklearn.model_selection import GridSearchCV param_grid = { 'n_estimators': [200, 400], 'max_depth': [3, 5, 7], 'learning_rate': [0.05, 0.1], } #### 4.5.2 Random Search 在大範圍內隨機抽樣,節省時間。 python from sklearn.model_selection import RandomizedSearchCV param_distributions = { 'n_estimators': [200, 400, 600, 800], 'max_depth': [3, 5, 7, 9], 'learning_rate': [0.01, 0.05, 0.1, 0.2], } #### 4.5.3 貝葉斯優化(Optuna) 利用先前試驗結果推導新參數,效率高。 python import optuna from optuna.samplers import TPESampler def objective(trial): param = { 'n_estimators': trial.suggest_int('n_estimators', 100, 1000), 'max_depth': trial.suggest_int('max_depth', 3, 10), 'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3, log=True), } model = XGBClassifier(**param, use_label_encoder=False, eval_metric='logloss') # 交叉驗證計算 AUC auc = cross_val_score(model, X, labels, cv=tscv, scoring='roc_auc').mean() return auc study = optuna.create_study(direction='maximize', sampler=TPESampler(seed=42)) study.optimize(objective, n_trials=100) print('Best params:', study.best_params) > **技巧**: > 1. **早停**:在訓練過程中使用 `early_stopping_rounds`,可防止過擬合。 > 2. **多指標評估**:在金融中不僅看準確率,還應關注 Sharpe、Sortino、信息比率等。 > 3. **穩健性測試**:在不同市場、不同時間段做多次驗證,確保模型不受單一環境影響。 --- ### 4.6 模型部署前的「可行性」檢驗 模型在理論上表現優秀,實際交易時還需考量以下因素。 | 項目 | 重要性 | 檢驗方式 | |------|--------|----------| | 滑點 | 高 | 模擬交易時引入滑點模型(例如基於 VWAP) | | 手續費 | 中 | 根據券商結構調整策略閾值 | | 風險控制 | 高 | 設置止損、風險敞口上限 | | 資金流動性 | 中 | 檢查持倉與可交易量是否匹配 | | 計算延遲 | 高 | 監控模型推斷時間,確保低於交易窗口 | > **案例**: > 在交易量較低的時段,使用「動態滑點」模型(根據當前成交量自適應調整滑點大小)可大幅提升策略實際報酬。 --- ### 4.7 小結 1. **監督式模型**:適合方向、波動率預測,常用 XGBoost、LightGBM、LSTM 等。 2. **非監督式模型**:PCA、聚類、Isolation Forest 等,主要用於特徵降維、異常偵測與市場狀態分類。 3. **特徵工程**:金融特徵的質量決定模型表現,特徵選擇與重要性評估不可忽視。 4. **時間序列交叉驗證**:TimeSeriesSplit 與 Walk‑Forward Validation 是避免前瞻性偏差的關鍵。 5. **調參**:Grid、Random、Optuna 等方法皆可,重點是使用多指標評估。 6. **實務可行性**:滑點、手續費、風險控制等都需在策略前期評估。 > **下一章**:將帶您進入 **量化策略設計與回測**,學習如何將上述模型轉化為可執行的交易策略,並在模擬環境中驗證其效能。