協整關係分析:揭開市場長期均衡的數學奧秘與量化交易實戰

量化研究團隊
量化研究團隊
2025-12-15 688 瀏覽 3 分鐘閱讀
協整關係分析:揭開市場長期均衡的數學奧秘與量化交易實戰

協整關係分析:長期均衡的數學基礎與交易實戰

在量化交易的殿堂裡,我們不斷追尋市場中可預測的模式。大多數資產價格序列本身是非平穩的(具有隨機趨勢),這使得直接預測其走勢猶如預測風向般困難。然而,金融計量經濟學家Robert Engle和Clive Granger在1987年的開創性工作,為我們點亮了一盞明燈:協整(Cointegration)。他們發現,儘管兩個或多個非平穩時間序列各自隨機遊走,但它們的某個線性組合卻可能是平穩的。這意味著這些序列被一種無形的「經濟引力」所束縛,長期偏離均衡後終將回歸。這項發現不僅為他們贏得了2003年的諾貝爾經濟學獎,更為統計套利策略奠定了堅實的理論基石。

為何協整如此重要?從直覺到數學

想像一對被拴在一起的狗(比喻源自Murray的《統計套利》)。每隻狗都可以在有限的範圍內自由跑動(短期波動),但繩子的長度限制了它們彼此遠離的距離(長期均衡)。在金融市場中,這對「狗」可能是原油價格和航空公司的股價,或是同一行業內的兩家競爭對手公司的股票。

傳統的相關性分析捕捉的是資產價格變化的同步性,但它是一個短期的、脆弱的指標。協整關係則揭示了價格水平之間的長期綁定關係。這種關係之所以存在,根源於基本的經濟力量,例如替代效應、成本關聯或共同的風險因子。

嚴格的數學定義

如果一組時間序列 \( \{y_{1t}, y_{2t}, ..., y_{nt}\} \) 本身是 d階單整(Integrated of order d),記為 \( I(d) \)(即需要進行d次差分才能變成平穩序列),但存在一個非零向量 \( \mathbf{\beta} = (\beta_1, \beta_2, ..., \beta_n) \),使得線性組合: \[ z_t = \mathbf{\beta} \mathbf{Y}_t = \beta_1 y_{1t} + \beta_2 y_{2t} + ... + \beta_n y_{nt} \sim I(d-b), \quad b>0 \] 那麼我們稱這組序列存在協整關係,\( \mathbf{\beta} \) 稱為協整向量。在交易中最常見的情況是 \( d=1, b=1 \),即序列本身是 \( I(1) \)(一階單整,或稱「單位根過程」),但其線性組合 \( z_t \) 是 \( I(0) \)(平穩過程)。這個平穩的 \( z_t \) 就是我們的價差序列(Spread),它將圍繞一個恆定的均值(通常為0)波動。

核心檢驗方法:從理論到實踐

1. Engle-Granger 兩步法

這是最直觀的方法,適用於兩變量情況。

  1. 第一步:靜態回歸
    對兩個 \( I(1) \) 序列進行回歸:\( y_t = \alpha + \beta x_t + \epsilon_t \)。OLS估計給出協整向量 \( (1, -\hat{\beta}) \) 的估計。
  2. 第二步:殘差單位根檢驗
    對回歸殘差 \( \hat{\epsilon}_t \) 進行ADF檢驗(Augmented Dickey-Fuller Test)。如果拒絕「殘差存在單位根」的原假設,則認為 \( y_t \) 和 \( x_t \) 協整。

優點:簡單易懂。缺點:對於多變量(>2)情況,可能存在多個協整向量,且第一步的回歸估計量在小樣本下存在偏差。

2. Johansen 檢驗

這是多變量協整分析的標準方法,基於向量誤差修正模型(VECM): \[ \Delta \mathbf{Y}_t = \mathbf{\Pi} \mathbf{Y}_{t-1} + \sum_{i=1}^{p-1} \mathbf{\Gamma}_i \Delta \mathbf{Y}_{t-i} + \mathbf{\epsilon}_t \] 其中,\( \mathbf{\Pi} = \mathbf{\alpha} \mathbf{\beta}^\prime \)。這裡的 \( \mathbf{\beta} \) 是協整向量矩陣(每列是一個協整向量),\( \mathbf{\alpha} \) 是調整速度矩陣。Johansen通過檢驗矩陣 \( \mathbf{\Pi} \) 的秩(rank)來確定協整關係的數量。它提供了更穩健的結果,是業界的首選。

實戰案例剖析

案例一:原油與航空股的「愛恨糾葛」

航空公司的核心成本是航油,其價格與布倫特原油或WTI原油期貨高度聯動。因此,我們可以預期某航空公司股價(如美國航空AAL)與原油價格(如USO ETF)之間存在長期均衡關係:油價上漲侵蝕利潤,股價應下跌,反之亦然。

