返回目錄
A
量化投資的藝術:策略設計、實作與風險控管 - 第 5 章
第5章 機器學習與因子預測:從回測到實盤
發布於 2026-03-06 08:55
# 第5章 機器學習與因子預測:從回測到實盤
在前一章中,我們構建了一套多因子策略並進行了嚴謹的風險評估。現在,我們要把「因子」這個概念提升到「可預測的信號」的層級,並探索機器學習如何協助我們在資訊過載的市場中快速發現隱藏的投資機會。
---
## 5.1 機器學習模型概述
機器學習(ML)在量化投資中的應用並非新事物,但它在因子預測中的角色越來越關鍵。常見的模型包括:
| 模型 | 適用場景 | 主要優勢 |
|------|----------|----------|
| 線性迴歸 | 因子係數估計 | 直觀、可解釋 |
| 隨機森林 | 非線性關係 | 免除特徵尺度、天然特徵重要性 |
| XGBoost / LightGBM | 大規模特徵 | 高效、精度高 |
| LSTM | 時間序列預測 | 捕捉長期依賴 |
在本章,我們以 **XGBoost** 為示範模型,因為它在處理高維特徵、缺失值以及非線性關係方面表現尤為突出。
---
## 5.2 特徵工程:從因子到機器學習特徵
1. **基本因子**:如市值、PE、PB、股息率、機械學習預測的回報。這些是模型的「基礎」。
2. **交互特徵**:例如 `PE * PB`、`市值 * 成長率`,用來捕捉因子之間的非線性關係。
3. **滾動統計**:如 20 天均值、標準差、偏度、峰度,能提供市場動態的「時間窗口」。
4. **技術指標**:RSI、MACD、布林帶等,常被交易者用來判斷短期趨勢。
5. **宏觀變數**:利率、匯率、GDP 成長率等,能幫助模型捕捉宏觀影響。
> **範例:創建交互特徵**
>
> python
> import pandas as pd
>
> df = pd.read_csv('factor_data.csv')
> df['PE_PB'] = df['PE'] * df['PB']
> df['MktCap_Growth'] = df['MarketCap'] * df['GrowthRate']
>
>
> 這些交互特徵將被視為新的輸入變數,增加模型的表現潛力。
>
>
> **小結**:特徵工程是機器學習的基石,好的特徵能讓模型更快收斂、降低過擬合風險。
---
## 5.3 模型訓練與評估
### 5.3.1 資料分割
python
from sklearn.model_selection import TimeSeriesSplit
X = df.drop(['target_return'], axis=1)
y = df['target_return']
tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):
X_train, X_test = X.iloc[train_index], X.iloc[test_index]
y_train, y_test = y.iloc[train_index], y.iloc[test_index]
# 這裡進行模型訓練
> **說明**:時間序列分割確保模型不會使用未來信息。
### 5.3.2 XGBoost 參數設置
python
import xgboost as xgb
params = {
'objective': 'reg:squarederror',
'eval_metric': 'rmse',
'learning_rate': 0.05,
'max_depth': 6,
'subsample': 0.8,
'colsample_bytree': 0.8,
'seed': 42,
}
model = xgb.XGBRegressor(**params)
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], early_stopping_rounds=50)
### 5.3.3 評估指標
| 指標 | 定義 |
|------|------|
| RMSE | 均方根誤差,衡量預測精度 |
| MAE | 平均絕對誤差,較不受離群值影響 |
| R² | 解釋變異比例,越接近 1 表示模型越好 |
python
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
pred = model.predict(X_test)
print('RMSE:', mean_squared_error(y_test, pred, squared=False))
print('MAE:', mean_absolute_error(y_test, pred))
print('R²:', r2_score(y_test, pred))
> **結果解讀**:若 R² < 0.2,模型預測能力不足,需要回到特徵工程或換模型。
---
## 5.4 结果解读与因子筛选
### 5.4.1 特征重要性
python
import matplotlib.pyplot as plt
importances = model.feature_importances_
feat_names = X.columns
idx = np.argsort(importances)[::-1][:20]
plt.figure(figsize=(10, 6))
plt.barh(range(len(idx)), importances[idx], align='center')
plt.yticks(range(len(idx)), [feat_names[i] for i in idx])
plt.xlabel('Feature Importance')
plt.title('Top 20 Features in XGBoost Model')
plt.gca().invert_yaxis()
plt.show()
> **洞見**:通常市值、波動率、PE、PB 仍佔主導,但交互特徵也可提供新視角。
### 5.4.2 生成因子信號
我們將模型預測的 `target_return` 轉換成「因子權重」:
python
factor_weight = pred / np.abs(pred).sum()
# 對於多個因子,我們可進行加權平均
> **提示**:若預測結果分布偏離正態,可先做 `np.sign` 或 `rank` 轉換,再進行投資分配。
---
## 5.5 真實交易部署
### 5.5.1 交易信號生成
python
# 假設每周一次策略回測
weekly_df = df.resample('W').last()
weekly_df['predicted_ret'] = model.predict(weekly_df.drop(['target_return'], axis=1))
# 只在預測正值時做多,負值時做空(或不持倉)
weekly_df['signal'] = np.where(weekly_df['predicted_ret'] > 0, 1, 0)
### 5.5.2 風險控制
- **最大持倉比例**:每支股票不超過 5%。
- **總風險暴露**:使用 `PortfolioVolatility` 限制至 12%。
- **動態止損**:若日內損失超過 1.5%,即時平倉。
python
# 風險控管範例
portfolio_value = 1_000_000
max_weight = 0.05
# 生成加權分配
weights = weekly_df['signal'] * max_weight
weights /= weights.sum() # 正規化
### 5.5.3 API 接口
如果你使用的是券商 API(如 Alpaca、盈透、富途等),可用以下簡易腳本發送訂單:
python
import alpaca_trade_api as tradeapi
api = tradeapi.REST('APCA-API-KEY-ID', 'APCA-API-SECRET-KEY', base_url='https://paper-api.alpaca.markets')
for symbol, w in zip(symbols, weights):
qty = int(portfolio_value * w / price[symbol])
api.submit_order(
symbol=symbol,
qty=qty,
side='buy',
type='market',
time_in_force='gtc'
)
> **備註**:交易成本與滑點應納入回測,避免理論收益過高。
---
## 5.6 小結
本章從機器學習模型選型、特徵工程、訓練評估,到信號生成與實盤部署,完整描繪了量化投資中「因子預測」的全流程。關鍵在於:
1. **特徵是王** – 高質量特徵是模型成功的基石。
2. **時間序列分割** – 保障模型不受未來訊息影響。
3. **風險控制** – 任何模型預測都須以風險管理為先。
4. **持續迭代** – 市場變化快,模型需定期重訓與參數調整。
在下一章,我們將進一步探討「深度學習在高頻交易中的應用」,並比較傳統機器學習與深度模型在不同市場環境下的表現差異。