返回目錄
A
自由數據:用資料科學解鎖個人財務自由 - 第 5 章
第五章:量化投資策略的建構與驗證
發布於 2026-02-25 02:36
# 量化投資策略的建構與驗證
在前面幾章中,我們已經掌握了財經數據的抓取、清洗與特徵工程,現在要將這些資料投入模型,打造屬於自己的投資策略。
## 1. 目標設定:什麼是量化投資?
量化投資(Quantitative Investing)不僅僅是寫幾行程式碼;它是一種以數據為基礎、可重複、可測量的投資思維。核心目標是:
1. **定義投資邏輯**:確定哪些市場因子、風險因子或訊號能帶來超額報酬。
2. **構建可執行模型**:將邏輯轉化為可自動化執行的交易規則。
3. **驗證與風險控制**:通過歷史回測、壓力測試與風險度量,確保模型在不同市場環境下皆具備穩定性。
## 2. 資料準備:歷史行情 + 特色因子
| 資料來源 | 內容 | 目的 |
|----------|------|------|
| Yahoo Finance | `Adj Close`, `Volume`, `Open`, `High`, `Low` | 基礎行情 |
| FRED | 經濟指標(GDP、失業率) | 宏觀因子 |
| Twitter API | 市場情緒 | 替代數據 |
| Bloomberg API | 產業因子 | 深度行業分析 |
> **Tip**:在量化投資中,**資料多樣性**往往是突破點。試著將新聞情緒、社群討論熱度與傳統財務指標結合,能挖掘出不同時間尺度的訊號。
## 3. 特徵工程:從原始資料到可交易訊號
1. **技術指標**:RSI、MACD、布林帶。
2. **統計特徵**:對數收益、年化波動率、夏普比率。
3. **機器學習特徵**:滑動窗口的均值與標準差、PCA 取主成分。
4. **替代因子**:Twitter sentiment score、Google Trends 搜尋熱度。
python
import pandas as pd
import numpy as np
from ta import add_all_ta_features
# 讀取行情資料
price_df = pd.read_csv('sp500_adj_close.csv', parse_dates=['Date'], index_col='Date')
# 產生技術指標
price_df = add_all_ta_features(price_df, open=None, high=None, low=None, close='Adj Close', volume=None)
# 加入情緒因子
sentiment = pd.read_csv('twitter_sentiment.csv', parse_dates=['Date'], index_col='Date')
price_df = price_df.join(sentiment, how='left').fillna(0)
> **Pro Tip**:在特徵選擇時使用 **L1 正則化(Lasso)** 或 **特徵重要性排序**,能有效剔除冗餘特徵,降低過擬合風險。
## 4. 模型構建:從線性回歸到強化學習
### 4.1 基本回歸模型
python
from sklearn.linear_model import Ridge
from sklearn.model_selection import TimeSeriesSplit, cross_val_score
X = price_df.drop(columns=['Adj Close'])
y = price_df['Adj Close'].pct_change().shift(-1).dropna()
X = X.loc[y.index]
# 時間序列交叉驗證
tscv = TimeSeriesSplit(n_splits=5)
ridge = Ridge(alpha=1.0)
scores = cross_val_score(ridge, X, y, cv=tscv, scoring='neg_mean_squared_error')
print('MSE:', -scores.mean())
### 4.2 隨機森林與 XGBoost
隨機森林能捕捉非線性關係,而 XGBoost 在梯度提升上表現卓越。兩者都能處理高維特徵,並提供特徵重要性指標。
### 4.3 強化學習:Q‑Learning 之簡易實作
對於多策略選擇與動態配置,強化學習提供了一種自我優化的框架。
python
import numpy as np
states = np.arange(10) # 風險等級
actions = np.arange(3) # 交易訊號(買、持、賣)
Q = np.zeros((len(states), len(actions)))
alpha = 0.1
gamma = 0.9
for episode in range(1000):
state = np.random.choice(states)
action = np.random.choice(actions)
reward = np.random.randn() # 模擬報酬
next_state = np.random.choice(states)
Q[state, action] += alpha * (reward + gamma * Q[next_state].max() - Q[state, action])
> **Caution**:強化學習模型需要大量歷史資料與嚴謹的離線驗證,否則易陷入過擬合。
## 5. 回測與風險評估
### 5.1 回測框架
- **Zipline**:Python 的開源回測庫,適合日線與更高頻交易。
- **Backtrader**:易於上手、社群活躍、可視化工具多。
- **custom engine**:若需自定義條件,使用 `pandas` + `numpy` 直接編寫。
### 5.2 風險度量
| 指標 | 意義 |
|------|------|
| 夏普比率 | 把報酬與波動率做比較 |
| 最大回撤 | 最大資金下跌幅度 |
| 卡爾曼因子 | 風險調整後的收益 |
| VaR / CVaR | 潛在風險估算 |
> **例子**:最大回撤超過 25% 時,策略自動停止交易並重設投資比例。
## 6. 交易執行:從策略到實盤
1. **訂單管理**:使用 Alpaca、Interactive Brokers API,支援 REST、WebSocket。
2. **滑點與手續費模擬**:回測時加入固定滑點 0.05% 或動態模型,確保策略在實盤可行。
3. **監控與報警**:將交易結果推送至 Telegram / Slack,或自建儀表板(Dash、Streamlit)。
## 7. 持續優化:自我調整與迭代
- **模型監控**:使用 `mlflow` 或 `Weights & Biases` 追蹤版本、績效。
- **參數再優化**:每 30 天跑一次 `GridSearchCV`,自動調整 `alpha`、`max_depth` 等。
- **因子更新**:新資料到來時,重新訓練,避免模型過時。
## 8. 結語
量化投資並非一次性完成,而是一個持續學習、迭代改進的循環。資料的力量在於**可操作性**;若缺乏可執行的策略,即使擁有最先進的模型,也無法實現財務自由。
> **一句話提醒**:**永遠把「交易成本」視為模型的一部分**,忽略成本往往是許多新手失敗的根源。
---
**練習題**:
1. 以 S&P 500 為基礎,使用 `rolling_mean`、`rolling_std` 與 `MACD` 來產生買賣訊號,並進行 5 歲回測。輸出夏普比率與最大回撤。
2. 以 Twitter sentiment score 作為額外因子,評估其對策略表現的提升。若提升幅度不足 5%,請嘗試其他替代因子。
**下一章預告**:將探討「機器學習模型部署與雲端運行」——如何將模型部署於 AWS SageMaker 或 GCP Vertex AI,實現雲端自動化。