2020 年這篇文章用 Python 算出「台股與英國 Cboe UK 100 相關係數高達 0.9」。六年後我們用同一套工具重算,發現這個結論建立在一個常見的方法錯誤上:拿價格水準(而非報酬率)計算相關係數。修正算法之後,台股真正的好兄弟換人了,而「高相關就能做配對交易」這個直覺,也被一次扣足成本的回測潑了冷水。

重算後的關鍵數字
| 項目 | 數值 |
|---|---|
| 台股 vs Cboe UK 100,價格水準相關(2015-01~2026-06) | 0.84(2020 年舊文窗口算出 0.9) |
| 同一組指數,改用日報酬率計算 | 0.30 |
| 與台股日報酬相關最高的指數 | 韓國 KOSPI:0.68 |
| 台股 vs 費城半導體:價格相關/日報酬相關 | 0.99/0.14 |
| 台股 vs S&P 500:同日/美股前一晚 | 0.15/0.43 |
| 台股 vs S&P 500 的 120 日滾動相關範圍 | -0.39~+0.51 |
| 金控配對交易回測(2018-01~2026-06,含成本)CAGR | -1.04%(日夏普 -0.28、MDD -11.71%) |
| 同策略零成本對照 CAGR | +1.35%(日夏普 0.40) |
| 策略與 0050 日報酬相關 | 0.03(接近完全市場中性) |
| 0050 含息同期 CAGR | 25.05%(日夏普 1.22、MDD -33.96%) |
資料快照:2026-06-09。所有數字可用文末的 完整回測腳本 重現。
相關係數是什麼?從天氣與冰棒說起
想像有人每天記錄「氣溫」與「冰棒銷量」:天氣越熱、冰棒賣得越多,把每天的觀測畫成散布圖,點會排成一條往右上的帶狀。再記錄「氣溫」與「感冒人數」,點會往右下排列;換成「氣溫」與「擲筊結果」,點就會散成一團毫無方向。相關係數做的事,是把這三張圖各自壓縮成一個 -1 到 +1 之間的數字。
皮爾森(Pearson)相關係數的定義是共變異數除以兩者標準差的乘積:
實際用樣本資料計算時的形式為:
- :完全正相關,X 漲 Y 必漲。
- :完全負相關,X 漲 Y 必跌。
- :兩者的線性關係為零。
用 5 天報酬手算一次相關係數
以下是一個純教學示例(虛構數字,非任何真實股票)。假設股票甲與股票乙最近 5 天的日報酬率(%)如下:
| 日期 | 甲 | 乙 |
|---|---|---|
| 第 1 天 | +2 | +1 |
| 第 2 天 | +1 | +2 |
| 第 3 天 | -1 | -2 |
| 第 4 天 | +3 | +2 |
| 第 5 天 | 0 | +2 |
兩檔的平均報酬都是 1%。把每天的報酬減去平均,得到甲的離差(+1, 0, -2, +2, -1)與乙的離差(0, +1, -3, +1, +1)。分子是離差逐日相乘再加總:。分母是兩組離差平方和的開根號相乘:。所以:
兩檔股票的日報酬相關約 0.64:同漲同跌的傾向明顯,但離「鎖在一起」還很遠。這個量級剛好和後面會看到的「台股 vs 韓國 KOSPI」差不多,可以當成讀相關係數的直覺錨點。
用價格算相關係數,是 2020 年這篇文章犯過的錯
舊版文章把全球指數的「收盤價」直接丟進 corr(),得到台股與 Cboe UK 100 相關 0.9 的結論。問題在於:股價是非定態(non-stationary)序列,長期都往上走。只要兩個市場這十年都在漲,價格水準的相關係數就會被共同的上升趨勢灌得很高,與「今天你漲我是否也漲」毫無關係。這正是計量經濟學說的虛假迴歸問題;Engle & Granger (1987)正是為了處理非定態序列之間的關係,才發展出共整合(cointegration)檢定,後文配對交易一節會再用到。
正確做法是先把價格轉成日報酬率(定態序列)再算相關。下圖把兩種算法放在同一份 2015-01~2026-06 的資料上對照:

