聊天視窗

金融數據科學:從基礎到量化交易 - 第 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。將結果與本章的數值做對比,觀察差異來源。