返回目錄
A
數據驅動的投資分析:從基礎到實戰 - 第 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 等)擴展了非線性與高維度資料的處理能力,提升預測精度。
- 任何模型的成功,關鍵在於**資料品質、特徵選擇、過擬合控制**與**嚴謹的回測**。
未來章節將以此建模基礎,結合策略開發、風險管理與執行機制,形成完整的量化投資體系。