聊天視窗

金融數據科學實戰:從原始數據到智能投資 - 第 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 對人才需求與技術演進的影響。