聊天視窗

數據驅動的投資分析:從基礎到實戰 - 第 4 章

第4章 量化模型基礎:回歸、因子模型、機器學習

發布於 2026-02-27 09:04

## 第4章 量化模型基礎:回歸、因子模型、機器學習 本章將帶領讀者從最基礎的統計迴歸,深入到多因子模型,再延伸至現代機器學習方法,形成完整的量化投資建模流程。重點不僅在於理論說明,更配合實務範例與程式碼,確保讀者能直接套用於自己的投資分析。 --- ### 4.1 迴歸分析 | 主題 | 內容概覽 | |------|----------| | OLS | 最小平方法,基礎線性迴歸 | | 迴歸診斷 | 多重共線性、異方差、自相關 | | 正則化 | Ridge、Lasso、Elastic Net | | 模型評估 | R²、Adjusted R²、RMSE、MAE | #### 4.1.1 最小平方法(OLS) 迴歸模型: \[ Y = \beta_0 + \sum_{i=1}^{k}\beta_i X_i + \epsilon \] - **\(Y\)**:目標變數(如股票報酬) - **\(X_i\)**:解釋變數(如市場報酬、公司基本面) - **\(\epsilon\)**:誤差項 使用 Python `statsmodels` 進行單因子市場回歸示範: python import pandas as pd import statsmodels.api as sm # 假設 data 為包含 'ret' (個股報酬) 與 'mkt' (市場報酬) 的 DataFrame X = sm.add_constant(data['mkt']) # 加入截距項 model = sm.OLS(data['ret'], X).fit() print(model.summary()) #### 4.1.2 迴歸診斷與正則化 - **多重共線性**:利用 VIF (Variance Inflation Factor) 評估;VIF>5 或 10 通常需要處理。 - **異方差**:Breusch–Pagan 檢定;若異方差嚴重,採用 Robust 標準誤或 Weighted Least Squares。 - **正則化**:Ridge(L2)可降低共線性影響,Lasso(L1)可實現變數選擇。 示範 Lasso 變數選擇: python from sklearn.linear_model import LassoCV X = data.drop(columns='ret') y = data['ret'] lasso = LassoCV(cv=5).fit(X, y) print('Selected features:', X.columns[lasso.coef_ != 0]) ### 4.2 因子模型 | 模型 | 特色 | |------|------| | CAPM | 市場風險溢酬 | | APT | 多因子風險溢酬 | | Fama‑French 3 因子 | 市場 + SMB + HML | | Carhart 4 因子 | 加入 MOM | #### 4.2.1 CAPM CAPM 定式: \[ E[R_i] = R_f + \beta_i\,(E[R_m] - R_f) \] - **\(R_f\)**:無風險利率 - **\(\beta_i\)**:資產相對市場風險度 - **\(E[R_m] - R_f\)**:市場風險溢酬 實作示範(使用 `pandas_datareader`): python import pandas_datareader.data as web import datetime start, end = datetime.datetime(2015,1,1), datetime.datetime(2020,12,31) # 無風險利率 (美國 3‑month T‑Bill) rf = web.DataReader('DGS3MO', 'fred', start, end)['DGS3MO']/100/12 # 市場指數 (S&P 500) sp500 = web.DataReader('SPY', 'yahoo', start, end)['Adj Close'].pct_change().dropna() # 資產 (例:AAPL) aapl = web.DataReader('AAPL', 'yahoo', start, end)['Adj Close'].pct_change().dropna() # 合併資料 returns = pd.concat([sp500, aapl, rf], axis=1).dropna() returns.columns = ['Mkt', 'AAPL', 'RF'] X = returns['Mkt'] - returns['RF'] # 市場風險溢酬 y = returns['AAPL'] - returns['RF'] # 資產風險溢酬 beta, intercept, r_value, p_value, std_err = scipy.stats.linregress(X, y) print('Beta:', beta) #### 4.2.2 APT 與多因子模型 APT 允許多個獨立因子,且每個因子皆可帶來風險溢酬。常見因子包括: - 市場因子 - 風險因子(Volatility, Size, Value 等) - 宏觀因子(利率、GDP 成長率) Fama‑French 3 因子模型的實作範例: python # 下載 Fama‑French 因子資料 ff_factors = web.DataReader('F-F_Research_Data_Factors', 'famafrench', start, end)[0]/100 # 取 SMB 與 HML smb, hml = ff_factors['SMB'], ff_factors['HML'] X = pd.concat([returns['Mkt'] - returns['RF'], smb, hml], axis=1) y = returns['AAPL'] - returns['RF'] model = sm.OLS(y, X).fit() print(model.summary()) #### 4.2.3 因子構造與擬合技巧 1. **因子選擇**:先使用簡單回歸或因子擴充測試確定有顯著風險溢酬的因子。 2. **多重共線性**:在多因子模型中常見,使用 VIF 或剔除高度相關因子。 3. **風險調整**:在 `factor_model` 迴歸後,可使用 Sharpe Ratio、Information Ratio 評估模型表現。 4. **擬合驗證**:利用前置資料做 factor loadings,後置資料做 out‑of‑sample 回測。 ### 4.3 機器學習模型 | 方法 | 主要用途 | |------|----------| | 隨機森林 (Random Forest) | 非線性關係、特徵重要性 | | XGBoost | 梯度提升樹、速度快、可處理缺失 | | SVM | 高維資料、非線性邊界 | | 深度學習 | LSTM、Transformer 於時間序列預測 | #### 4.3.1 隨機森林 - **核心概念**:利用多棵決策樹做投票或平均,減少過擬合。 - **特徵重要性**:Mean Decrease Impurity (MDI) 或 Permutation Importance。 示範: python from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import cross_val_score X = data.drop(columns='ret') y = data['ret'] rf = RandomForestRegressor(n_estimators=500, max_depth=5, random_state=42) cv_scores = cross_val_score(rf, X, y, cv=5, scoring='neg_root_mean_squared_error') print('CV RMSE:', -cv_scores.mean()) rf.fit(X, y) print('Feature importance:', pd.Series(rf.feature_importances_, index=X.columns).sort_values(ascending=False)) #### 4.3.2 XGBoost XGBoost 是基於梯度提升樹的高效實作,常在競賽中取得優異成績。關鍵參數包括: - `max_depth`:樹的深度 - `learning_rate`:學習速率 - `subsample`、`colsample_bytree`:減少過擬合 - `reg_lambda`、`reg_alpha`:正則化項 示範: python import xgboost as xgb X_train, X_test = X.iloc[:-100], X.iloc[-100:] y_train, y_test = y.iloc[:-100], y.iloc[-100:] model = xgb.XGBRegressor(n_estimators=800, learning_rate=0.05, max_depth=4, subsample=0.8, colsample_bytree=0.8, random_state=42) model.fit(X_train, y_train) pred = model.predict(X_test) rmse = np.sqrt(mean_squared_error(y_test, pred)) print('XGBoost RMSE:', rmse) #### 4.3.3 模型評估與過擬合防範 | 指標 | 用途 | |------|------| | RMSE / MAE | 連續預測 | | R² / Adjusted R² | 解釋力 | | ROC‑AUC | 分類任務 | | Information Ratio | 風險調整後表現 | - **交叉驗證**:k‑fold、時間序列 CV。對於非隨機樣本,`TimeSeriesSplit` 更為妥當。 - **學習曲線**:觀察 training 與 validation error,檢查 bias‑variance trade‑off。 - **特徵工程**:log‑變換、標準化、平滑、衍生因子(如 momentum)。 --- ### 4.4 實務流程概念化 mermaid flowchart TD A[資料清理] --> B[特徵工程] B --> C{選擇模型} C -->|迴歸| D[OLS / 正則化] C -->|多因子| E[CAPM / APT / Fama‑French] C -->|機器學習| F[Random Forest / XGBoost] D & E & F --> G[模型評估] G --> H[回測] H --> I[風險控制] I --> J[投資決策] **關鍵步驟說明**: 1. **資料清理**:缺失值處理、日曆調整、對數收益計算。 2. **特徵工程**:變數標準化、衍生因子、滯後項。 3. **模型選擇**:根據投資目標選擇線性回歸、因子模型或機器學習。 4. **評估與驗證**:交叉驗證、時間序列 CV、資訊比率。 5. **回測與優化**:將模型產生的信號套用於策略,評估 Sharpe、Sortino、最大回撤等。 6. **風險控制**:設定止損、持倉比例、風險預算。 --- ### 4.5 小結 - **回歸分析**是理解市場關係的第一步,提供了簡單且直觀的解釋。 - **因子模型**將市場風險拆解為多個可度量的風險因子,幫助捕捉風險溢酬。 - **機器學習模型**(隨機森林、XGBoost 等)擴展了非線性與高維度資料的處理能力,提升預測精度。 - 任何模型的成功,關鍵在於**資料品質、特徵選擇、過擬合控制**與**嚴謹的回測**。 未來章節將以此建模基礎,結合策略開發、風險管理與執行機制,形成完整的量化投資體系。