返回目錄
A
量化投資之道:理論、模型與實戰 - 第 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. 小結與展望
- **因子模型是量化投資的核心工具**,提供從風險定價到績效評估的完整框架。
- **實務中需兼顧數據質量、模型簡潔與交易成本**,以避免「過度擬合」與「因子漂移」。
- **未來章節將探討時間序列預測與機器學習技術**,進一步提升因子模型的預測能力。
> **最後提醒**:數據驅動的投資不等於完全自動化。所有模型都需要經由人為的監控與調整,否則即使再好也可能因市場變化而失靈。