聊天視窗

量化投資之道:理論、模型與實戰 - 第 2 章

第二章:因子模型的理論與實務實作

發布於 2026-02-23 18:45

# 第二章:因子模型的理論與實務實作 > **備註**:本章將從最基礎的因子概念說起,逐步推導到多因子模型與實際 Python 實作。讀者可直接拷貝程式碼,運行於 Jupyter Notebook,並以自己的資料集做進一步驗證。 ## 1. 因子模型概念 因子模型是把資產報酬拆解為若干可觀測或可推估的「因子」對應的風險與收益。最常見的形式為線性回歸: \[ R_i = \alpha_i + \sum_{k=1}^{K} \beta_{ik}F_k + \varepsilon_i \] 其中: - **\(R_i\)**:資產 \(i\) 的實際報酬。 - **\(\alpha_i\)**:阿爾法,衡量模型未能捕捉的風險調整後的異常收益。 - **\(\beta_{ik}\)**:因子 \(k\) 的載荷,表示該資產對該因子敏感度。 - **\(F_k\)**:因子值,通常為時間序列。 - **\(\varepsilon_i\)**:誤差,假設為零均值、常數方差。 > **核心觀點**:因子模型不只是統計工具,更是一種市場機制的映射。若某個因子長期能解釋多數資產報酬,說明市場對該因子有系統性定價。 ## 2. Fama‑French 三因子模型 1988 年,Fama 與 French 提出市場因子外的兩個風險因子: | 因子 | 代表概念 | 建構方式 | |------|----------|----------| | Market (MKT) | 市場風險 | 市場指數回報-無風險利率 | | SMB (Small‑minus‑Big) | 公司規模 | 小市值公司回報-大市值公司回報 | | HML (High‑minus‑Low) | 估值 | 高帳面價值/市價比公司回報-低比公司回報 | 數學式: \[ R_i - R_f = \alpha_i + \beta_{i,MKT} (R_m - R_f) + \beta_{i,SMB} SMB + \beta_{i,HML} HML + \varepsilon_i \] > **實務建議**:SMB 與 HML 的計算常用 5 產業組別作為基礎,或直接使用 Bloomberg 提供的因子。若資料量不足,可先採用簡化的 1‑因子模型。 ## 3. 多因子擴充 | 典型擴充 | 典型來源 | |----------|----------| | CRSP 25 因子 | 市場、規模、估值、投資、動量、利率、波動性、貨幣政策 | | Barra 因子 | 產業、風險、流動性、流量 | | ESG 因子 | 環境、社會、治理指標 | > **注意**:隨著因子數量的增加,模型可能陷入「多重共線」或「過度擬合」。採用主成分分析 (PCA) 或 LASSO 等正則化方法可有效降低風險。 ## 4. 資料處理與因子構建 ### 4.1 取得歷史價格 python import yfinance as yf import pandas as pd # 下載 10 年內 50 支大型股 tickers = ['AAPL', 'MSFT', 'AMZN', 'GOOGL', 'FB', 'TSLA', 'JPM', 'JNJ', 'XOM', 'WMT'] price_df = yf.download(tickers, period='10y')['Adj Close'] ### 4.2 計算日回報 python returns = price_df.pct_change().dropna() ### 4.3 產生因子 python # 以市場指數為例(使用 SPY) market = yf.download('^GSPC', period='10y')['Adj Close'].pct_change().dropna() # SMB, HML 以 5 產業組別簡化示例 # 省略實作細節,使用預計算好的因子 DataFrame > **提示**:因子資料的時效性是關鍵,確保同一時間點的因子值與報酬對齊。 ## 5. 回歸模型與模型評估 ### 5.1 逐資產回歸 python import statsmodels.api as sm residuals = {} alphas = {} betas = {} for ticker in tickers: X = sm.add_constant(pd.concat([market, smb, hml], axis=1)) y = returns[ticker] model = sm.OLS(y, X).fit() alphas[ticker] = model.params['const'] betas[ticker] = model.params[['Market', 'SMB', 'HML']] residuals[ticker] = model.resid ### 5.2 模型診斷 | 指標 | 目的 | |------|------| | R² | 解釋變異比例 | | Adjusted R² | 針對因子數量調整 | | VIF | 檢測共線性 | | Shapiro‑Wilk | 檢查殘差正態性 | > **風險提示**:高 R² 並不代表能夠產生高阿爾法。實際上阿爾法往往是模型外的訊號,需要進一步的策略驗證。 ## 6. 風險調整收益 ### 6.1 夏普比率 \[ \text{Sharpe} = \frac{\bar{R}_p - R_f}{\sigma_p} \] ### 6.2 該死因子風險貢獻 使用 `riskfolio-lib` 或手寫方法計算因子貢獻度。 ## 7. Python 實作範例:完整回測流程 python # 1. 下載數據 # 2. 計算回報與因子 # 3. 逐資產回歸,提取阿爾法 # 4. 根據阿爾法排序,構建投資組合 # 5. 進行等權或風險加權回測 # 6. 評估績效:夏普、最大回撤、信息比率 > **實務建議**:把回測流程寫成類別,方便重複使用。記得使用 `backtrader` 或 `zipline` 做為後端。 ## 8. 常見陷阱與最佳實踐 1. **數據頻率不一致**:日報酬與週期性因子需要對齊。解決方案:用 `resample` 或 `ffill`。 2. **過度擬合**:模型在訓練集表現優秀,但實盤失效。解決方案:交叉驗證、正則化、減少因子數。 3. **因子漂移**:因子係數隨時間變化。解決方案:滑動窗口回歸、動態因子選擇。 4. **缺失值處理**:簡單填補會導致偏差。解決方案:使用多重插補或刪除含缺失值的樣本。 5. **交易成本忽略**:高頻交易策略容易被手續費侵蝕。解決方案:在回測中加入固定成本或基於成交量的成本模型。 ## 9. 小結與展望 - **因子模型是量化投資的核心工具**,提供從風險定價到績效評估的完整框架。 - **實務中需兼顧數據質量、模型簡潔與交易成本**,以避免「過度擬合」與「因子漂移」。 - **未來章節將探討時間序列預測與機器學習技術**,進一步提升因子模型的預測能力。 > **最後提醒**:數據驅動的投資不等於完全自動化。所有模型都需要經由人為的監控與調整,否則即使再好也可能因市場變化而失靈。