落差有多誇張?用台股的兩個鄰居當例子(數字皆出自上圖同一份資料):
| 指數對 | 價格水準相關 | 日報酬相關 |
|---|---|---|
| 台股 vs 費城半導體 | 0.99 | 0.14 |
| 台股 vs 那斯達克 | 0.96 | 0.14 |
| 台股 vs Cboe UK 100 | 0.84 | 0.30 |
| 台股 vs 韓國 KOSPI | 0.87 | 0.68 |
台股和費城半導體指數的價格相關高達 0.99,因為兩者過去十年都被半導體大多頭推著走;但同一天的報酬相關只有 0.14。價格相關回答的是「我們是否搭著同一班長期趨勢的車」,報酬相關回答的才是「今天你跌我會不會跟著跌」。投資人關心的風險屬於後者。
台股的好兄弟是哪國指數?2026 年重算的答案是韓國
把 13 個全球主要指數的日報酬相關對台股排序(2015-01~2026-06),排行如下:韓國 KOSPI 0.68、日經 225 0.61、香港恆生 0.49、英國富時 100 0.32、德國 DAX 0.31、Cboe UK 100 0.30,而 S&P 500、那斯達克、費城半導體、道瓊全部只有 0.14~0.15。
韓國居冠很合理:兩個市場同處亞洲時區、同樣以科技出口為主、同樣高度受半導體景氣循環驅動,台積電與三星電子甚至是直接競爭對手。下圖把兩條指數疊在一起看:

有趣的是 2024 年之後兩條線明顯分岔(台股漲幅遠勝),但日報酬的同步性仍在:相關係數衡量的是「每天一起動的程度」,與「最後誰漲得多」是兩回事。
美股影響台股,但要看「前一晚」
那為什麼大家的體感是「美股大跌,台股隔天就慘」,數字上台股與 S&P 500 的相關卻只有 0.15?答案是時差。台股下午 1:30 收盤時,美股當天根本還沒開盤;「同一個日期」的兩筆報酬在時間上其實錯開了半天。把美股報酬往後移一個交易日再算,相關係數立刻跳上來:
| 指數 | 同日相關 | 台股今天 vs 美股前一晚 |
|---|---|---|
| S&P 500 | 0.15 | 0.43 |
| 那斯達克 | 0.15 | 0.45 |
| 費城半導體 | 0.15 | 0.49 |
費城半導體前一晚的走勢,是隔天台股開盤最有參考價值的單一指標(相關 0.49),這與台股市值高度集中在半導體供應鏈的結構一致。處理跨市場資料時若忽略時區對齊,連「美股影響台股」這麼明顯的關係都會被算成幾乎無關。
相關性不是定值:120 日滾動相關從 -0.39 擺到 +0.51
很多人把相關係數當成資產的固定屬性,這是第二個常見誤解。把台股與 S&P 500 的日報酬用 120 日視窗滾動計算,相關係數長期平均只有 0.14,但範圍從 -0.39 一路擺到 +0.51:

