返回目錄
A
量化投資策略:理論到實踐的全景指南 - 第 3 章
第 3 章:策略設計的科學 — 從假設到模型建構
發布於 2026-03-03 05:38
# 第 3 章:策略設計的科學 — 從假設到模型建構
> **核心思路**:\n
> 在量化投資的道路上,最重要的不是手中的程式碼,而是能夠系統化、可重複的思考流程。\n> 本章將帶領你從策略假設、資料探索、模型選擇,到風險度量與績效評估,完整構建一個可落地的量化策略。
---
## 3.1 投資假設的建立
| 步驟 | 內容 | 目的 |
|------|------|------|
| **A** | 產生市場摩擦或套利機會的觀察 | 形成可驗證的交易邏輯 |
| **B** | 轉化為可度量的指標(例如均值回歸、趨勢跟隨、機器學習分類) | 方便量化、模擬 |
| **C** | 建立假設檢驗框架(假設 H0: 交易無效) | 為模型選擇與績效評估提供統計基礎 |
> **實務提示**:
> - 在形成假設前,先閱讀近 1 年的新聞與數據,找出潛在的非理性行為。
> - 每個假設都應該能夠量化,例如「當 20 日移動平均線跌破 50 日移動平均線時,價格將在 10 個交易日內回升 2%」。
## 3.2 資料探索與特徵工程
1. **資料清洗**
- 缺失值處理:填補、刪除或使用插值法。
- 輸出異常值偵測:IQR、Z‑score、DBSCAN 等。
2. **時間序列分解**
- **趨勢**、**季節性**、**殘差**:使用 STL、 Hodrick‑Prescott 滤波。
3. **特徵創造**
- **技術指標**:RSI、MACD、布林帶、ATR。
- **統計特徵**:過去 5 日波動率、偏度、峰度。
- **多因子**:市場因子、行業因子、宏觀因子。
> **實例**:計算 5 日簡單移動平均(SMA)與 20 日 SMA 之間的差值作為趨勢指標。
> python
> import pandas as pd
> df['SMA5'] = df['close'].rolling(window=5).mean()
> df['SMA20'] = df['close'].rolling(window=20).mean()
> df['trend'] = df['SMA5'] - df['SMA20']
>
## 3.3 時間序列模型概論
| 模型 | 適用場景 | 主要參數 |
|------|----------|----------|
| ARMA(p,q) | 低頻平滑數據 | p: 自回歸階數, q: MA 階數 |
| GARCH(1,1) | 波動率聚類 | ω, α, β |
| VAR | 多資產共同動態 | d (滯後階數) |
| LSTM | 非線性長期依賴 | hidden_dim, layers |
> **關鍵概念**:
> - **自相關 (ACF)** 與 **偏自相關 (PACF)**:用於挑選 ARMA 的 p、q。
> - **殘差檢驗**:Breusch‑Pagan、White 檢驗,確保模型未遺漏重要因子。
> **程式碼示例**:ARMA(1,1) 模型的估計與預測。
> python
> import statsmodels.api as sm
> from statsmodels.tsa.arima.model import ARIMA
>
> model = ARIMA(df['close'], order=(1,0,1))
> results = model.fit()
> print(results.summary())
>
> # 10 天後預測
> forecast = results.get_forecast(steps=10)
> print(forecast.predicted_mean)
>
## 3.4 模型評估與驗證
1. **訓練/驗證/測試集劃分**:
- 60% / 20% / 20% 或者使用時間序列交叉驗證(Rolling Forecast Origin)。
2. **評估指標**:
- **預測準確度**:RMSE、MAE、MAPE。
- **統計檢驗**:Diebold‑Mariano 檢驗比較兩模型。
3. **風險調整績效**:
- 夏普比率、Sortino、Calmar。
> **實務操作**:使用 `sklearn.model_selection.TimeSeriesSplit` 進行交叉驗證。
> python
> from sklearn.model_selection import TimeSeriesSplit
> tscv = TimeSeriesSplit(n_splits=5)
> for train_index, test_index in tscv.split(df):
> X_train, X_test = df.iloc[train_index], df.iloc[test_index]
> # 這裡插入模型訓練與評估
>
## 3.5 風險度量與資產配置
| 指標 | 定義 | 典型應用 |
|------|------|----------|
| 最大回撤 (Max Drawdown) | 最高點到最低點之間的最大虧損 | 風險上限設定 |
| VaR | 在一定信心水平下的潛在最大虧損 | 資本需求、合規 |
| CVaR | 超過 VaR 的平均虧損 | 強化風險管理 |
| Information Ratio | 超額報酬與跟蹤誤差比值 | 檢驗策略主動性 |
> **策略合成**:將多個獨立因子進行加權投資,使用機器學習方法(例如 LASSO、Random Forest)自動調整權重。
## 3.6 程式碼範例 — 簡易動量策略
python
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
# 讀取資料
price = pd.read_csv('stock_price.csv', parse_dates=['date'], index_col='date')
# 計算 20 天相對強弱指標 (RSI)
delta = price['close'].diff()
up = delta.clip(lower=0)
down = -1 * delta.clip(upper=0)
ema_up = up.ewm(span=14, adjust=False).mean()
ema_down = down.ewm(span=14, adjust=False).mean()
rs = ema_up / ema_down
price['RSI'] = 100 - (100 / (1 + rs))
# 生成交易信號
price['signal'] = np.where(price['RSI'] < 30, 1, np.where(price['RSI'] > 70, -1, 0))
# 風險控制:設定止損 3%
price['position'] = price['signal'].shift(1)
price['strategy'] = price['position'] * price['close'].pct_change()
price['strategy'] = price['strategy'].replace([np.inf, -np.inf], np.nan).fillna(0)
# 總報酬
cumulative_ret = (1 + price['strategy']).cumprod() - 1
print('累積報酬:', cumulative_ret.iloc[-1])
## 3.7 小結
本章從**策略假設**到**資料處理**、**模型構建**、**風險管理**,完整展開量化投資的核心工作流程。透過實例與程式碼,讀者能夠即刻套用於自己的策略開發。下一章將進一步探討機器學習在量化投資中的具體應用與最佳實踐,從而將理論與實務更緊密地結合。