聊天視窗

數據駕駛:從零開始的量化投資實戰 - 第 4 章

第 4 章:機器學習與特徵選擇:從簡單回歸到深度網絡

發布於 2026-02-20 21:50

# 第 4 章:機器學習與特徵選擇:從簡單回歸到深度網絡 在前一章中,我們已經掌握了統計推論的基礎,學會如何檢驗市場因子與個股報酬之間的關係。這些方法雖然強大,但在處理非線性、複雜交互效應時往往顯得力不從心。為了提升模型的預測力與泛化能力,本章將帶你步入機器學習的領域,從最簡單的線性回歸到深度學習模型,並透過實際範例說明如何有效地進行特徵工程、模型選擇與參數調優。 ## 4.1 什麼是機器學習? 機器學習(Machine Learning)是一種讓電腦從資料中「學習」模式與規則,進而做出預測或決策的技術。相較於傳統統計模型,機器學習不需要預先假設數據分布;它能夠自動捕捉資料中的非線性結構與高維交互關係。 > **筆記**:在量化投資中,常見的機器學習任務包括 > > * **回歸(Regression)**:預測未來收益率或波動率。 > * **分類(Classification)**:判斷市場趨勢(上漲/下跌)或產生買賣信號。 > * **聚類(Clustering)**:找出相似股票或市場區塊。 ## 4.2 資料前處理:特徵工程與資料增強 ### 4.2.1 特徵選擇(Feature Selection) 特徵過多會導致模型過擬合;特徵太少則可能無法捕捉關鍵訊息。常用方法有: | 方法 | 原理 | 優缺點 | |------|------|--------| | 相關係數 | 觀察特徵與目標變數的線性關係 | 只適用於線性關係 | | 主成分分析(PCA) | 降維,保留最大變異 | 可能失去解釋性 | | L1 正則化(Lasso) | 直接在模型中執行特徵選擇 | 需要合理選擇正則化係數 | ### 4.2.2 標準化與正規化 機器學習模型常對特徵尺度敏感。常見做法: python from sklearn.preprocessing import StandardScaler, MinMaxScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # Z-score 標準化 ### 4.2.3 資料增強 對於時間序列資料,可使用滑動窗口、延遲特徵、技術指標等方法生成新的特徵。 python # 產生 1 天滯後特徵 X['lag1'] = X['close'].shift(1) # 產生 5 天移動平均 X['ma5'] = X['close'].rolling(window=5).mean() ## 4.3 監督式學習模型介紹 ### 4.3.1 線性回歸(Linear Regression) 最簡單的模型,作為基準。 python from sklearn.linear_model import LinearRegression model = LinearRegression() model.fit(X_train, y_train) pred = model.predict(X_test) ### 4.3.2 支持向量機(SVM) 能捕捉非線性邊界,適合分類任務。 python from sklearn.svm import SVC svm = SVC(kernel='rbf', C=1.0, gamma='scale') svm.fit(X_train, y_train) ### 4.3.3 隨機森林(Random Forest) 基於樹模型的集成方法,對異常值與噪聲有良好魯棒性。 python from sklearn.ensemble import RandomForestRegressor rf = RandomForestRegressor(n_estimators=500, random_state=42) rf.fit(X_train, y_train) ### 4.3.4 XGBoost / LightGBM 梯度提升機(GBM)的高效實作,常在比賽中獲得高排名。 python import xgboost as xgb xgb_reg = xgb.XGBRegressor(n_estimators=300, learning_rate=0.05, max_depth=5) xgb_reg.fit(X_train, y_train) ## 4.4 交叉驗證與參數調優 ### 4.4.1 K‑Fold 交叉驗證 python from sklearn.model_selection import KFold, cross_val_score kfold = KFold(n_splits=5, shuffle=True, random_state=42) scores = cross_val_score(rf, X, y, cv=kfold, scoring='neg_mean_squared_error') print('MSE:', -scores.mean()) ### 4.4.2 隨機搜索與貝葉斯優化 python from sklearn.model_selection import RandomizedSearchCV param_grid = { 'n_estimators': [200, 400, 600], 'max_depth': [3, 5, 7], 'min_samples_split': [2, 5, 10] } search = RandomizedSearchCV(rf, param_grid, n_iter=20, cv=5, scoring='neg_mean_squared_error', random_state=42) search.fit(X, y) print('Best Params:', search.best_params_) ## 4.5 深度學習:多層感知機(MLP)與時序網路 ### 4.5.1 多層感知機(MLP) python from sklearn.neural_network import MLPRegressor mlp = MLPRegressor(hidden_layer_sizes=(128, 64), activation='relu', solver='adam', max_iter=200) mlp.fit(X_train, y_train) ### 4.5.2 長短期記憶網路(LSTM) 適合處理長時間依賴的股價序列。 python import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout # 轉換資料為 [samples, timesteps, features] X_seq = X.values.reshape((X.shape[0], 10, X.shape[1])) model = Sequential([ LSTM(64, return_sequences=True, input_shape=(10, X.shape[1])), Dropout(0.2), LSTM(32), Dense(1) ]) model.compile(optimizer='adam', loss='mse') model.fit(X_seq, y, epochs=50, batch_size=32) ## 4.6 常見陷阱與最佳實踐 | 風險 | 原因 | 解決方案 | |------|------|----------| | 資料泄露 | 在訓練集和測試集混用特徵 | 先分離再進行特徵工程 | | 过拟合 | 模型複雜度高 | 采用正則化、交叉驗證、剪枝 | | 計算成本 | 大規模資料訓練慢 | 使用 GPU、分布式訓練、特徵降維 | | 模型解釋性 | 黑盒模型 | 采用 SHAP、LIME 進行特徵重要性分析 | ## 4.7 小結 本章從機器學習的基本概念出發,循序漸進地介紹了資料前處理、特徵工程、監督式模型、交叉驗證、參數調優以及深度學習的實踐。這些工具為你在量化投資中建立更強大、更具預測力的模型奠定了堅實基礎。接下來,我們將聚焦於風險管理與組合優化,將模型輸出轉化為具體的交易決策。 ---