配對交易 Pairs Trading 實戰:用 Python 重建 Edward Thorp 的統計套利策略

第 18 課・共 18 課

⚠️ 本站內容僅作教育用途,不構成投資建議。投資涉及風險,作出任何投資決定前請諮詢持牌專業人士。
目錄

Edward Thorp 是統計套利的先驅:他發明二十一點算牌術、與信息論之父 Claude Shannon 合作研製首部可穿戴電腦擊敗輪盤,其後把同一套數學思維帶進金融市場,以配對交易 Pairs Trading 建立起規模達八億美元的基金王國。本課筆記整理自 Algo-trading with Saleh 的教學影片,講者 Saleh 用 Python 與 Jesse 框架由零重建這套市場中性策略,並公開他自己實盤運行後的改良心得——包括回測由「看似完美」到「計入手續費後慘不忍睹」、再逐步修復的完整過程。

學習重點

詳細筆記

Thorp 與市場中性的概念

講者開首介紹 Edward Thorp 的背景:這位數學家先後在賭場與金融市場證明「或然率優勢可以系統化變現」。他稱配對交易為統計套利(Statistical Arbitrage),核心是一種市場中性結構——任何時刻都同時持有一個多頭與一個空頭倉位,市場整體升跌與盈虧無直接關係,利潤來自兩隻資產之間相對強弱的收斂。想深入了解 Thorp 其人,講者推薦其自傳《A Man for All Markets》。

研究環境與數據準備

講者在 Jupyter Notebook 內做前期研究,配合 Jesse 這個 Python 加密貨幣交易框架:Notebook 須放在 Jesse 項目根目錄,才能使用其 research 模組匯入數據。幾個關鍵設定:

把兩條回報序列畫在同一圖上,可見它們大致同向移動(相關),但並非完全同步:某些時段 ETC 跑贏 ETH,某些時段相反。若在 ETC 相對偏強時做空 ETC、做多 ETH,待兩者關係回復時平倉,便能賺取這段背馳——這就是配對交易的利潤來源,也是「不需要預測市場方向」的真正含義。

用 Z 分數量度背馳

肉眼看到的「背馳」要變成程式訊號,需要一個量度工具:Z 分數 Z-Score。做法分兩步:先計算價差序列(兩條回報序列相減),再把價差標準化——減去序列均值、除以序列標準差。Z 分數的答案代表「當前價差偏離均值多少個標準差」。

講者在圖上畫出 +1.2 與 -1.2 兩條門檻線:Z 分數升穿上軌,做空第一隻資產、做多第二隻;跌穿下軌則反向操作;回到均值(零線)平倉。門檻越低交易越頻密,屬需要測試的參數。

Z 分數與進出場門檻(截圖出自原片(Algo-trading with Saleh))

相關不等於協整

兩隻資產同向移動(相關)不足以支持配對交易,還要確認它們協整 Cointegration——即價差序列長期穩定、具回歸均值的性質。講者承認自己把概念大幅簡化,建議讀者自行查閱嚴謹定義;實務上 Jesse 已內建檢定函數,一行代碼便知結果。ETH 與 ETC 通過檢定,適合做配對;若想交易較冷門的組合(例如兩家交易所的平台幣),開倉前必須先做這一步。

前視偏差的警告

講者特別指出:Notebook 示範中用「整段數據的均值」去定門檻,嚴格來說犯了前視偏差 Look-Ahead Bias——回測時偷看了未來數據,結果必然虛高。之所以示範無妨,是因為 Jesse 框架在正式回測時只向策略暴露「到當刻為止」的數據,從機制上杜絕了這個問題。但若讀者自行以其他工具回測,必須改用滾動窗口計算均值與標準差。

策略程式結構(Jesse 框架)

講者的 GitHub 倉庫有兩個策略檔:PairsTrading 負責全部計算與決策,PairsTrading2 負責第二條交易路線,純粹讀取第一個策略寫入 shared_vars 字典的指令(1 = 做多、-1 = 做空、0 = 平倉),結構簡單。

主策略的要點:

  1. 數據窗口:取兩隻標的各自最近 200 支 K 線的收市價,轉成回報。200 這個回看期是講者的選擇,可自行測試。
  2. 計算價差與 Z 分數:價差序列要略過首個 NaN 值(c1[1:] - c2[1:]);真正用作訊號的只有 Z 分數序列的最後一個值。
@property
def spread(self):
    return self.c1[1:] - self.c2[1:]

