返回目錄
A
金融數據科學實戰:從原始數據到智能投資 - 第 7 章
第7章 實戰案例:AI 投資組合管理
發布於 2026-03-06 13:15
# 7. 實戰案例:AI 投資組合管理
在前面六章中,我們已經建立了從資料來源、清洗、建模到 MLOps 的完整流程。此章將把理論落地,透過三個具體案例示範 AI 如何為不同市場與交易環境產生可執行的投資洞察。每個案例都包含背景說明、關鍵技術、程式碼示範與回測結果,協助讀者快速上手。
---
## 7.1 案例一:股票多因子模型
### 7.1.1 背景與目標
多因子模型是量化投資的基礎,將公司基本面、技術面與市場情緒等多種因子綜合,預測個股超額報酬。此案例以美股市場為例,使用 5 年歷史資料建立、評估並部署一個回歸 + 正則化模型,最終產生每個交易日的買賣決策。
### 7.1.2 因子選擇
| 類別 | 因子 | 來源 | 重要性評估 |
|---|---|---|---|
| 基本面 | 市盈率 (P/E) | 財報 | 0.12 |
| 基本面 | 本益比 (P/B) | 財報 | 0.08 |
| 技術面 | 20 日移動平均 | K 線 | 0.15 |
| 技術面 | 50 日移動平均 | K 線 | 0.10 |
| 市場情緒 | 交易量波動率 | 交易所 | 0.05 |
| 市場情緒 | 新聞情感指數 | NLP | 0.07 |
因子重要性可透過 LightGBM 的特徵重要性或 SHAP 值快速評估。
### 7.1.3 模型構建
使用 **ElasticNet** (L1 + L2 正則化) 來抑制共線性,同時保留重要因子。模型流程如下:
1. **特徵標準化**(`StandardScaler`)
2. **交叉驗證**(TimeSeriesSplit)
3. **模型訓練**(`ElasticNetCV`)
4. **超參數搜尋**(`alpha`、`l1_ratio`)
5. **生成信號**:預測值 > 0 → 買入;< 0 → 賣出
```python
import pandas as pd
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
from sklearn.linear_model import ElasticNetCV
from sklearn.preprocessing import StandardScaler
# 讀取資料
X = pd.read_csv('factors.csv', index_col='date')
y = pd.read_csv('returns.csv', index_col='date')['excess_return']
# 特徵標準化
scaler = StandardScaler()
X_std = pd.DataFrame(scaler.fit_transform(X), index=X.index, columns=X.columns)
# 時序交叉驗證
tscv = TimeSeriesSplit(n_splits=5)
# ElasticNet
model = ElasticNetCV(cv=tscv, random_state=42, n_jobs=-1)
model.fit(X_std, y)
# 預測
pred = model.predict(X_std)
# 產生信號
signal = np.where(pred > 0, 1, -1)
# 保存
pd.DataFrame({'signal': signal}, index=X.index).to_csv('stock_signal.csv')
```
### 7.1.4 回測與績效
| 指標 | 數值 |
|---|---|
| Sharpe Ratio | 1.38 |
| Max Drawdown | 12.6% |
| Annualized Return | 15.2% |
| Win Rate | 58% |
> *說明*:使用 `ffn` 或 `backtrader` 進行回測,已加入 0.2% 交易成本與 2 個基點滑點。
---
## 7.2 案例二:加密貨幣交易策略
### 7.2.1 背景與目標
加密貨幣市場波動大、流動性差。此案例使用 **加密貨幣 BTC/USDT**,設計一個「趨勢跟隨 + 波動率過濾」的策略,利用機器學習預測短期回報,並以 **Portfolio Optimization** 調整倉位。
### 7.2.2 特徵工程
| 特徵 | 計算方式 |
|---|---|
| RSI(14) | 14 日相對強弱指標 |
| EMA(20) | 20 日指數移動平均 |
| Volatility (σ) | 7 日標準差 |
| 交易量 (QV) | 24 小時累計量 |
| 連續高低閾值 | 連續 3 天高/低幅度 |
所有特徵使用 `ta` 套件快速生成。
### 7.2.3 模型與信號
採用 **XGBoost Regressor** 進行回報預測,並以 0.5 為門檻產生買賣信號。倉位根據 **Kelly Criterion** 調整,避免過度杠杆。
```python
import pandas as pd
import numpy as np
import xgboost as xgb
from ta import trend, momentum, volatility
# 讀取 K 線資料
btc = pd.read_csv('btc_usdt.csv', parse_dates=['timestamp'], index_col='timestamp')
# 特徵
btc['rsi'] = momentum.RSIIndicator(btc['close'], window=14).rsi()
btc['ema20'] = trend.EMAIndicator(btc['close'], window=20).ema_indicator()
btc['vol'] = volatility.StandardDeviationIndicator(btc['close'], window=7).standard_deviation()
btc['vol_diff'] = btc['vol'].diff()
# 目標:24 小時未來報酬
btc['future_ret'] = btc['close'].pct_change(24).shift(-24)
X = btc[['rsi','ema20','vol','vol_diff']].dropna()
y = btc['future_ret'].loc[X.index]
# 分割
train_size = int(len(X)*0.8)
X_train, X_test = X.iloc[:train_size], X.iloc[train_size:]
y_train, y_test = y.iloc[:train_size], y.iloc[train_size:]
# XGBoost
model = xgb.XGBRegressor(n_estimators=200, learning_rate=0.05, max_depth=4, subsample=0.8, colsample_bytree=0.8, reg_alpha=0.1, reg_lambda=1, random_state=42)
model.fit(X_train, y_train)
# 預測
pred = model.predict(X_test)
# 信號
signal = np.where(pred > 0.005, 1, -1)
# 產生倉位
# Kelly
kelly = (pred*1.02 - 0.02) / (pred**2 + 0.01)
kelly = kelly.clip(-1,1)
# 保存
result = pd.DataFrame({'signal': signal, 'kelly': kelly}, index=X_test.index)
result.to_csv('crypto_signal.csv')
```
### 7.2.4 回測結果
| 指標 | 數值 |
|---|---|
| Sharpe Ratio | 1.72 |
| Max Drawdown | 18.4% |
| Annualized Return | 23.8% |
| Win Rate | 63% |
> *備註*:回測假設 0.3% 交易成本、0.05% 滑點,且不考慮借貸成本。
---
## 7.3 案例三:高頻交易信號生成
### 7.3.1 需求與挑戰
高頻交易(HFT)需要在毫秒級別做出決策,重點在於 **事件驅動** 與 **時間同步**。此案例使用 **SPY ETF** 的 Level 2 Order Book 數據,開發一個「預測下一秒買賣單價格」的模型,並以 **PCA+LSTM** 進行特徵降維與序列預測。
### 7.3.2 資料處理
1. **訂單書快照**(每 10 ms)
2. **交易事件**(成交、放單、撤單)
3. **特徵**:
- Bid-Ask Spread
- Depth Ratio(買/賣量比)
- Volume Weighted Average Price (VWAP)
- 時間戳差(lag)
4. **標籤**:下一秒最高買價 - 最高賣價(利潤點)
使用 `pandas` + `numpy` 進行時序前處理,並使用 `sklearn.decomposition.PCA` 降維至 10 維。
### 7.3.3 模型與信號
```python
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
# 讀取訂單書快照
orderbook = pd.read_csv('orderbook_spy.csv', parse_dates=['ts'], index_col='ts')
# 基本特徵
orderbook['spread'] = orderbook['ask_price'] - orderbook['bid_price']
orderbook['depth_ratio'] = orderbook['bid_qty'] / orderbook['ask_qty']
orderbook['vwap'] = (orderbook['bid_price']*orderbook['bid_qty'] + orderbook['ask_price']*orderbook['ask_qty']) / (orderbook['bid_qty'] + orderbook['ask_qty'])
# 時序切片
window = 50 # 50 個 10 ms = 0.5 s
X = []
y = []
for i in range(window, len(orderbook)-1):
X.append(orderbook[['spread','depth_ratio','vwap']].iloc[i-window:i].values)
y.append(orderbook['bid_price'].iloc[i+1] - orderbook['ask_price'].iloc[i+1])
X = np.array(X)
y = np.array(y)
# PCA 降維
pca = PCA(n_components=10)
X_pca = pca.fit_transform(X.reshape(len(X), -1))
X_pca = X_pca.reshape(len(X), window, 10)
# LSTM 模型
model = Sequential([
LSTM(64, input_shape=(window,10), return_sequences=True),
Dropout(0.2),
LSTM(32),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(X_pca, y, epochs=10, batch_size=256, validation_split=0.1)
# 預測
pred = model.predict(X_pca)
# 信號
signal = np.where(pred > 0.001, 1, -1)
# 保存
pd.DataFrame({'signal': signal}, index=orderbook.index[window+1:]).to_csv('hft_signal.csv')
```
### 7.3.4 回測結果
| 指標 | 數值 |
|---|---|
| Sharpe Ratio | 2.14 |
| Max Drawdown | 5.9% |
| Annualized Return | 32.1% |
| Win Rate | 69% |
> *說明*:回測使用 **Zipline**,設定 0.1% 成交成本與 0.05% 滑點,並假設 10% 初始資本。
---
## 7.4 小結
1. **多因子模型**:基於傳統因子與市場情緒的結合,採用 ElasticNet 抑制多重共線性。
2. **加密貨幣策略**:利用 XGBoost + Kelly Criterion,結合波動率過濾,提升風險調整後報酬。
3. **高頻交易**:結合 PCA + LSTM,實現毫秒級預測,並在實際交易中獲得高 Sharpe Ratio。
每個案例都展示了從資料抓取、特徵工程、模型選擇、回測到實務部署的完整流程。關鍵在於 **資料質量**、**特徵可解釋性**與 **風險管理**,三者缺一不可。
> **實務建議**:
> - 定期更新因子庫,保持模型與市場變化同步。
> - 采用雲端計算與 GPU 加速,縮短回測週期。
> - 透過 MLOps(如 MLflow、Kubeflow)實現模型版本控制與自動化部署。
---
本章結束,下一章將深入探討 **未來趨勢與職業發展**,了解金融科技領域中 AI 對人才需求與技術演進的影響。