實戰步驟模擬

  1. 獲取AAL和USO的日度價格數據(例如5年歷史)。
  2. 分別對兩序列進行ADF檢驗,確認其為 \( I(1) \) 過程。
  3. 使用Engle-Granger或Johansen檢驗確認協整關係。
  4. 若協整,建立回歸模型:\( \text{AAL}_t = \alpha + \beta \cdot \text{USO}_t + \epsilon_t \)。
  5. 交易信號:計算標準化價差 \( z_t = (\text{Spread}_t - \mu_{\text{spread}}) / \sigma_{\text{spread}} \)。當 \( z_t > +2 \)(價差過寬)時,做空AAL、做多USO(預期價差收斂)。當 \( z_t < -2 \) 時,執行相反操作。

關鍵洞察:這個關係並非永恆。2014-2015年油價暴跌期間,航空公司通過對沖鎖定了高油價成本,導致價差關係一度失效,這提醒我們必須持續監控協整關係的穩定性。

案例二:經典的「金銀比價」均值回歸

黃金和白銀同為貴金屬,具有金融和商品雙重屬性,其價格比(Gold/Silver Ratio)長期在一個歷史區間內波動(例如過去30年在45到85之間)。這本身就是一種協整關係的體現。我們可以直接對黃金期貨(GC)和白銀期貨(SI)的價格進行協整分析,構建多空組合。

根據Ciner(2015)在《International Review of Financial Analysis》上發表的論文,金銀比在極端水平時顯示出強烈的均值回歸特性,但回歸速度較慢,適合中長期持倉的策略。交易員會在金銀比突破80時賣出黃金、買入白銀(預期比值下降),在比值跌破50時執行相反操作。

Python實戰:從數據到交易信號

以下是一個使用`statsmodels`庫實現Engle-Granger兩步法和簡單交易信號生成的示例代碼。

import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller, coint

# 1. 獲取數據
tickers = ['AAL', 'USO']
start_date = '2018-01-01'
end_date = '2023-12-31'
data = yf.download(tickers, start=start_date, end=end_date)['Adj Close']
data = data.dropna()
print(data.head())

# 2. 視覺化價格序列
fig, axes = plt.subplots(2, 1, figsize=(12, 8))
data['AAL'].plot(ax=axes[0], title='AAL Price')
data['USO'].plot(ax=axes[1], title='USO Price', color='orange')
plt.tight_layout()
plt.show()

# 3. 單位根檢驗 (ADF Test)
def check_stationarity(series, name):
    result = adfuller(series.dropna())
    print(f'ADF Statistic for {name}: {result[0]:.4f}')
    print(f'p-value: {result[1]:.4f}')
    if result[1] < 0.05:
        print(f'  -> {name} is likely STATIONARY (reject H0)')
    else:
        print(f'  -> {name} is likely NON-STATIONARY (cannot reject H0)')
    print('---')

check_stationarity(data['AAL'], 'AAL')
check_stationarity(data['USO'], 'USO')
# 通常價格序列是非平穩的,我們需要檢驗一階差分
check_stationarity(data['AAL'].diff().dropna(), 'AAL Returns (Diff)')
check_stationarity(data['USO'].diff().dropna(), 'USO Returns (Diff)')

# 4. Engle-Granger 協整檢驗
score, pvalue, _ = coint(data['AAL'], data['USO'])
print(f'Cointegration test p-value: {pvalue:.6f}')
if pvalue < 0.05:
    print("-> AAL and USO are cointegrated (reject H0 of no cointegration).")
else:
    print("-> No evidence of cointegration.")

# 5. 估計協整關係 (靜態OLS回歸)
X = sm.add_constant(data['USO'])  # 添加常數項
model = sm.OLS(data['AAL'], X).fit()
beta = model.params['USO']
alpha = model.params['const']
print(f"Estimated cointegration relationship: AAL = {alpha:.4f} + {beta:.4f} * USO")

# 計算價差序列 (協整組合)
spread = data['AAL'] - beta * data['USO'] - alpha  # 即回歸殘差
# 或者直接使用: spread = model.resid

# 6. 分析價差的平穩性 (應為平穩)
check_stationarity(spread, 'Cointegration Spread')

# 7. 生成交易信號 (基於Z-Score)
window = 20  # 滾動窗口計算均值和標準差
spread_mean = spread.rolling(window=window).mean()
spread_std = spread.rolling(window=window).std()
zscore = (spread - spread_mean) / spread_std

# 交易規則
data['zscore'] = zscore
data['position_AAL'] = np.nan
data['position_USO'] = np.nan

