聊天視窗

量化投資之道:理論、模型與實戰 - 第 4 章

第4章 因子模型的建構與驗證

發布於 2026-02-23 19:22

# 第4章 因子模型的建構與驗證 在量化投資的世界裡,因子模型不僅是理論框架,更是實戰中的利器。本章將帶你從因子設計、資料預處理,到模型擬合、評估與迭代,完整呈現因子投資策略的開發流程。透過 Python 程式範例,你可以快速驗證概念、調整參數、並在實際資料中測試效能。 --- ## 4.1 因子選取與定義 1. **基本因子**:市值、價值、動量、品質、波動率等。 2. **主題因子**:ESG、AI、區塊鏈等新興領域。 3. **自訂因子**:結合公司財報、新聞情感、宏觀指標。 因子設計要考量三個層面: - **可解釋性**:投資者能夠理解因子的來源與意義。 - **可獲取性**:資料必須穩定且易於收集。 - **訊號強度**:因子在歷史期間內必須具備顯著的超額報酬。 > **提示**:在初步挑選後,建議使用資訊量測試(如信息值、因子分布)來篩選高質量因子。 --- ## 4.2 數據處理與標準化 ### 4.2.1 資料對齊 - **時間同步**:對於多資產因子,必須確保同一天的價格與因子值對齊。 - **缺失值處理**:可使用前向填充、後向填充或插值;若缺失率過高,請刪除該樣本。 ### 4.2.2 標準化 因子量化通常使用 Z‑score 或 0‑1 轉換,使不同尺度的因子可直接比較。 ```python import pandas as pd from sklearn.preprocessing import StandardScaler # 假設 df_factor 已經對齊完成 scaler = StandardScaler() X_scaled = scaler.fit_transform(df_factor) X_scaled_df = pd.DataFrame(X_scaled, index=df_factor.index, columns=df_factor.columns) ``` --- ## 4.3 模型擬合與評估 ### 4.3.1 多重迴歸 最傳統的因子模型使用多重迴歸: ```python import statsmodels.api as sm # 回歸:每個資產的月報酬率 = 常數 + β1*因子1 + β2*因子2 + … + ε Y = returns_monthly X = sm.add_constant(X_scaled_df) model = sm.OLS(Y, X).fit() print(model.summary()) ``` ### 4.3.2 交叉驗證 為避免過度擬合,建議使用時間序列交叉驗證(Walk‑Forward): ```python from sklearn.model_selection import TimeSeriesSplit tscv = TimeSeriesSplit(n_splits=5) for train_idx, test_idx in tscv.split(X_scaled_df): X_train, X_test = X_scaled_df.iloc[train_idx], X_scaled_df.iloc[test_idx] Y_train, Y_test = Y.iloc[train_idx], Y.iloc[test_idx] model = sm.OLS(Y_train, sm.add_constant(X_train)).fit() preds = model.predict(sm.add_constant(X_test)) # 计算 R² 或信息值等指标 ``` ### 4.3.3 風險調整後的績效 - **夏普比率**:衡量每單位波動所帶來的超額報酬。 - **Information Ratio**:衡量因子模型對基準的解釋能力。 - **Factor Exposures**:檢查因子載荷是否穩定。 --- ## 4.4 驗證與迭代 1. **時間延伸**:將模型投射至不同市場時期,檢查一致性。 2. **資料重抽樣**:使用不同的訓練/測試比例,觀察績效波動。 3. **正則化**:如 Ridge、Lasso,減少多重共線性。 4. **因子組合**:將多個因子加權,形成多因子策略。 > **實務建議**:每一次模型重訓時,都要重新計算因子值,確保因子與市場同步更新;否則策略會產生「過期」風險。 --- ## 4.5 實務範例:三因子模型 + 滑動窗口回測 ```python import yfinance as yf import pandas as pd import numpy as np from datetime import datetime # 1. 下載股票資料 symbols = ['AAPL', 'MSFT', 'GOOG', 'AMZN', 'FB'] prices = yf.download(symbols, start='2015-01-01', end='2023-12-31')['Adj Close'] returns = prices.pct_change().dropna() # 2. 下載市場、無風險與 SMB、HML 指數 market = yf.download('^GSPC', start='2015-01-01', end='2023-12-31')['Adj Close'].pct_change().dropna() rf = yf.download('^IRX', start='2015-01-01', end='2023-12-31')['Adj Close'].pct_change().fillna(0) # SMB、HML 這裡假設已經在外部 csv smb = pd.read_csv('smb.csv', index_col=0, parse_dates=True) hml = pd.read_csv('hml.csv', index_col=0, parse_dates=True) # 3. 形成因子矩陣 X_factors = pd.concat([market.shift(1).loc[returns.index], smb.loc[returns.index], hml.loc[returns.index], rf.shift(1).loc[returns.index]], axis=1) X_factors.columns = ['MKT', 'SMB', 'HML', 'RF'] # 4. 滑動窗口回測 window_size = 36 # 3 年 results = [] for start in range(0, len(returns) - window_size): train_idx = returns.index[start:start+window_size] test_idx = returns.index[start+window_size:start+window_size+12] # 1 年測試 Y_train = returns.loc[train_idx] X_train = X_factors.loc[train_idx].dropna() model = sm.OLS(Y_train.mean(axis=1), sm.add_constant(X_train)).fit() # 取測試期因子值 X_test = X_factors.loc[test_idx].dropna() # 產生預測報酬 pred = model.predict(sm.add_constant(X_test)) alpha = pred - rf.loc[test_idx].mean() results.append(alpha) alpha_series = pd.concat(results) print('平均 alpha:', alpha_series.mean()) print('夏普比率:', alpha_series.mean() / alpha_series.std()) ``` > **說明**:以上範例僅作演示,實務上需考慮稅費、交易成本、權重限制等。 --- ## 小結 - **因子設計**是策略成功的關鍵,需結合市場經驗與統計驗證。 - **資料品質**與**標準化**能顯著提升模型穩定性。 - **交叉驗證**與**滑動窗口**是避免資訊洩漏與過度擬合的有效方法。 - **績效指標**(夏普、Information Ratio)提供快速評估因子模型效能的工具。 > **結語**:因子模型就像航海圖;設計越細緻、測試越嚴謹,你在市場的航程就越安全。接下來的章節,我們將進一步探討 **時間序列預測** 與 **機器學習** 在量化投資中的應用。