兩個現象值得注意。第一,每逢系統性危機(2020 年 3 月疫情股災、2024 年 8 月日圓套利平倉),滾動相關就會急速飆高,全球股市看起來「突然變得很同步」。Forbes & Rigobon (2002)指出這有一部分是統計機制使然:高波動時期會機械性地放大相關係數的估計值,他們校正異質變異數後發現,1997 亞洲金融風暴等危機中許多市場間並沒有真正的傳染效果,只有原本就存在的相互依賴。第二,分散風險最需要低相關的時候(崩盤),往往正是相關性最高的時候。做資產配置時若用單一一個歷史相關係數來估計分散效果,會系統性高估組合在危機中的保護力,這也是 SPY 搭配 TLT 這類股債組合需要實際回測而非紙上推算的原因。
Python 實作:pandas 三行算出相關係數矩陣
抓資料的部分可以參考用 yfinance 一次抓取全球指數的教學,或全球指數歷史資料下載那篇的爬蟲版本。資料到手後,計算相關係數矩陣只需要先轉報酬率、再呼叫 .corr():
顯示程式碼
import yfinance as yf
tickers = ["^TWII", "^GSPC", "^KS11", "^N225", "^FTSE"]
px = yf.download(tickers, start="2015-01-01", auto_adjust=True)["Close"]
returns = px.pct_change() # 關鍵一步:先把價格轉成日報酬率
corr = returns.corr() # 兩兩相關係數矩陣(對稱,對角線為 1)
print(corr.round(2))順帶修正舊版文章的一個錯誤:熱力圖套件的名稱是 seaborn,安裝指令是 pip install seaborn(舊文誤寫成 pip install sns,sns 只是社群慣用的匯入別名)。畫熱力圖與滾動相關:
顯示程式碼
import seaborn as sns
import matplotlib.pyplot as plt
# 相關係數熱力圖
sns.heatmap(corr, annot=True, square=True, vmax=1.0, cmap="RdYlBu_r")
plt.show()
# 120 日滾動相關:觀察相關係數隨時間的變化
pair = returns[["^TWII", "^GSPC"]].dropna()
rolling = pair["^TWII"].rolling(120).corr(pair["^GSPC"])
rolling.plot()auto_adjust=True 會回傳還原權息的調整後收盤價,這點對台股尤其重要:台股除權息頻繁,若用未調整價格,每年除息日都會出現一根人造的下跌,污染報酬率與相關係數的估計。
從相關性到配對交易:高相關不等於會均值回歸
相關性研究最自然的策略延伸是配對交易(pair trading):找兩檔走勢高度連動的股票,當價差罕見地拉開時,作多落後的、放空超漲的,賭價差會收斂。Gatev, Goetzmann & Rouwenhorst (2006)檢驗了這個華爾街老牌策略在美股 1962~2002 年的表現:年化超額報酬最高約 11%,且與市場報酬幾乎無關;但他們同時記錄了報酬在樣本後期明顯衰退,這個伏筆跟我們的台股實測結果直接相關。
這裡有個關鍵的觀念分野:兩檔股票報酬相關很高,只代表它們「每天往同方向動」,並不保證價差拉開後會收斂回來。要檢驗「價差會均值回歸」,需要的是共整合檢定。Engle-Granger 方法先對兩檔股票的對數價格跑迴歸:
再檢定殘差 是否定態。若通過檢定(p 值夠小),表示兩者間存在長期均衡關係,價差(spread) 偏離後傾向回到均值,這才是配對交易可以收割的性質。進出場訊號用價差的標準化分數:
其中 、 是 60 日滾動平均與標準差。 表示價差罕見地拉開(進場), 回到 0 表示價差收斂(出場)。
台股金控配對交易回測:扣完成本年化 -1.04%
配對交易要求兩檔標的業務同質性極高,台股最天然的實驗場是金控股。回測設計如下:
- 股票池:14 檔金控股(2880~2892、5880;新光金 2025 年併入台新金後資料自然截止)。
- 形成期(每半年重選):取進場前 252 個交易日,要求日報酬相關 > 0.6 且 Engle-Granger 共整合 p < 0.05,依 p 值取最小的 5 組配對。
- 交易期:價差用形成期 OLS 估計的對沖比 計算,60 日滾動 z-score, 進場(作多便宜腿、放空貴腿各 50% 部位),z 回到 0 或交易期結束時出場。
- 成本:手續費 0.1425%(買賣與融券雙邊)、證交稅 0.3%(現股賣出與融券放空時)、借券成本年化 1%(估計值)。
- 基準:0050 還原價買進持有(純指數算術,不含交易成本)。
walk-forward 跑完 2018-01~2026-06 共 17 個半年期、84 筆來回交易,結果:
| 指標 | 配對交易(含成本) | 配對交易(零成本對照) | 0050 含息 |
|---|---|---|---|
| 總報酬 | -8.4% | +12.0% | +558.5% |
| CAGR | -1.04% | +1.35% | +25.05% |
| 日夏普 | -0.28 | 0.40 | 1.22 |
| 月索提諾 | -0.31 | 0.42 | 1.92 |
| 最大回撤 | -11.71% | -9.32% | -33.96% |
| 年化波動 | 3.63% | 3.67% | - |
| 與 0050 日報酬相關 | 0.03 | 0.02 | 1.00 |

