# 配對交易完整教學筆記 --- ## 一、配對交易是什麼? 配對交易 (Pairs Trading) 是**統計套利 (Statistical Arbitrage)** 的一種實作方式。核心思想很簡單: > 找到兩檔歷史上走勢高度相關的資產。當它們暫時偏離彼此時,做空漲太多的、做多跌太多的,等它們回歸正常關係時平倉獲利。 Herlemont 用了一個經典比喻: > 一個醉漢離開酒吧,他的狗也跟著走,兩者各自做隨機漫步,路徑會越走越遠。但進入公園後,法規要求狗必須繫繩——此時人和狗共享同一個方向,路徑變成**共整合 (cointegrated)**。 ### 配對交易的三個基本問題 | 問題 | 說明 | |------|------| | **1. 選哪一對?** | 從股票池中篩選出最適合交易的配對 | | **2. 何時進場?** | 兩者偏離到什麼程度觸發交易信號 | | **3. 何時出場?** | 止盈、停損、或時間到期 | ### 配對交易的特性 - **市場中性 (Market Neutral)**:同時持有多頭和空頭,系統性風險接近零 - **不是無風險套利**:個股事件可能導致關係永久破裂 - 起源於 1980 年代 Morgan Stanley 的量化交易團隊 --- ## 二、前置知識:定態與非定態 在理解配對選擇方法之前,必須先理解什麼是定態 (stationary) 和非定態 (non-stationary)。 ### 定態序列的三個條件 一個序列 $y_t$ 是(弱)定態的,若且唯若: 1. **均值恆定**:$E[y_t] = \mu$,不隨時間改變 2. **變異數恆定**:$\text{Var}(y_t) = \sigma^2$,不隨時間改變 3. **自協方差只取決於時間差**:$\text{Cov}(y_t, y_{t-s})$ 只是 $s$ 的函數 ### AR(1) 模型判斷 $$y_t = \alpha + \rho\, y_{t-1} + \varepsilon_t$$ - $|\rho| < 1$:定態,均值回歸到 $\alpha / (1-\rho)$ - $|\rho| = 1$:非定態(隨機漫步),變異數隨時間趨向無窮 ### 整合階數 I(d) 一個序列需要差分 $d$ 次才能變成定態,則稱為 $I(d)$: - 股價通常是 $I(1)$ - 報酬率通常是 $I(0)$ ### 為什麼這很重要? 如果兩個 $I(1)$ 序列的某個線性組合是 $I(0)$(定態),那麼它們就是**共整合的**。這正是配對交易的數學基礎——價差雖然會偏離,但終究會回歸。 ### 偽回歸 (Spurious Regression) 警告 Herlemont 引用 Nelson & Plosser 的實驗:將兩個完全獨立的隨機漫步做回歸,75% 的情況下會得到「顯著」結果!這就是為什麼不能只看相關係數,必須用正式的共整合檢定。 --- ## 三、配對選擇方法一:距離法 (Distance Method) ### 數學定義 給定價格序列 $X = \{x_1, x_2, \ldots, x_N\}$,先標準化: $$\widetilde{x}_i = \frac{x_i - \bar{X}}{\hat{X}}$$ 其中 $\bar{X} = \frac{1}{N}\sum_{i=1}^N x_i$,$\hat{X} = \sqrt{\frac{1}{N}\sum_{i=1}^N (x_i - \bar{X})^2}$ 兩個標準化序列之間的距離: $$d = \sum_{i=1}^N (\widetilde{x}_i - \widetilde{y}_i)^2$$ ### 選配對流程 1. 假設股票池有 $M$ 檔股票 2. 計算所有 $\binom{M}{2}$ 對的距離 3. 按距離由小到大排序 4. 取距離最小的前 $k$ 對作為候選 ### 進出場規則 在交易期間,追蹤配對的即時距離 $d_{a,b}$: | 條件 | 動作 | |------|------| | $d_{a,b} > d_{\text{enter}}$ | 進場 | | $d_{a,b} \leq d_{\text{take profit}}$ | 止盈平倉 | | $d_{a,b} \geq d_{\text{stop loss}}$ | 停損平倉 | | 持有時間 $> T$ | 時間到期平倉 | 其中 $d_{\text{take profit}} < d_{\text{enter}} < d_{\text{stop loss}}$。 ### 實作要點 ```python def select_pairs_distance(prices, n_pairs): # 母體標準差 ddof=0 對齊教材 1/N 定義 normalized = (prices - prices.mean()) / prices.std(ddof=0) values = normalized.values pairs = [] for i in range(len(tickers)): for j in range(i + 1, len(tickers)): distance = np.sum((values[:, i] - values[:, j]) ** 2) pairs.append((tickers[i], tickers[j], distance)) pairs.sort(key=lambda item: item[2]) return pairs[:n_pairs] ``` ### 優缺點 - **優點**:直觀、容易實作、不需要統計檢定 - **缺點**:沒有統計基礎來判斷「多近算近」;$d_{\text{enter}}$ 等參數缺乏明確理論依據 --- ## 四、配對選擇方法二:共整合法 (Cointegration Method) ### 核心邏輯 如果兩個序列 $X_t$ 和 $Y_t$ 是共整合的,代表它們的趨勢成分在一個倍率內是相同的。即使暫時偏離共同趨勢,最終會回歸。 ### 共整合的正式定義 兩個 $I(1)$ 時間序列 $X_t$ 和 $Y_t$ 是共整合的,若且唯若存在 $\alpha, \beta$ 使得: $$X_t - \alpha - \beta Y_t = u_t$$ 其中 $u_t$ 是 $I(0)$(定態)。向量 $(\beta)$ 稱為**共整合向量**,且在一定的正規化條件下是唯一的。 ### Engle-Granger 兩步驟檢定 **步驟一:OLS 回歸** $$X_t = c + \alpha\, Y_t + \epsilon_t$$ **步驟二:對殘差做 ADF 檢定** $$\Delta\epsilon_t = \gamma\, \epsilon_{t-1} + \sum_{i=1}^p \delta_i\, \Delta\epsilon_{t-i} + \nu_t$$ - $H_0: \gamma = 0$(非定態 → 無共整合) - $H_1: \gamma < 0$(定態 → 共整合) ADF 統計量越負,代表共整合程度越強。 ### Augmented Dickey-Fuller 檢定細節 基本 DF 檢定只處理一階自相關。為了處理高階自相關導致的殘差相關問題,必須加入滯後差分項,這就是 ADF 檢定。 滯後階數 $p$ 的選擇: - 太少:殘差仍有自相關,檢定不正確 - 太多:降低檢定功效 (power) - **最佳做法**:用 AIC/BIC 在不同 $p$ 之間選擇 ### 實作要點 ```python def select_pairs_cointegration(prices, n_pairs): for i in range(len(tickers)): for j in range(i + 1, len(tickers)): # OLS: X_t = c + alpha * Y_t + eps_t result = OLS(price_a, add_constant(price_b)).fit() residuals = result.resid adf_stat, p_value, _, _, _, _ = adfuller(residuals) if p_value <= 0.05: pairs.append((tickers[i], tickers[j], adf_stat, p_value)) # ADF 越負 => 共整合越強 pairs.sort(key=lambda item: (item[2], item[3])) return pairs[:n_pairs] ``` ### 重要注意事項 **1. 回歸方向不對稱問題** OLS 回歸 $X \sim Y$ 和 $Y \sim X$ 會產生不同結果(除非 $R^2 = 1$)。更穩健的做法: - 雙向都做,取 ADF 較顯著者 - 或直接使用 `statsmodels.tsa.stattools.coint()` **2. 為什麼共整合比相關性更適合?** Herlemont 特別強調: > 相關性 (correlation) 對時間偏移極度敏感——把資料平移一天就可能讓 beta 趨近零。共整合則不受此影響。 相關性看的是「報酬率的線性關係」,共整合看的是「價格的長期均衡」。對於有資料品質問題或執行延遲的情境,共整合更安全。 **3. 不要被偽回歸誤導** 兩個獨立的 $I(1)$ 序列做回歸,大概率得到假的顯著結果。**必須對殘差做 ADF 檢定**,確認殘差是定態的,才能宣稱共整合。 --- ## 五、配對選擇方法三:隨機價差法 / Vasicek 過程 (Stochastic Spread Method) ### Vasicek (Ornstein-Uhlenbeck) 過程 $$dV_t = \alpha(\mu - V_t)\,dt + \sigma\,dW_t$$ 三個參數的直覺意義: | 參數 | 意義 | |------|------| | $\mu$ | 長期均值(價差最終會回歸到這裡) | | $\alpha$ | 均值回歸速度(越大回歸越快) | | $\sigma$ | 波動率(擾動的幅度) | ### 為什麼 OU 過程適合配對交易? 如果 $Z_t = X_t - Y_t$(價差)是 Vasicek 過程,意味著: 1. 價差雖然波動,但會回歸長期均值 2. 可以用數學模型**預測**回歸所需時間 3. 參數可以從歷史資料估計 ### OU 過程的統計性質 轉移密度為常態分佈,其均值和變異數: $$m(t) = \mu + (x_0 - \mu)\,e^{-\alpha(t-t_0)}$$ $$s^2(t) = \frac{\sigma^2}{2\alpha}\left[1 - e^{-2\alpha(t-t_0)}\right]$$ 關鍵觀察:**不像布朗運動,OU 過程的變異數是有界的**,長期趨近 $\sigma^2 / 2\alpha$。 ### 參數估計方法 (Herlemont 公式 24-26) OU 過程的離散對應是 AR(1)。對資料做回歸: $$x_t - x_{t-1} = a + b\,x_{t-1} + \varepsilon_t$$ 然後反推連續時間參數: $$\mu = -\frac{a}{b}, \qquad \alpha = -\frac{\ln(1+b)}{\Delta t}, \qquad \sigma = \sigma_\varepsilon \sqrt{\frac{\ln(1+b)}{(1+b)^2 - 1}}$$ ### 實作要點 ```python def estimate_vasicek(v, dt): dx = np.diff(v) x_lag = v[:-1] result = OLS(dx, add_constant(x_lag)).fit() a, b = result.params sigma_eps = np.std(result.resid, ddof=2) mu_est = -a / b alpha_est = -np.log(1 + b) / dt sigma_est = sigma_eps * np.sqrt(-2 * np.log(1 + b) / (dt * (1 - (1 + b) ** 2))) return mu_est, alpha_est, sigma_est ``` ### 最佳交易閾值 (Thompson) Herlemont 引用了 Thompson 的結果:對於 OU 過程加上固定交易成本 $c$,最佳閾值策略是: - 買入條件:$S_t \leq -b/\gamma$ - 賣出條件:$S_t \geq b/\gamma$ 其中 $b$ 滿足: $$2b - \gamma c = 2e^{-b^2/(\gamma\sigma^2)}\int_0^b e^{u^2/(\gamma\sigma^2)}\,du$$ 這給出了一個**考慮交易成本的理論最佳進出場點**。 --- ## 六、配對選擇方法四:Hurst 指數 (Hurst Exponent) ### 分數布朗運動 (fBm) Hurst 指數源自分數布朗運動 $W^H(t)$,它是標準布朗運動的推廣,其中增量是**相依的**: $$\text{Cov}(W^H(t), W^H(u)) = \frac{1}{2}\left(|t|^{2H} + |u|^{2H} - |t-u|^{2H}\right)$$ ### 三種情境 | Hurst $H$ | 增量相關性 | 行為 | 配對交易適用性 | |-----------|-----------|------|-------------| | $H = 0.5$ | 獨立 | 隨機漫步 | 不適用 | | $H > 0.5$ | 正相關 | 趨勢 | 不適用 | | $H < 0.5$ | 負相關 | **均值回歸** | **適用** | ### 應用於配對選擇 1. 計算配對的價差 $S_t = P_A(t) - P_B(t)$ 2. 計算價差的 Hurst 指數 $H$ 3. 只保留 $H < 0.5$ 的配對 4. $H$ 越小 → 均值回歸越強 → 越好的候選 ### 實作要點 ```python def select_pairs_hurst(prices, n_pairs): for i in range(len(tickers)): for j in range(i + 1, len(tickers)): spread = prices.iloc[:, i].values - prices.iloc[:, j].values hurst_value, _, _ = compute_Hc(spread, kind="random_walk", simplified=True) if hurst_value < 0.5: pairs.append((tickers[i], tickers[j], hurst_value)) pairs.sort(key=lambda item: item[2]) # H 越小越好 return pairs[:n_pairs] ``` ### Hurst 指數的額外應用 **Regime Switching 信號**:Hurst 指數隨時間變化可以指示價格體制轉換。當 $H$ 從 $>0.5$ 降到 $<0.5$ 時,可能是趨勢轉為均值回歸的訊號。 ### Variance Ratio 檢定(補充方法) Herlemont 還介紹了 Variance Ratio 作為均值回歸的另一種檢測方式: $$VR(k) = \frac{\text{Var}(r_{k\Delta t}) / k}{\text{Var}(r_{\Delta t})}$$ - $VR(k) = 1$:隨機漫步 - $VR(k) < 1$:均值回歸 - $VR(k) > 1$:趨勢 且有 $VR(k) = 1 + 2\sum_{i=1}^{k-1}(1 - i/k)\,\rho_i$,直接連結了自相關函數。 --- ## 七、交易規則與風險控制 ### Herlemont 的完整交易規則 **進場條件**: - 價格比率偏離 130 日滾動均值超過 **2 個標準差** - **不是**第一次突破 2σ 時進場,而是等它**第二次穿越 2σ 帶**(即開始回歸時) - 這等於確認「配對正在回歸途中」 **出場條件**: - **止盈**:比率回到均值 - **停損**:虧損達到初始部位的 20% - **時間限制**:最長持有 50 個交易日(平均回歸約需 35 天) ### 額外風險控制 | 規則 | 理由 | |------|------| | Beta 差距 < 0.2 | 維持市場中性 | | 同產業配對 | 消除產業風險 | | 同時持有約 10 個部位 | 分散個股風險 | | 主觀判斷覆蓋 | 若知道基本面因素會阻止回歸,可跳過 | ### Z-Score 標準化回測框架 實務上常用統一的 z-score 引擎回測所有方法: $$S_t = A_t - \beta\,B_t, \qquad z_t = \frac{S_t - \mu_S}{\sigma_S}$$ | $z_t$ 條件 | 動作 | |-----------|------| | $z_t > z_{\text{entry}}$ | 做空 spread | | $z_t < -z_{\text{entry}}$ | 做多 spread | | $\|z_t\| < z_{\text{exit}}$ | 平倉 | | $\|z_t\| > z_{\text{stop}}$ | 停損 | > **注意**:這是教學簡化。教材中不同選擇方法可能有各自的進出場邏輯,但統一的 z-score 框架方便做方法間的公平比較。 --- ## 八、主要風險 | 風險類型 | 說明 | 緩解措施 | |---------|------|---------| | **個股事件** | 基本面改變導致關係永久破裂 | 停損 + 時間限制 | | **模型過擬合** | formation period 的模式在 trading period 不再成立 | 足夠的樣本外驗證 | | **交易成本** | 滑價與手續費吃掉利潤 | 考慮交易成本後再決定閾值 | | **殘餘 beta** | beta 差距導致微小市場風險暴露 | 限制 beta 差距 | | **流動性** | 無法在理想價格執行 | 選擇流動性好的股票 | Goetzmann 等人的研究被批評可能忽略了滑價。**任何回測結果如果沒有考慮交易成本和滑價,都應該大幅打折。** --- ## 九、完整的配對交易流水線 ### Phase 1: Formation Period(建模期) ``` 股票池 (M 檔) | |-- 距離法: 計算 C(M,2) 對的 SSD -> 取最小 k 對 |-- 共整合法: Engle-Granger 殘差 ADF -> 取 p<=0.05 且 ADF 最負的 k 對 |-- Hurst 法: 計算價差 Hurst -> 取 H<0.5 最小的 k 對 +-- Vasicek 法: 估計 OU 參數 -> 取 alpha 最大(回歸最快)的 k 對 | v 篩選: beta 差距 < 0.2 + 同產業 | v 候選配對清單 ``` ### Phase 2: Trading Period(交易期) ``` 每日更新: 1. 計算每對的 spread 和 z-score 2. 檢查進場條件 (|z| > entry_z) 3. 檢查出場條件 (|z| < exit_z 或 |z| > stop_z 或 持有天數 > T) 4. 執行交易 5. 記錄 P/L ``` ### Phase 3: Evaluation(評估) - Sharpe Ratio - Maximum Drawdown - 交易次數 - 勝率 - 注意 P/L 單位(是否為標準差標準化後的值) --- ## 十、方法論比較與實證發現 ### 四種方法比較 | 方法 | 理論基礎 | 適合場景 | 注意事項 | |------|---------|---------|---------| | **距離法** | 無統計檢定 | 快速篩選、探索性分析 | 閾值無理論依據 | | **共整合法** | Engle-Granger / Johansen | 有統計信心的配對選擇 | 回歸方向問題、低功效 | | **Vasicek/OU** | 隨機微分方程 | 需要預測回歸時間 | 參數估計依賴資料品質 | | **Hurst 指數** | 分數布朗運動 | 判斷均值回歸傾向 | H<0.5 不保證可交易 | ### 實證觀察 根據本 repo 的 notebook 回測結果: **美股**: - Distance 法 Sharpe 0.48(三者最好) - Cointegration 法 Sharpe -0.14 - Hurst 法 Sharpe -0.41 **台股**: - Cointegration 法 Sharpe 0.98(最好) - Hurst 法 Sharpe -0.40 - Distance 法 Sharpe -0.90(最差) **結論**:沒有一種方法在所有市場、所有時期都是最好的。In-sample 看起來漂亮的方法,out-of-sample 不一定最好——這正是配對交易的核心挑戰。 --- ## 十一、進階主題 ### Error Correction Model (ECM) 共整合暗示 ECM 的存在(Granger 表示定理)。完整的 ECM 不只告訴你兩個序列共整合,還告訴你**調整速度**: $$\Delta y_t = \alpha_1 + \alpha_y(y_{t-1} - \beta x_{t-1}) + \sum a_{11}^{(i)}\Delta y_{t-i} + \sum a_{12}^{(i)}\Delta x_{t-i} + e_{yt}$$ $\alpha_y$ 的大小和符號告訴你 $y$ 向均衡調整的速度。 ### Optimal Convergence Trading (Kargin) Kargin 研究最佳槓桿策略,有兩種直覺上合理的方式: 1. **閾值策略 (s,S)**:mispricing 超過閾值才交易,低於另一閾值才平倉 2. **連續調整策略**:根據 mispricing 大小連續調整部位 ### KPSS 檢定作為互補 ADF 以「有單根」為虛無假設;KPSS 以「定態」為虛無假設。最穩健的做法是兩者同時使用: - ADF 拒絕 + KPSS 不拒絕 → 強力支持定態 - 兩者都不拒絕 → 可能需要考慮 fractional integration --- ## 十二、寫好一個配對交易策略的 Checklist - [ ] **選擇合適的股票池**:同產業、高流動性、足夠的歷史資料 - [ ] **明確分割 formation 和 trading period**:避免前視偏誤 (look-ahead bias) - [ ] **至少用兩種方法交叉驗證**:如果某對同時被距離法和共整合法選中,信心更強 - [ ] **正式統計檢定**:不要只看圖「覺得」像均值回歸,用 ADF / KPSS / Variance Ratio 驗證 - [ ] **估計 hedge ratio**:用 $A - \beta B$ 而不是 $A - B$,$\beta$ 從 OLS 回歸得到 - [ ] **設定明確的進出場規則**:entry z-score、exit z-score、stop loss、最大持有天數 - [ ] **考慮交易成本**:手續費、稅、滑價 - [ ] **Out-of-sample 驗證**:formation period 的結果在 trading period 是否仍然有效 - [ ] **風險管理**:beta 中性、產業中性、分散持有多對 - [ ] **正確理解績效指標**:normalized P/L 不等於實際報酬率 ---