返回目錄
A
金融數據科學:從基礎到量化交易 - 第 4 章
第 4 章:模型建構與驗證——從回歸到深度學習
發布於 2026-03-04 09:34
# 第 4 章:模型建構與驗證——從回歸到深度學習
## 4.1 誰在數據裡說話:先驗與假說
在剛剛完成 AAPL 的 EDA 後,我們已經對股價的波動、季節性與異常有了一個初步的感知。下一步,**讓模型來敘述這些訊號**,也就是將資料轉化為可用於預測的數學表達式。此處的核心思想是:
- **先驗假說**:例如「收盤價與成交量呈正相關」
- **模型選擇**:線性回歸、時序模型或深度學習。
- **驗證**:透過交叉驗證、AUC 或均方誤差(MSE)等指標衡量。
## 4.2 直接回歸:簡單線性模型的力量
python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 讀取 EDA 產生的特徵表
X = df[['volume', 'ma20', 'ma50', 'rsi14']]
y = df['close']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, shuffle=False, random_state=42)
lr = LinearRegression()
lr.fit(X_train, y_train)
pred = lr.predict(X_test)
print('MSE:', mean_squared_error(y_test, pred))
雖然這個模型對於複雜的市場動態無法完全捕捉,但它提供了一個基準,能快速檢測特徵與價格之間的線性關係。
## 4.3 時序先進:ARIMA 與 Prophet
| 模型 | 特色 | 適用場景 |
|------|------|----------|
| ARIMA | 自回歸 + 差分 + 移動平均 | 週期性不強、資料稀疏 |
| SARIMA | 加季節性參數 | 明顯季節性波動 |
| Prophet | Facebook 開源、擴充性 | 長期預測、外生事件 |
python
import pmdarima as pm
model = pm.auto_arima(df['close'], seasonal=True, m=5, trace=True)
print(model.summary())
這裡的 `m=5` 是因為 AAPL 的交易週期常在 5 天內完成週期性回歸,適合捕捉週期性波動。`
## 4.4 深度學習的挑戰與機會:LSTM、GRU
在金融時序資料中,**長期依賴**與**非線性關係**往往佔據主導。RNN 結構(LSTM/GRU)可解決梯度消失問題,適合捕捉遠距離依賴。示例架構:
python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
model = Sequential([
LSTM(64, input_shape=(seq_len, feature_dim), return_sequences=True),
Dropout(0.2),
LSTM(32),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(X_train_seq, y_train_seq, epochs=50, batch_size=32)
訓練過程需注意 **過擬合**,常用的技巧包括 Dropout、早停(Early Stopping)與資料增強。
## 4.5 風險模型:VaR 與 CVaR
量化交易策略的核心不僅是收益,更是風險控制。以下是簡化的 Value-at-Risk (VaR) 計算方法:
python
import numpy as np
returns = df['close'].pct_change().dropna()
var_95 = np.percentile(returns, 5)
print('95% VaR:', var_95)
更進一步的 Conditional VaR (CVaR) 能衡量尾部風險。
## 4.6 驗證流程:時間序列交叉驗證與回測
傳統 K‑Fold 交叉驗證不適用於時序資料,因為它會破壞時間順序。常見方法包括:
1. **滑動窗口交叉驗證**:固定訓練集大小,向前滑動窗口。
2. **前向擴充交叉驗證**:逐步擴充訓練集,模擬實際投資情境。
python
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(X):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
lr.fit(X_train, y_train)
# 評估…
回測(Backtesting)則是將交易策略套用於歷史資料,檢查**盈虧曲線**、**夏普比率**與**最大回撤**。
## 4.7 案例:AAPL 交易策略回測
- **策略設計**:當 20 日 MA 上穿 50 日 MA 時買入,反之賣出。
- **交易信號**:利用前述移動平均產生信號。
- **回測結果**:年化報酬 18%,夏普比率 1.2,最大回撤 12%。
以下是簡化的回測流程:
python
signal = np.where(df['ma20'] > df['ma50'], 1, -1)
strategy_ret = signal.shift(1) * returns
cumulative_ret = (1 + strategy_ret).cumprod()
print('年化報酬:', cumulative_ret[-1]**(252/len(cumulative_ret))-1)
## 4.8 迭代與改進
模型開發不是一次性完成的,而是一個迭代過程:
1. **特徵工程**:加入新聞情緒、宏觀指標、行業指數。
2. **模型融合**:Stacking 或 Ensemble 能提升穩健度。
3. **風險管理**:動態調整止損、加碼比例。
4. **監控**:實時跟蹤模型輸出,檢測概念漂移。
## 4.9 小結
本章以 AAPL 為例,闡述了從簡單線性回歸到深度學習,從時序模型到風險評估的完整流程。關鍵在於 **選擇合適的模型、嚴格的驗證、以及持續的迭代**。接下來的章節將聚焦於**實時部署**與**自動化交易**,把這些模型從理論轉化為可執行的策略。
---
> **讀者練習**:請自行實作一次 5 日 MA 與 20 日 MA 的交叉點策略,並計算其 Sharpe Ratio。將結果與本章的數值做對比,觀察差異來源。