返回目錄
A
量化投資之道:理論、模型與實戰 - 第 4 章
第4章 因子模型的建構與驗證
發布於 2026-02-23 19:22
# 第4章 因子模型的建構與驗證
在量化投資的世界裡,因子模型不僅是理論框架,更是實戰中的利器。本章將帶你從因子設計、資料預處理,到模型擬合、評估與迭代,完整呈現因子投資策略的開發流程。透過 Python 程式範例,你可以快速驗證概念、調整參數、並在實際資料中測試效能。
---
## 4.1 因子選取與定義
1. **基本因子**:市值、價值、動量、品質、波動率等。
2. **主題因子**:ESG、AI、區塊鏈等新興領域。
3. **自訂因子**:結合公司財報、新聞情感、宏觀指標。
因子設計要考量三個層面:
- **可解釋性**:投資者能夠理解因子的來源與意義。
- **可獲取性**:資料必須穩定且易於收集。
- **訊號強度**:因子在歷史期間內必須具備顯著的超額報酬。
> **提示**:在初步挑選後,建議使用資訊量測試(如信息值、因子分布)來篩選高質量因子。
---
## 4.2 數據處理與標準化
### 4.2.1 資料對齊
- **時間同步**:對於多資產因子,必須確保同一天的價格與因子值對齊。
- **缺失值處理**:可使用前向填充、後向填充或插值;若缺失率過高,請刪除該樣本。
### 4.2.2 標準化
因子量化通常使用 Z‑score 或 0‑1 轉換,使不同尺度的因子可直接比較。
```python
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 假設 df_factor 已經對齊完成
scaler = StandardScaler()
X_scaled = scaler.fit_transform(df_factor)
X_scaled_df = pd.DataFrame(X_scaled, index=df_factor.index, columns=df_factor.columns)
```
---
## 4.3 模型擬合與評估
### 4.3.1 多重迴歸
最傳統的因子模型使用多重迴歸:
```python
import statsmodels.api as sm
# 回歸:每個資產的月報酬率 = 常數 + β1*因子1 + β2*因子2 + … + ε
Y = returns_monthly
X = sm.add_constant(X_scaled_df)
model = sm.OLS(Y, X).fit()
print(model.summary())
```
### 4.3.2 交叉驗證
為避免過度擬合,建議使用時間序列交叉驗證(Walk‑Forward):
```python
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(X_scaled_df):
X_train, X_test = X_scaled_df.iloc[train_idx], X_scaled_df.iloc[test_idx]
Y_train, Y_test = Y.iloc[train_idx], Y.iloc[test_idx]
model = sm.OLS(Y_train, sm.add_constant(X_train)).fit()
preds = model.predict(sm.add_constant(X_test))
# 计算 R² 或信息值等指标
```
### 4.3.3 風險調整後的績效
- **夏普比率**:衡量每單位波動所帶來的超額報酬。
- **Information Ratio**:衡量因子模型對基準的解釋能力。
- **Factor Exposures**:檢查因子載荷是否穩定。
---
## 4.4 驗證與迭代
1. **時間延伸**:將模型投射至不同市場時期,檢查一致性。
2. **資料重抽樣**:使用不同的訓練/測試比例,觀察績效波動。
3. **正則化**:如 Ridge、Lasso,減少多重共線性。
4. **因子組合**:將多個因子加權,形成多因子策略。
> **實務建議**:每一次模型重訓時,都要重新計算因子值,確保因子與市場同步更新;否則策略會產生「過期」風險。
---
## 4.5 實務範例:三因子模型 + 滑動窗口回測
```python
import yfinance as yf
import pandas as pd
import numpy as np
from datetime import datetime
# 1. 下載股票資料
symbols = ['AAPL', 'MSFT', 'GOOG', 'AMZN', 'FB']
prices = yf.download(symbols, start='2015-01-01', end='2023-12-31')['Adj Close']
returns = prices.pct_change().dropna()
# 2. 下載市場、無風險與 SMB、HML 指數
market = yf.download('^GSPC', start='2015-01-01', end='2023-12-31')['Adj Close'].pct_change().dropna()
rf = yf.download('^IRX', start='2015-01-01', end='2023-12-31')['Adj Close'].pct_change().fillna(0)
# SMB、HML 這裡假設已經在外部 csv
smb = pd.read_csv('smb.csv', index_col=0, parse_dates=True)
hml = pd.read_csv('hml.csv', index_col=0, parse_dates=True)
# 3. 形成因子矩陣
X_factors = pd.concat([market.shift(1).loc[returns.index], smb.loc[returns.index], hml.loc[returns.index], rf.shift(1).loc[returns.index]], axis=1)
X_factors.columns = ['MKT', 'SMB', 'HML', 'RF']
# 4. 滑動窗口回測
window_size = 36 # 3 年
results = []
for start in range(0, len(returns) - window_size):
train_idx = returns.index[start:start+window_size]
test_idx = returns.index[start+window_size:start+window_size+12] # 1 年測試
Y_train = returns.loc[train_idx]
X_train = X_factors.loc[train_idx].dropna()
model = sm.OLS(Y_train.mean(axis=1), sm.add_constant(X_train)).fit()
# 取測試期因子值
X_test = X_factors.loc[test_idx].dropna()
# 產生預測報酬
pred = model.predict(sm.add_constant(X_test))
alpha = pred - rf.loc[test_idx].mean()
results.append(alpha)
alpha_series = pd.concat(results)
print('平均 alpha:', alpha_series.mean())
print('夏普比率:', alpha_series.mean() / alpha_series.std())
```
> **說明**:以上範例僅作演示,實務上需考慮稅費、交易成本、權重限制等。
---
## 小結
- **因子設計**是策略成功的關鍵,需結合市場經驗與統計驗證。
- **資料品質**與**標準化**能顯著提升模型穩定性。
- **交叉驗證**與**滑動窗口**是避免資訊洩漏與過度擬合的有效方法。
- **績效指標**(夏普、Information Ratio)提供快速評估因子模型效能的工具。
> **結語**:因子模型就像航海圖;設計越細緻、測試越嚴謹,你在市場的航程就越安全。接下來的章節,我們將進一步探討 **時間序列預測** 與 **機器學習** 在量化投資中的應用。