# 配對交易完整教學筆記
---
## 一、配對交易是什麼?
配對交易 (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 不等於實際報酬率
---