聊天視窗

量化投資之道:理論、模型與實戰 - 第 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 小結 - **傳統統計模型**提供穩定且易解釋的基線,適合低頻交易或波動率預測。 - **機器學習模型**能捕捉非線性與高維特徵,需嚴格監控過擬合與評估風險。 - **深度學習**在高頻或長期序列中表現突出,但對資料量與計算資源要求高。 - **回測與風險控制**是量化策略的生命線,缺一不可。 > **實踐提醒**:每一次模型更新都應重新驗證「模型有效期」與「市場結構變化」;市場從不會完全重複,以靈活迴圈的方式維持策略生命。