返回目錄
A
數據決策的藝術:從資料蒐集到洞察生成 - 第 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,結合實際經濟指標 |
| 策略落地 | 因果係數驅動的風險調整與交易規則 |
> **結語**:時序模型為我們提供「何時」的洞見,因果推斷則揭示「為什麼」的本質。兩者結合,能將數據轉化為可執行、可解釋的決策,為金融業帶來更精準、更負責任的管理。
---
> **預告**:第八章將深入探討 **機器學習中的不確定性量化**,從貝式方法到蒙特卡羅模擬,並說明如何將不確定性納入風險管理框架。