---
# System prepended metadata

title: 配對交易完整教學筆記

---

# 配對交易完整教學筆記

---

## 一、配對交易是什麼？

配對交易 (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 不等於實際報酬率

---
