跳至主要內容
台股研究 約 11 分鐘閱讀

台股相關性分析:Python 相關係數正確算法,
配對交易實測年化 -1.04%

台股相關性分析最常見的錯誤是拿價格水準算相關係數:台股與 Cboe UK 100 價格相關 0.84,改用日報酬率重算只剩 0.30,連動最高的其實是韓國 KOSPI(0.68)。本文用 Python pandas 示範正確算法,並以金控股配對交易實測:含成本年化 -1.04%,負面結果與方法限制完整公開。

台股的好兄弟其實是韓國

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

台股相關性分析:日報酬相關排行第一名是韓國 KOSPI 0.68,價格水準算出的 0.84 是假象

重算後的關鍵數字

項目 數值
台股 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=Cov(X,Y)σXσY\rho_{X,Y}=\frac{\mathrm{Cov}(X,Y)}{\sigma_X\,\sigma_Y}

實際用樣本資料計算時的形式為:

rxy=i=1n(xixˉ)(yiyˉ)i=1n(xixˉ)2  i=1n(yiyˉ)2r_{xy}=\frac{\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i-\bar{x})^2}\;\sqrt{\sum_{i=1}^{n}(y_i-\bar{y})^2}}

  • r=+1r = +1:完全正相關,X 漲 Y 必漲。
  • r=1r = -1:完全負相關,X 漲 Y 必跌。
  • r=0r = 0:兩者的線性關係為零。

用 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)。分子是離差逐日相乘再加總:1×0+0×1+(2)×(3)+2×1+(1)×1=71\times0+0\times1+(-2)\times(-3)+2\times1+(-1)\times1=7。分母是兩組離差平方和的開根號相乘:10×12=12010.95\sqrt{10}\times\sqrt{12}=\sqrt{120}\approx 10.95。所以:

r=710.950.64r=\frac{7}{10.95}\approx 0.64

兩檔股票的日報酬相關約 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。

韓國居冠很合理:兩個市場同處亞洲時區、同樣以科技出口為主、同樣高度受半導體景氣循環驅動,台積電與三星電子甚至是直接競爭對手。下圖把兩條指數疊在一起看:

台股加權指數與韓國 KOSPI 正規化淨值比較:日報酬相關 0.68 的兩個市場

有趣的是 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:

台股與 S&P 500 的 120 日滾動相關係數時序圖,2020 疫情股災時衝上 0.51,2025 年 10 月跌到 -0.39

兩個現象值得注意。第一,每逢系統性危機(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 snssns 只是社群慣用的匯入別名)。畫熱力圖與滾動相關:

顯示程式碼
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 方法先對兩檔股票的對數價格跑迴歸:

lnPtA=α+βlnPtB+εt\ln P_t^{A} = \alpha + \beta \ln P_t^{B} + \varepsilon_t

再檢定殘差 εt\varepsilon_t 是否定態。若通過檢定(p 值夠小),表示兩者間存在長期均衡關係,價差(spread)st=lnPtAβlnPtBs_t = \ln P_t^{A} - \beta \ln P_t^{B} 偏離後傾向回到均值,這才是配對交易可以收割的性質。進出場訊號用價差的標準化分數:

zt=stμ60(s)σ60(s)z_t=\frac{s_t-\mu_{60}(s)}{\sigma_{60}(s)}

其中 μ60\mu_{60}σ60\sigma_{60} 是 60 日滾動平均與標準差。z>2|z|>2 表示價差罕見地拉開(進場),zz 回到 0 表示價差收斂(出場)。

台股金控配對交易回測:扣完成本年化 -1.04%

配對交易要求兩檔標的業務同質性極高,台股最天然的實驗場是金控股。回測設計如下:

  • 股票池:14 檔金控股(2880~2892、5880;新光金 2025 年併入台新金後資料自然截止)。
  • 形成期(每半年重選):取進場前 252 個交易日,要求日報酬相關 > 0.6 且 Engle-Granger 共整合 p < 0.05,依 p 值取最小的 5 組配對。
  • 交易期:價差用形成期 OLS 估計的對沖比 β\beta 計算,60 日滾動 z-score,z>2|z|>2 進場(作多便宜腿、放空貴腿各 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

台股金控配對交易回測權益曲線 vs 0050:含成本年化 -1.04%,與大盤相關僅 0.03

策略確實做到了教科書承諾的市場中性:與 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 出場:

配對交易範例:富邦金/元大金價差 z-score 走勢與進出場點,進場後價差收斂耗時近五個月

這筆交易最後有收斂、有獲利,但耗時五個月,期間借券成本一路滴水穿石。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 筆期末強制出場)
前視偏差 配對篩選、對沖比 β\beta 只用進場前 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,依本站慣例每季用同一腳本重跑;若金控配對交易的成本後績效轉正,或台股相關性排行有結構性變化,會在此頁據實更新。

延伸閱讀


投資警語:本文僅供教學參考,不構成投資建議。過去績效不代表未來表現,投資有風險。融券放空另有強制回補、停券與借券費率變動等風險,請審慎評估自身風險承受能力。

最後更新:2026-06|回測區間:2018-01~2026-06(金控配對交易)、2015-01~2026-06(全球指數相關性,資料快照 2026-06-09)|作者:FinLab 量化研究團隊(經量化研究員審閱)

FinLab AI

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始

更多總經與市場研究

查看全部