返回目錄
A
量化投資之道:理論、模型與實戰 - 第 5 章
第五章 時序預測與機器學習:從傳統統計到深度學習
發布於 2026-02-23 19:28
# 第五章 時序預測與機器學習:從傳統統計到深度學習
## 5.1 時序預測的基礎與挑戰
在量化投資中,價格與波動率本身即為時間序列資料。若能把握其動態結構,便能提前預判市場走向。時間序列預測的核心問題在於:
1. **自相似性**:金融時間序列常呈現長程記憶與波動聚類。
2. **非線性與非平穩**:回歸模型往往假設線性與均值可變,實際上市場頻繁變化。
3. **高維度與噪聲**:多資產、跨市場資料混合,噪聲比信號大。
面對這些挑戰,傳統統計模型與機器學習方法各有優劣,以下將逐一拆解。
## 5.2 傳統統計模型
### 5.2.1 ARIMA
ARIMA (AutoRegressive Integrated Moving Average) 仍是最常見的基線模型。其公式為:
\[\text{ARIMA}(p,d,q) : \Delta^{d} y_t = \sum_{i=1}^{p} \phi_i y_{t-i} + \sum_{j=1}^{q} \theta_j \varepsilon_{t-j} + \varepsilon_t\]
> **實作範例**(Python)
> python
> import pandas as pd
> from statsmodels.tsa.arima.model import ARIMA
>
> # 假設 df['close'] 為收盤價
> y = df['close']
> model = ARIMA(y, order=(2,1,1))
> res = model.fit()
> forecast = res.forecast(steps=10)
> print(forecast)
>
**參數選擇**:
- **p**:根據 ACF/PACF 繪圖確定。
- **d**:差分次數,經常為 0 或 1。
- **q**:同樣透過 ACF 確定。
### 5.2.2 GARCH
波動率預測則常使用 GARCH。基本形式為:
\[\sigma_t^2 = \omega + \sum_{i=1}^{p} \alpha_i \varepsilon_{t-i}^2 + \sum_{j=1}^{q} \beta_j \sigma_{t-j}^2\]
> **實作範例**
> python
> from arch import arch_model
>
> am = arch_model(y, vol='Garch', p=1, q=1)
> res = am.fit(update_freq=5)
> vol_forecast = res.forecast(horizon=10)
> print(vol_forecast.variance.iloc[-1])
>
## 5.3 機器學習方法
傳統統計模型的線性假設常無法捕捉市場的複雜關係。機器學習模型提供更大的表徵空間,但同時帶來過擬合風險。
### 5.3.1 監督式模型
| 模型 | 優點 | 缺點 |
|------|------|------|
| 隨機森林 | 抗噪聲、可處理非線性 | 需要大量資料、解釋性差 |
| XGBoost | 高效、可調參多 | 需注意過擬合、需正則化 |
| SVR | 可處理高維 | 計算量大、參數難調 |
> **實作範例(XGBoost)**
> python
> import xgboost as xgb
>
> X = df[['open','high','low','volume','ma5','ma10']].shift(1).dropna()
> y = df['close'].shift(-1).loc[X.index]
> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
>
> model = xgb.XGBRegressor(n_estimators=500, learning_rate=0.05, max_depth=4)
> model.fit(X_train, y_train, eval_set=[(X_test, y_test)], early_stopping_rounds=20)
> pred = model.predict(X_test)
> print('RMSE:', np.sqrt(mean_squared_error(y_test, pred)))
>
### 5.3.2 深度學習
深度學習能自動學習複雜時序結構,常見模型有 LSTM、GRU、Temporal Convolutional Network (TCN)。
> **實作範例(LSTM)**
> python
> import torch
> import torch.nn as nn
>
> class LSTMModel(nn.Module):
> def __init__(self, input_size, hidden_size, num_layers, output_size):
> super().__init__()
> self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
> self.fc = nn.Linear(hidden_size, output_size)
>
> def forward(self, x):
> out, _ = self.lstm(x)
> out = self.fc(out[:, -1, :])
> return out
>
> # 數據準備
> seq_len = 20
> X, y = [], []
> for i in range(len(df)-seq_len-1):
> X.append(df.iloc[i:i+seq_len][['close']].values)
> y.append(df.iloc[i+seq_len]['close'])
> X = torch.tensor(X, dtype=torch.float32)
> y = torch.tensor(y, dtype=torch.float32).unsqueeze(1)
>
> model = LSTMModel(1, 64, 2, 1)
> criterion = nn.MSELoss()
> optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
>
> for epoch in range(50):
> optimizer.zero_grad()
> pred = model(X)
> loss = criterion(pred, y)
> loss.backward()
> optimizer.step()
> if epoch % 10 == 0:
> print(f'Epoch {epoch}, Loss {loss.item():.4f}')
>
## 5.4 模型評估與風險管理
1. **回測**:使用滑動窗口或留一法,確保模型在不同市場環境下均有穩定表現。
2. **情報比率**:\(
>
> \text{IR} = \frac{E[R_p - R_f]}{\sigma_{R_p - R_f}}\)
> ;高 IR 代表風險調整後的超額收益。
3. **偏差–方差權衡**:監測訓練集與驗證集損失差距;若差距大於 10% 需簡化模型或加入正則化。
4. **交易成本與滑點**:在回測時加入每筆交易 0.05% 的成本,並將預測值調整為「下個交易日收盤價」而非「即時收盤價」。
5. **資金管理**:使用 Kelly 或 ATR 係數調整倉位,避免單一因子失效時的巨大虧損。
## 5.5 案例:ETF 波動率預測
- **資料**:VIX、SPY 收盤價、交易量、開盤價。
- **模型**:GARCH(1,1) + XGBoost。
- **流程**:
1. 先用 GARCH 預測波動率;
2. 以預測波動率與其他技術指標作為 XGBoost 的特徵;
3. 交叉驗證確定參數,並將結果回測於過去 5 年。
- **結果**:Information Ratio 1.2,夏普比率 1.8,顯示模型相較於市場平均有明顯提升。
## 5.6 小結
- **傳統統計模型**提供穩定且易解釋的基線,適合低頻交易或波動率預測。
- **機器學習模型**能捕捉非線性與高維特徵,需嚴格監控過擬合與評估風險。
- **深度學習**在高頻或長期序列中表現突出,但對資料量與計算資源要求高。
- **回測與風險控制**是量化策略的生命線,缺一不可。
> **實踐提醒**:每一次模型更新都應重新驗證「模型有效期」與「市場結構變化」;市場從不會完全重複,以靈活迴圈的方式維持策略生命。