策略確實做到了教科書承諾的市場中性:與 0050 的日報酬相關只有 0.03,2022 年大盤回撤 -33.96% 時策略幾乎無感。但它沒做到的是賺錢。這不是參數挑壞了的個案:把形成期相關門檻從 0.6 收緊到 0.8,8 年半只剩 9 筆交易(85% 的日子空手),CAGR -1.21%、日夏普 -0.59,更糟。
範例交易:富邦金與元大金
2026 上半年入選的配對之一是富邦金(2881)/元大金(2885):形成期報酬相關 0.71、共整合 p 值 0.0104。2026 年 1 月初價差 z-score 跌破 -2(富邦金相對元大金罕見便宜),策略作多富邦金、放空元大金;之後 z 值在 -2 附近徘徊近五個月,直到 5 月底才回到 0 出場:

這筆交易最後有收斂、有獲利,但耗時五個月,期間借券成本一路滴水穿石。84 筆交易中還有 19 筆到交易期結束都沒等到收斂,期末強制出場。
成本拆解:毛利太薄,稅與借券費吃光一切
零成本版總報酬 +12.0%、含成本版 -8.4%,中間約 20 個百分點的差距全是摩擦成本。逐項拆:零成本對照版 8.4 年總報酬僅 +12.0%,平攤 84 筆交易後每筆的毛利貢獻極薄,而每筆來回交易的固定成本就要約 0.585%(雙腿手續費 0.285% 加證交稅 0.3%);持倉期間空方部位另付年化約 1% 的借券費,遇上像富邦金/元大金那種五個月才收斂的交易,毛利再被啃掉一層。Gatev 等人在美股觀察到的報酬衰退,在台股疊加了證交稅與融券限制(平盤下放空限制、強制回補、停券期),對散戶資金規模而言,這套經典策略在 2018 年後的台股金控股上行不通。我們選擇把這個負面結果完整發布,因為它和量化交易的缺點與風險那篇講的是同一件事:回測的價值有一半在於告訴你哪些直覺其實賺不到錢。
想看多空對沖在台股的其他玩法,可以參考用 finlab 做多空對沖回測的教學。
回測方法與限制
| 項目 | 本文做法 |
|---|---|
| 交易成本 | 手續費 0.1425%(未打折、雙邊)、證交稅 0.3%(現股賣出與融券放空)、借券成本年化 1%(估計值)。因策略含放空部位,損益由本文腳本自行計算(finlab sim() 以做多部位為主),費率與 sim() 台股預設一致 |
| 滑價 | 未估計。金控股流動性佳,但實際成交價仍可能劣於收盤價 |
| 股票池 | 僅 14 檔金控股。配對交易需要高同質性標的,故與本站多數選股文「排除金融股」的慣例相反 |
| 流動性過濾 | 未另設門檻(金控皆為大型權值股) |
| 排除類別 | 不含一般上市櫃個股、ETF;新光金 2025 年下市以強制出場處理(84 筆中含 19 筆期末強制出場) |
| 前視偏差 | 配對篩選、對沖比 只用進場前 252 日資料估計;z-score 為滾動計算;不使用任何財報資料,無公告日對齊問題 |
| 權重 | 每期入選配對等權分配資金,每組配對內多空各 50%;未觸發訊號時持有現金(57.1% 的交易日有部位) |
| 周轉率 | 8.4 年共 84 筆來回交易,每半年重選配對 |
| 樣本內外 | walk-forward 設計(形成期與交易期完全分離);但 z=2、60 日窗等門檻沿用文獻慣例,未做參數最佳化,也因此不存在「調參調出來的好績效」,負面結果反而更可信 |
用 finlab 找你自己的配對
上面所有結論都可以用 pip install finlab 重現。下面這段程式掃描金控股中目前通過雙重檢定(報酬相關 + 共整合)的配對:
顯示程式碼
import numpy as np
import finlab
from finlab import data
from statsmodels.tsa.stattools import coint
finlab.login() # 第一次使用會自動引導登入
adj = data.get("etl:adj_close") # 還原股價(已調整除權息)
holdings = ["2880", "2881", "2882", "2884", "2885",
"2886", "2887", "2890", "2891", "2892", "5880"]
prices = adj[holdings].dropna().iloc[-252:] # 最近一年
returns = prices.pct_change()
logp = np.log(prices)
for i, a in enumerate(holdings):
for b in holdings[i + 1:]:
corr = returns[a].corr(returns[b])
_, pvalue, _ = coint(logp[a], logp[b])
if corr > 0.6 and pvalue < 0.05:
print(f"{a}/{b} 報酬相關 {corr:.2f} 共整合 p={pvalue:.4f}")完整的 walk-forward 回測(含成本計算與所有圖表數據)在可下載的 strategy.py,歡迎改參數驗證我們的負面結論。相關性矩陣這項工具本身仍然非常有用:多因子選股要挑彼此低相關的因子、多策略資產配置要挑彼此低相關的策略,原理都和本文第一段的計算完全相同。想系統性入門,可以從量化交易完整指南與程式交易入門教學接著讀。
常見問題
相關係數多少算高?
沒有放諸四海皆準的門檻,要看資產類別與用途。以日報酬而言,台股與韓國 KOSPI 的 0.68 已是跨國指數中的極高值;同市場、同產業的個股(如金控股之間)常見 0.6~0.8;要做配對交易,光高相關不夠,還需要通過共整合檢定。
台股和美股的相關性高嗎?
同日相關很低(與 S&P 500 約 0.15),因為台股收盤時美股還沒開盤。改用美股前一個交易日的報酬計算,相關升到 0.43;其中費城半導體前一晚與台股今天的相關最高(0.49)。所以「美股昨晚大跌、台股今天容易跌」在統計上成立,但兩者同一天的走勢關係不大。
為什麼要用報酬率算相關係數,用價格會怎樣?
價格是非定態序列,只要兩個市場長期都上漲,價格相關就會被共同趨勢灌高:台股與費城半導體的價格相關 0.99,日報酬相關卻只有 0.14。用價格算出的高相關反映的是「都在多頭」,無法回答「今天你跌我會不會跌」。
配對交易在台股可行嗎?
以本文的金控股實測(2018-01~2026-06),策略毛利為正(零成本 CAGR +1.35%)但扣掉手續費、證交稅與借券成本後年化 -1.04%。台股的證交稅對高周轉、薄利潤的策略特別不友善,加上融券有平盤下放空限制與強制回補,散戶條件下這套經典做法不可行;成本結構不同的法人(借券費率低、可用期貨對沖)結論可能不同。
相關性高的兩檔股票就能做配對交易嗎?
高相關只代表兩檔每天往同方向動,價差仍可能一去不回(例如兩家公司基本面分道揚鑣)。配對交易賭的是價差均值回歸,對應的統計性質是共整合,需要用 Engle-Granger 等方法另外檢定。本文回測同時要求報酬相關 > 0.6 與共整合 p < 0.05。
pandas 怎麼計算相關係數?
把價格 DataFrame 先 pct_change() 轉成報酬率,再呼叫 .corr() 即可得到兩兩相關矩陣;單獨兩條序列用 s1.corr(s2)。滾動相關用 s1.rolling(120).corr(s2)。記得先把不同市場的交易日對齊(dropna()),否則缺值會默默扭曲結果。
負相關的資產有什麼用?
組合波動取決於成分資產的相關結構:加入低相關甚至負相關的資產,能在不犧牲太多報酬下明顯降低波動,這是投資組合最佳化的核心。但要留意本文滾動相關一節的教訓:相關係數在危機時會集體飆高,平時的負相關到崩盤時未必還在,VIX 恐慌指數那篇對危機行為有更多著墨。
這篇的結論會更新嗎?
會。本文數據快照為 2026-06-09,依本站慣例每季用同一腳本重跑;若金控配對交易的成本後績效轉正,或台股相關性排行有結構性變化,會在此頁據實更新。
延伸閱讀
- 量化交易完整指南:從零開始的系統化路徑
- 台股選股方法總覽:基本面、技術面、籌碼面方法一次看
- 用 yfinance 抓取全球指數資料:本文 Part A 的資料來源教學
- SPY 加 TLT 低風險投資組合:負相關資產配置的實例
- 量化名詞不熟?查詞彙表:相關係數、夏普比率等定義
投資警語:本文僅供教學參考,不構成投資建議。過去績效不代表未來表現,投資有風險。融券放空另有強制回補、停券與借券費率變動等風險,請審慎評估自身風險承受能力。
最後更新:2026-06|回測區間:2018-01~2026-06(金控配對交易)、2015-01~2026-06(全球指數相關性,資料快照 2026-06-09)|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