# 當價差過高 (z>1.5),做空價差:賣AAL,買USO (比例為 1 : beta)
data.loc[data['zscore'] > 1.5, 'position_AAL'] = -1
data.loc[data['zscore'] > 1.5, 'position_USO'] = 1
# 當價差過低 (z<-1.5),做多價差:買AAL,賣USO
data.loc[data['zscore'] < -1.5, 'position_AAL'] = 1
data.loc[data['zscore'] < -1.5, 'position_USO'] = -1
# 當價差回歸 (|z|<0.5),平倉
data.loc[abs(data['zscore']) < 0.5, ['position_AAL', 'position_USO']] = 0

# 向前填充持倉,直到下一個信號出現
data['position_AAL'] = data['position_AAL'].ffill().fillna(0)
data['position_USO'] = data['position_USO'].ffill().fillna(0)

# 8. 簡單計算策略收益 (未考慮交易成本、保證金等)
data['returns_AAL'] = data['AAL'].pct_change()
data['returns_USO'] = data['USO'].pct_change()
data['strategy_returns'] = (data['position_AAL'].shift(1) * data['returns_AAL']) + \
                           (data['position_USO'].shift(1) * data['returns_USO'])
cumulative_returns = (1 + data['strategy_returns'].dropna()).cumprod()

# 9. 繪製結果
fig, axes = plt.subplots(3, 1, figsize=(14, 10))
axes[0].plot(data.index, spread, label='Spread (AAL - β*USO - α)', color='purple')
axes[0].axhline(y=0, linestyle='--', color='gray', alpha=0.7)
axes[0].set_title('Cointegration Spread')
axes[0].legend()
axes[0].grid(True)

axes[1].plot(data.index, zscore, label='Z-Score of Spread', color='red')
axes[1].axhline(y=1.5, linestyle='--', color='green', alpha=0.5, label='Upper Threshold')
axes[1].axhline(y=-1.5, linestyle='--', color='green', alpha=0.5, label='Lower Threshold')
axes[1].axhline(y=0, linestyle='-', color='black', alpha=0.3)
axes[1].fill_between(data.index, -1.5, 1.5, alpha=0.1, color='gray')
axes[1].set_title('Z-Score and Trading Bands')
axes[1].legend()
axes[1].grid(True)

axes[2].plot(cumulative_returns.index, cumulative_returns, label='Strategy Cumulative Return', color='blue', linewidth=2)
axes[2].set_title('Strategy Performance')
axes[2].legend()
axes[2].grid(True)
plt.tight_layout()
plt.show()

print(f"Strategy Sharpe Ratio (approx): {data['strategy_returns'].mean() / data['strategy_returns'].std() * np.sqrt(252):.4f}")

風險警示與策略精煉

協整策略並非「聖杯」,其風險不容忽視:

  1. 協整關係破裂:這是最大的風險。公司併購、行業結構性變化、監管政策轉變都可能永久性破壞長期均衡關係。必須定期(如每季度)重新檢驗協整關係。
  2. 長期偏離(Long-term Divergence):價差可能長時間不迴歸,甚至擴大,導致巨額浮虧和保證金壓力。這要求策略必須有嚴格的止損機制。
  3. 交易成本侵蝕:高頻的均值回歸交易會產生大量手續費和滑點。必須在回測中精確建模,確保策略有足夠的預期收益覆蓋成本。
  4. 樣本內過擬合:在歷史數據上找到完美的協整對和參數閾值非常容易。必須使用樣本外數據和滾動窗口進行嚴格驗證。

精煉建議

  • 使用動態對沖比率:不要使用固定的β。可以採用滾動回歸或Kalman濾波器來動態估計β,以適應關係的緩慢變化。
  • 結合其他因子:將協整價差信號與動量、波動率、市場情緒等因子結合,可以改善進出場時機。
  • 多對組合分散風險:構建一個由數十個不相關的協整對組成的投資組合,能顯著降低單一關係破裂的風險,提升夏普比率。

結論與行動指南

協整分析是連接計量經濟學理論與量化交易實踐的一座堅實橋樑。它將看似混沌的價格運動,解讀為受長期均衡力量驅動的系統。

給量化交易者的行動清單

  1. 尋找候選資產對:從具有潛在經濟聯繫的資產開始(同行業股票、相關商品、ETF與其成分股、利率曲線上的不同期限)。
  2. 嚴格執行檢驗流程:ADF檢驗(單整階數)→ Johansen檢驗(協整關係存在性與秩)→ 殘差診斷(異方差、自相關)。
  3. 穩健的參數估計:使用足夠長的歷史數據(至少包含多個市場周期),並考慮使用滾動估計。
  4. 風險管理先行:設定基於波動率的頭寸規模、硬性止損線,並對整個協整組合設定最大回撤閾值。
  5. 持續監控與迭代:將協整檢驗和參數估計自動化,定期運行報告。關係一旦弱化,立即減倉或退出。

