聊天視窗

數據決策的藝術:從資料蒐集到洞察生成 - 第 7 章

第七章 時序模型與因果推斷:把波動轉化為策略

發布於 2026-02-25 06:26

# 第七章 時序模型與因果推斷:把波動轉化為策略 > **時間是最難以把握的資產,卻也是最能決定未來走向的關鍵。** > 在本章,我們將學習如何用 Prophet、LSTM 等先進時序模型捕捉市場節奏,再運用因果推斷揭露背後的決策杠桿。 ## 7.1 為什麼時序模型是金融數據的最佳伴侶 * **週期性**:季節性、周頻、月頻等節奏無處不在。 * **自相關**:一個交易日的價格往往與前一天有顯著相關。 * **異方差**:波動性會隨市場情緒而改變,需動態處理。 > 這些特性讓傳統機器學習模型(如隨機森林)難以直接應用,因為它們假設特徵之間獨立。 ## 7.2 資料前處理:從 raw 到可建模 1. **時間戳對齊**: python df['timestamp'] = pd.to_datetime(df['timestamp']) df.set_index('timestamp', inplace=True) df = df.asfreq('D') # 轉為日頻 2. **缺失值插值**: python df['price'].interpolate(method='time', inplace=True) 3. **平穩化**:使用差分或對數變換消除趨勢。 python df['log_ret'] = np.log(df['price']).diff().dropna() 4. **滯後特徵**: python for lag in range(1, 8): df[f'lag_{lag}'] = df['log_ret'].shift(lag) df.dropna(inplace=True) > *注意*:在金融領域,任何時間偏移都可能引入「前瞻性偏差」;請確保資料窗口嚴格符合實際交易可得性。 ## 7.3 Prophet:簡易可解釋的時序預測 Prophet 由 Facebook 開發,特別適合週期性強且含節假日效應的資料。 python from prophet import Prophet train = df.reset_index()[['timestamp', 'log_ret']].rename(columns={'timestamp':'ds','log_ret':'y'}) model = Prophet(yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=False) model.add_country_holidays(country_name='TW') model.fit(train) future = model.make_future_dataframe(periods=30) forecast = model.plot(future) ### Prophet 優點 - **自動季節性**:不需手動編碼。 - **可視化預測**:圖表即能展示趨勢與不確定度。 - **靈活的節假日**:可添加自訂假日表。 ### Prophet 限制 - **線性增長**:無法捕捉複雜非線性模式。 - **不支持序列長度延伸**:LSTM 等深度模型更適合長序列。 ## 7.4 LSTM:深度學習抓取長期依賴 長短期記憶(LSTM)能在序列長度較長時維持關鍵訊息,適合日交易量、價格序列。 python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout # 準備資料 seq_len = 30 features = df[['log_ret']].values X, y = [], [] for i in range(len(features)-seq_len): X.append(features[i:i+seq_len]) y.append(features[i+seq_len]) X, y = np.array(X), np.array(y) # 建模 model = Sequential([ LSTM(64, input_shape=(seq_len, 1), return_sequences=True), Dropout(0.2), LSTM(32), Dense(1) ]) model.compile(optimizer='adam', loss='mse') model.fit(X, y, epochs=50, batch_size=32, validation_split=0.2) ### LSTM 建議 - **正則化**:Dropout、L2 可以降低過擬合。 - **窗口長度**:30 天雖是常見,但可根據資料週期調整。 - **特徵擴充**:加入交易量、技術指標(RSI、MACD)可提升預測力。 ## 7.5 模型評估:不只是 RMSE | 指標 | 何時使用 | 需要注意的點 | |------|-----------|--------------| | RMSE | 數值預測 | 受極端值影響大 | | MAPE | 變化率預測 | 0 附近失真 | | MAE | 整體偏差 | 針對大幅波動不敏感 | | SHAP | 解釋性 | 需配合模型使用 | > 在金融風險管理中,**尾部風險**(Value at Risk)往往比平均誤差更重要;建議額外計算 CVaR。 ## 7.6 因果推斷:從相關到決策杠桿 ### 7.6.1 什麼是因果推斷 - **相關**:兩個變數同時變動。 - **因果**:一個變數直接影響另一個。 > 例如,市場利率上升(X)與股價下跌(Y)常相關,但並非所有下跌均由利率引發。 ### 7.6.2 典型方法 | 方法 | 原理 | 適用場景 | |------|------|----------| | 差分中的差分 (DiD) | 比較處理組與對照組在事件前後變化 | 政策評估、宣傳效果 | | 工具變量 (IV) | 使用不直接影響結果的外生變量 | 價格/供應量與需求 | | 隨機對照試驗 (RCT) | 隨機分配,消除混淆 | 新產品上市、投資策略 | | 反事實回歸 | 建模「若無事件」預測 | 風險評估 | ### 7.6.3 實務範例:利率變動對投資組合回報的因果效應 python import statsmodels.api as sm # 兩個時間序列:利率 r_t,投資回報 R_t # 使用 2SLS: # 1. 第一階段: r_t = Z_t * π + ε1 (Z 為工具變量) # 2. 第二階段: R_t = β * r_hat + ε2 Z = df['macro_factor'] # 例如 GDP 成長率 # 第一階段 model1 = sm.OLS(df['r'], sm.add_constant(Z)).fit() rf = model1.predict() # 第二階段 model2 = sm.OLS(df['R'], sm.add_constant(rf)).fit() print(model2.summary()) > *工具變量* 必須滿足 **相關性** 與 **外生性**;不滿足將導致偏誤。 ### 7.6.4 因果圖(DAG)與識別策略 mermaid graph TD R(利率) --> P(投資回報) R --> V(市場情緒) V --> P - **前向測試**:檢查「潛在混淆」是否存在。 - **調整路徑**:在回歸中加入 V 可消除混淆。 ## 7.7 從模型到決策:設計因果驅動策略 1. **預測 + 因果**:先用 Prophet/LSTM 預測未來市場走勢,再用因果模型估算利率變動帶來的損益。 2. **風險校正**:將因果係數納入 VaR 計算,得到更實際的風險上限。 3. **決策規則**:設計基於因果效應的買進/賣出閾值,例如: - 若因果估計表明利率上升 > 0.5% 將導致 1% 以上回報減少,則自動賣空特定類別。 4. **監控與迭代**:持續收集新資料,重新估計因果係數,確保策略不被「事後論證」所誤導。 ## 7.8 小結 | 章節重點 | 具體做法 | |----------|----------| | 時序模型 | Prophet:快速可視化;LSTM:深度捕捉長期依賴 | | 評估指標 | RMSE、MAPE、MAE,並加入 CVaR、SHAP | | 因果推斷 | 2SLS、DiD、IV、DAG,結合實際經濟指標 | | 策略落地 | 因果係數驅動的風險調整與交易規則 | > **結語**:時序模型為我們提供「何時」的洞見,因果推斷則揭示「為什麼」的本質。兩者結合,能將數據轉化為可執行、可解釋的決策,為金融業帶來更精準、更負責任的管理。 --- > **預告**:第八章將深入探討 **機器學習中的不確定性量化**,從貝式方法到蒙特卡羅模擬,並說明如何將不確定性納入風險管理框架。