返回目錄
A
量化投資之道:理論、模型與實戰 - 第 9 章
第 9 章 因子時間序列預測與機器學習模型在因子預測中的應用
發布於 2026-02-24 00:37
# 第 9 章 因子時間序列預測與機器學習模型在因子預測中的應用
> **章節重點**:學習如何將因子值視為時間序列,運用統計與機器學習方法進行預測;掌握特徵工程、模型選擇、評估指標與實際部署。
## 1. 為何將因子視為時間序列
| 觀點 | 說明 |
|------|------|
| **因子本質** | 多數因子(如價值、動量、品質)本身隨時間變動,構成一條可觀測的時間序列。 |
| **預測價值** | 透過預測因子未來值,可在組合構建前提前鎖定信號,提高進場/出場時機。 |
| **風險調整** | 預測誤差可視為預測風險,結合風險模型更完整的風險度量。 |
> **提示**:預測因子並非簡單的「加上均值」,需考慮自相關、季節性、突發事件等特徵。
## 2. 資料前處理與特徵工程
### 2.1 資料清洗
- **缺失值處理**:對於週期性缺失,使用前後值插補;對於長期缺失,可考慮使用多重插補或直接剔除。<br>
- **異常值檢測**:利用 3×IQR 或 MAD 方法,將異常點視為 NaN 再做插補。
### 2.2 變換與標準化
| 變換 | 目的 |
|------|------|
| **對數變換** | 消除偏態,提升線性關係。 |
| **差分** | 去除非平穩性,尤其對於價格相關因子。 |
| **Z‑score** | 使不同因子尺度一致,利於多因子組合。
### 2.3 時間特徵
- **滾動窗口統計**:滾動平均、方差、最大最小等。<br>
- **季節性分解**:使用 STL 分解後,保留趨勢、季節、殘差三項。<br>
- **事件指標**:如財報發布、宏觀公告,編碼為 0/1 變量。
### 2.4 交叉衍生特徵
- **因子差值**:兩個同類因子之差,如價值因子與低波動因子。<br>
- **因子乘積**:捕捉非線性交互,如 `size * quality`。
> **實務提醒**:過度擴張特徵往往導致「維度災難」。在模型初期,先以 **特徵重要性** 或 **Lasso** 篩選關鍵特徵。
## 3. 時間序列預測基礎模型
| 模型 | 公式/原理 | 優缺點 |
|------|------------|--------|
| ARMA(p,q) | `X_t = φ₁X_{t-1}+…+φ_pX_{t-p}+θ₁ε_{t-1}+…+θ_qε_{t-q}+ε_t` | 解析性強,適合低維;對非線性、異方差不友好。 |
| ARIMA | 加入差分 `Δ^d X_t` 以處理非平穩。 | 可自動處理趨勢;參數選擇複雜。 |
| SARIMA | 加入季節性參數 `(P, D, Q, s)` | 針對季節性,適合宏觀周期。 |
| Prophet | 拆分趨勢、季節、假日效應 | 使用簡單,易於解釋;對長期異常敏感。
> **實作範例**(Python):
> python
> from statsmodels.tsa.statespace.sarimax import SARIMAX
> model = SARIMAX(factor_series, order=(1,1,1), seasonal_order=(1,1,1,12))
> results = model.fit(disp=False)
> forecast = results.forecast(steps=20)
>
## 4. 機器學習模型在因子預測中的應用
### 4.1 監督學習基礎
| 模型 | 主要特徵 |
|------|----------|
| 隨機森林 | 多決策樹集成,非線性,對異常值不敏感 |
| XGBoost / LightGBM | 梯度提升樹,支持稀疏特徵,速度快 |
| SVM (RBF) | 捕捉複雜非線性關係,需大量數據 |
### 4.2 深度學習:LSTM / GRU
| 何時使用 | 優點 |
|----------|------|
| 多週期、長序列預測 | 捕捉長期依賴,對非線性有較強適應性 |
| 訓練資料量 > 10k | 深度模型才能發揮作用 |
#### 4.2.1 LSTM 範例
python
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
model = Sequential([
LSTM(64, input_shape=(n_steps, n_features), return_sequences=True),
Dropout(0.2),
LSTM(32),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(x_train, y_train, epochs=50, batch_size=32, validation_split=0.1)
> **注意**:LSTM 需要對資料做 **滑動窗口** 轉化,並保持資料的時間順序。缺失值插補與標準化同樣重要。
### 4.3 模型選擇與調參
- **交叉驗證**:使用 **TimeSeriesSplit** 而非隨機拆分,避免信息泄露。
- **評估指標**:RMSE、MAPE、對數損失;對於因子預測,**R²** 仍是常見指標。
- **特徵重要性**:對於樹模型,使用 `feature_importances_`;對於深度學習,利用 SHAP 或 Integrated Gradients 進行可解釋性分析。
## 5. 模型部署與實際交易
| 步驟 | 具體做法 |
|------|----------|
| **模型驗證** | 進行前向回測,確保預測信號在實際交易中的有效性。 |
| **預測窗口** | 設定每天或每週一次的預測窗口,並將結果輸入組合優化。 |
| **風險控管** | 使用 **預測誤差** 作為風險指標,設定止損或倉位限制。 |
| **交易執行** | 以預測因子值與閾值為基準觸發交易指令,並與滑點校正模型結合。 |
> **案例**:一支以 `quality` 因子為主的投資組合,使用 XGBoost 預測明日值,若預測值高於 75th 分位數即進場,低於 25th 分位數則平倉。整體回測期間年化 Sharpe 3.2,超額收益 12%。
## 6. 常見陷阱與對策
1. **過度擬合**:模型在歷史資料上表現好,但未來失效。解決:交叉驗證、正則化、早停。
2. **資料泄露**:使用未來資訊影響預測。檢查:確認滾動窗口不包含未來值。
3. **季節性誤判**:季節效應被誤解為趨勢。對策:使用 STL 或 SARIMA 確認。
4. **特徵冗餘**:過多特徵降低模型解釋性。對策:PCA 或 L1 正則化。
## 7. 小結
- **因子時間序列預測** 是將量化投資推向更主動的關鍵一步,能提前捕捉風險與機會。
- **機器學習模型** 提供了更靈活的非線性建模能力,但需嚴格驗證與風控。
- **實際部署** 必須結合風險控制、滑點校正與前向回測,確保策略可行。
> **行動點**:選擇一個你熟悉的因子,從資料清洗、特徵工程、模型選擇到實際回測,完整執行一次。將結果寫入 `report.ipynb`,並分享於社群,讓他人給予反饋。
---
> **下一章**:量化投資的高頻交易策略——從訊號生成到實時執行。