@property
def z_score(self):
    spread = self.c1[1:] - self.c2[1:]
    z_scores = utils.z_score(spread)
    return z_scores[-1]

(以上代碼摘錄自原片教學)

  1. before() 方法:Jesse 在每支 K 線收市後最先執行的鉤子,適合放訊號計算。策略在此每 24 小時重新做一次協整檢定,若關係失效便把倉位指令歸零、停止開倉。
  2. 倉位分配:用 calculate_alpha_beta 求出對沖比率 beta,再按公式分配保證金——第一倉佔 1/(1+beta)、第二倉佔 beta/(1+beta),令兩邊風險敞口對稱。講者強調倉位公式對結果影響極大,市面有不同做法,這部分值得深入研究。

策略的 before() 方法與協整檢定代碼(截圖出自原片(Algo-trading with Saleh))

殘酷的第一課:手續費

上一輯影片的回測(不計手續費)極之亮麗:超過 7,800 宗交易,最大回撤僅約 -5%。但一旦計入交易所手續費並預留滑點,權益曲線立刻崩壞。本課用 BTC 與 SOL 重做實驗:即使手續費設為零,2025 年上半年的最大回撤已達 -41%;計入貼近市價單實際成本的費率後,同一策略虧掉 95% 本金。講者的結論很直接:原版邏輯在真實成本下不可交易。

四重改良:由虧 95% 到六個月 +18%

講者分享他實盤期間逐步加入的改良,每加一層回測便改善一截:

一、布林帶取代固定門檻。 不再用 Z 分數加 ±1.2 硬門檻,改為對價差序列直接套布林帶(20 期):價差跌穿下軌做多價差、升穿上軌做空價差、回到中軸平倉。效果與 Z 分數類似,但門檻隨近期波動自動調節,交易次數與虧損同步下降。

二、ADX 濾網。 ADX 量度市場波動與趨勢強度。講者設定門檻 30:ADX 低於 30 的平淡市況不開倉,只在波動夠大、市場較可能出現定價失效的時段交易。

三、趨勢濾網(KAMA)。 以 KAMA 均線判斷方向:價格在 KAMA 之上視為升勢,才允許做多第一隻資產;跌勢中才允許做空。令配對的方向與大勢一致,減少逆勢接刀。

四、價值濾網與組合止損。 這是講者認為最關鍵的一層。開倉前先問「這宗交易值不值得做」:價差絕對值必須大於 1.5%(流動性高的幣種;迷因幣波動大,門檻或要上調至 4%),否則預期利潤連手續費都不夠付。平倉邏輯同樣改造:兩個倉位的合計浮盈達 1.5% 即可收割,不必苦候價差完全回歸中軸;合計浮虧達 -5% 則強制平倉——配對策略的止損必須看兩倉合計盈虧,不能用一般單邊止損單。

if self.is_close and self.current_spread < bb.lowerband and self.adx and self.trend == 1 and self.is_worth_opening:
    self.shared_vars["s1-position"] = 1
    self.shared_vars["s2-position"] = -1
    self._set_proper_margin_per_route()
elif self.is_long and self.current_spread > bb.middleband and (self.is_worth_closing or self.time_to_stop):
    self.shared_vars["s1-position"] = 0

(以上代碼摘錄自原片教學)

加入全部濾網後的進出場規則(截圖出自原片(Algo-trading with Saleh))

改良過程的數字變化(講者提供的回測結果):交易次數由 286 宗銳減至 28 宗,中間版本勝率僅 28%、最大回撤 -10%,Sharpe ratio 由 -12 逐步改善至 -2;加入最後的平倉與止損邏輯後,2025 年上半年六個月回報 +18%、最大回撤僅 -2%、勝率 87%、Sharpe ratio 2.81——而且是已計手續費的數字。

講者的坦白:運氣與樣本外表現

值得記下的是講者的誠實。他明言回測期有揀選成分:把時段拉長至 2024 年初至 2025 年 11 月,策略在 2024 年(尤其年底)表現明顯失色,2025 年才持續造好。他 2025 年實盤運行確實獲利,但自認有幾分運氣。他亦沒有跑參數最佳化(Jesse 的最佳化模式暫不支援多路線策略),所有改動都基於邏輯推理而非暴力搜參——這反而降低了過度擬合的風險。