正如Granger和Engle所揭示的,市場的長期記憶隱藏在協整關係之中。掌握這項工具,意味著你能在市場的短期噪音中,辨識出那些持久而有力的均衡旋律,並從中譜寫出穩健的收益篇章。


免責聲明與風險提示:本文所有內容僅供教育與研究目的,不構成任何投資建議。量化交易涉及重大風險,包括可能損失全部本金。過去表現不代表未來結果。文中提及的策略示例均經過簡化,實際應用需考慮交易成本、滑點、流動性、稅務及個人財務狀況。讀者在進行任何實盤交易前,應諮詢獨立的專業財務顧問,並自行承擔所有風險。市場可能出現極端情況,導致任何歷史關係失效。

權威來源參考

  1. Engle, R. F., & Granger, C. W. J. (1987). Co-integration and error correction: Representation, estimation, and testing. Econometrica, 55(2), 251-276. (開創性論文)
  2. Johansen, S. (1991). Estimation and hypothesis testing of cointegration vectors in Gaussian vector autoregressive models. Econometrica, 59(6), 1551-1580. (多變量協整檢驗的奠基工作)
  3. Chan, E. P. (2013). Algorithmic Trading: Winning Strategies and Their Rationale. John Wiley & Sons. (提供了實用的協整交易策略案例和代碼)
分享此文章

相關文章

波動率目標策略:量化交易中的動態風險調節器——從理論到實戰的深度解析

波動率目標策略:量化交易中的動態風險調節器——從理論到實戰的深度解析

在瞬息萬變的金融市場中,如何系統性地管理風險是長期獲利的關鍵。波動率目標策略(Volatility Targeting)正是這樣一種強大的風險管理框架,它動態調整投資組合的風險敞口,旨在實現穩定的風險水平。本文將深入探討其背後的數學原理,剖析2008年金融危機與2020年疫情崩盤中的經典案例,並提供實用的Python實作範例。我們將揭示如何將這一對沖基金常用的技術應用於個人投資組合,在追求報酬的同時,有效馴服市場的狂野波動。

季節性交易策略的量化解剖:揭開月份效應與節假日效應的統計真相與實戰陷阱

季節性交易策略的量化解剖:揭開月份效應與節假日效應的統計真相與實戰陷阱

在華爾街超過十五年的量化生涯中,我見證了無數策略的興衰,而季節性策略以其看似簡單的邏輯和頑強的生命力,始終是量化工具箱中一個引人入勝的角落。本文將以資深量化交易員的視角,深度剖析「月份效應」(如一月效應、Sell in May)與「節假日效應」(如聖誕行情、感恩節前後)背後的統計證據、經濟學解釋與微結構成因。我們將超越坊間傳聞,運用嚴謹的回測框架、Python實戰代碼,並結合真實市場案例(如2008年金融危機對季節模式的扭曲),揭示如何將這些「日曆異象」轉化為具有風險調整後超額收益的系統性策略,同時毫不避諱地討論其數據探勘風險、結構性衰減以及嚴格的風控要求。

時間序列分析的量化交易實戰:從ARIMA預測到GARCH波動率建模的完整指南

時間序列分析的量化交易實戰:從ARIMA預測到GARCH波動率建模的完整指南

在量化交易的領域中,價格與波動率不僅是數字,更是蘊含市場情緒與風險的複雜時間序列。本文將帶您深入探討從經典的ARIMA模型到捕捉波動叢聚的GARCH家族模型。我們將拆解背後的數學原理,分享華爾街實戰中的應用案例,並提供Python實作範例。您將學到如何建立一個結合均值與波動率預測的交易策略框架,同時理解這些強大工具的局限性與風險。這不僅是一篇技術指南,更是一位資深量化交易員的經驗結晶。

交易成本建模:量化策略的隱形殺手與致勝關鍵——從理論模型到實戰調優的深度解析

交易成本建模:量化策略的隱形殺手與致勝關鍵——從理論模型到實戰調優的深度解析

在量化交易的競技場中,阿爾法(Alpha)的發掘固然激動人心,但交易成本的精確建模與管理,往往是區分紙上富貴與實際盈利的關鍵分野。本文將深入剖析交易成本的核心構成——佣金、買賣價差與市場衝擊成本,並揭示後者如何隨訂單規模呈非線性劇增。我們將探討經典的Almgren-Chriss最優執行模型,並透過2010年「閃電崩盤」及統計套利策略的實戰案例,展示成本建模失誤的毀滅性後果。最後,提供結合TWAP/VWAP、預測模型與實時監控的實用框架,並附上Python實作範例,助您將理論轉化為守護策略夏普率的堅實盾牌。