實盤最大的教訓是滑點:他實際支付的滑點高於回測假設(他並非在 Binance 交易,流動性較差)。他提醒若用在迷因幣上,波動大、機會多,但市況最波動時正是做市商抽走流動性的時刻,滑點會進一步惡化,回測的費率假設要預得更鬆。最後他建議不要只做一對,同時跑四至十對組合,權益曲線會平滑得多,最大回撤、Calmar 與 Sharpe ratio 都會改善。

拉長至 2024–2025 年的權益曲線:2024 年明顯回撤,2025 年才回升(截圖出自原片(Algo-trading with Saleh))

🙏 覺得內容有用?本站所有內容免費提供,使用推薦碼開戶就是支持我們繼續營運的最大鼓勵:

ZA Bank 邀請碼 P20923 —— 你享 HKD 2,000 迎新獎賞,本站獲得營運支持。 立即開戶 → (聯盟連結|投資涉及風險,受條款及細則約束,此資料僅可於香港境內分發)

MT5 可行性速評

項目評估
邏輯可移植性Z 分數、布林帶、ADX、KAMA 均可實現(布林帶/ADX/KAMA 有內建指標函數),但統計計算要自寫:MQL5 無內建協整檢定與 Z 分數函數,均值、標準差、對沖比率 beta 須用迴圈自行計算,或預先在 Python 算好定期匯入。
平台限制配對交易涉及兩個品種:MT5 的 EA 可用 iClose 等函數讀取多品種數據並分別落盤,但策略測試器對多品種 EA 的回測支援有限(部分版本僅對主圖品種逐 tick 模擬),價差序列與合計盈虧止損都要自行合成與追蹤,工程量大。
評級⚠️ 需自訂元件——核心統計元件(協整檢定、beta、價差合成)與組合止損均無現成方案,多品種回測可信度亦打折;建議先在 Python 完成研究,MT5 只作執行層。
MQL5 寫法提示見下方示意。
// 示意:讀取兩品種收市價並合成對數價差(非完整 EA)
double c1 = iClose("ETHUSD", PERIOD_M15, 1);
double c2 = iClose("ETCUSD", PERIOD_M15, 1);
double spread = MathLog(c1) - MathLog(c2);
// 均值與標準差需自建陣列以迴圈計算,再求 z = (spread - mean) / sd

注意:MT5 回測同樣會過度擬合,tick 數據質素與 spread 模型對結果影響極大,回測曲線亮麗不代表實盤可行。

欣利克的看法

名詞解釋

常見問題 FAQ

配對交易是否真的「市場中性、不會蝕錢」?

不是。市場中性只表示盈虧與大市方向脫鈎,並非沒有風險。若兩隻資產的協整關係失效,價差可以持續擴大而不回歸,兩邊倉位同時受壓;加上雙邊手續費與滑點,成本控制不當時虧損可以很快累積。原片不計成本的回測與計入成本後的結果相差近 90 個百分點,正是最佳說明。

為甚麼要用永續合約而不能用現貨做配對交易?

配對交易要求任何時刻都一長一短,而現貨市場沒有做空機制——你只能買入並持有,無法建立空頭倉位。永續合約允許直接開空,才能組成完整的配對。股票市場的對應做法是沽空(借貨賣出),同樣涉及額外成本與規則。

協整檢定通過後,這對資產就可以一直交易下去嗎?

不可以。協整是統計關係,會隨基本面與市場結構改變而失效。原片講者的做法是在策略中每 24 小時重新檢定一次,一旦失效便停止開倉。即使檢定持續通過,亦只代表歷史上價差穩定,不保證未來短期內必然收斂。

為甚麼講者最後建議同時交易多對組合?

單一配對的權益曲線受該組合的獨特事件影響很大,回撤集中。同時運行四至十對相關性低的組合,個別組合的虧損會被其他組合的盈利攤薄,權益曲線更平滑,最大回撤與 Sharpe ratio 等風險指標通常改善——本質上是把同一套統計優勢分散到更多獨立樣本上。

原影片

本文整理自以下影片,版權屬原創作者所有,建議配合原片觀看:

來源:https://www.youtube.com/watch?v=YE3EEXpW8yg

🏦 ZA Bank 開戶優惠

本站所有內容免費提供。多使用網站的推薦碼,就是對我們繼續製作優質內容的最大鼓勵和支持 🙏

去 ZA Bank 開戶,享價值 HKD 2,000 迎新獎賞,仲有機會享 USD 30 指定美股兌換券!

  • 💛 全線上開戶,無需前往分行
  • 💛 無最低存款要求,零賬戶管理費
  • 💛 24x7 銀行服務

專屬邀請碼:P20923

立即開戶 → (聯盟連結)