Python新手教學(Part 4):台股的好兄弟是?台股相關性研究

為什麼美股大跌,在台灣的投資人要很緊張?原因就是相關性!想知道台股跟哪國指數最同步嗎?不是S&P 500美國指數,也不是深圳指數,那究竟是哪國呢?這篇文章我們就來研究一下吧!

last 1

相關性

首先我們先介紹什麼是相關性,
相關性最白話的講法,你可以想像,看到天空烏雲密佈,代表可能要下雨了,
代表天空的顏色跟下雨機率有相關,
你可以由一個現象,去預測另一個現象,這就是相關性!

相關性稍微數學一點

相關性也可以更數值化的方式表示,先用以下例子講解:

2 4

這張圖中:

  • 我們可以看上方左側圖,天氣溫度跟買冰棒人數的變化圖,可以想像某人每一天記錄天氣溫度與冰棒人數,每天畫一個黃點,時間久了,就可以看出黃點之間的關係,也就是天氣越熱,越有人會想要買冰棒!
  • 同理,上方中間那張圖,某人也可以記錄每天生病的人數,此時就發現,天氣越冷,越多人會感冒!
  • 當然某人覺得有趣,於是又記錄了溫度與擲筊的關係,最後發現:沒什麼關連

好了,某人已將觀測值變成數字記錄起來了,但每次都必須畫這麼多點,才能看出相關性,也太累了吧?能不能用一個數字取代呢?

這時就可以用

correlation coefficient (相關性係數)

有人可能覺得太多點點了,有密集恐懼症,希望可以將上方這三張圖,每張圖用一個數字代表就好,這樣就不需要看到這麼多點點。

所以某人提出了 correlation coefficient ,從上面第一張圖開始從左而又,分別可以用 1、-1、0來代表:

  • 1 代表正相關,也就是X越高Y越高,X越低Y越低(成正比)
  • ─1 代表負相關,也就是X越高Y越低,或X越低Y越高(成反比)
  • 0 代表無相關性

上述只是化簡後的例子
事實上相關性係數不是整數,而是會介於─1~1間,代表正負相關的程度!

讀到這裡,你可能會問,

所以相關性跟投資有什麼關係?

投資就是預測未來現象與當下現象的相關性!
就像你看到天空烏雲密佈,就能預測接下來會下雨,
我們也可以將相關性係數用於全球指數,

為什麼美股大跌,在台灣的投資人要很緊張?原因就是相關性!
台股跟美股有正相關。

我們可以用Python將相關性畫出來,假如你還沒有爬取歷史股價的話,可以先到前個單元爬取喔!

程式碼撰寫

歷史數據回顧

首先我們可以看一下上個單元爬下來的歷史數據

print(world_index_history['S&P 500'].head())
3 3

還記得world_index_history嗎?它是一個dictionary,根據不同的字串,例如S&P 500,可以叫出相對應的表格(dataframe)

有了 world_index_history 我們就可以將國際指數的相關性給畫出來,但首先,我們要先來瞭解

比對歷史數據,發現close價格不一樣?

假如你認真的比對歷史數據(例如玩股網),就會發現離現在越久遠以前的歷史價格,誤差越大!這是為什麼呢?其實這個並不是誤差喔!因為 yahoo finance 的歷史價格是「調整後收盤價」代表這是考慮了除權息的價格變化,所計算出來的價格。

簡單的例子

當除權息、增減資時,一般股價會有大波動,以除權息為例,股票價格瞬間下跌
然而帳戶裡的股票張數會變多(例如領股利)
或是帳戶資金量變多(領股息)
總體來講是不賺不賠的

所以當除權息時,
正常的收盤價 會突然下跌很多,
而 yahoo finance 的調整後收盤價,不會因為除權息有巨幅下跌
更能夠精確的反映股票價值,跟投資的獲利狀況!

Python 終於開始了

首先我們先將所有指數的 Adj Close 先集合起來,變成一張表格(dataframe)

close = {}
for name, price in world_index_history.items():
    if len(price) != 0:
        close[name] = price['Close']

close = pd.DataFrame(close)
close = close.resample('1d').last().dropna(how='all', axis=1).dropna(how='all', axis=0)
5 3

接下來就可以來觀察每檔指數的 Adj Close 相關性,

corr = close.corr()
print(corr)
6 2

上圖可以看到一個二維的表,就是每個指數跟每個指數之間的相關性,
上圖中可以發現,指數自己跟自己的相關性一定是1,代表完全正相關!
而這張表會是symmetric matrix,也就是做對角線會是對稱的。

接下來我們可以用更視覺化的方式來表示,假如沒有sns的package,要記得先去安裝pip install sns即可,想瞭解如何安裝,可以到此安裝教學的下半部分,有簡單的教學喔!

import seaborn as sns
sns.heatmap(corr, square=True ,vmax=1.0, linecolor='white', annot=True)
last 1 2

假如你發現圖比我的小,字看不清楚,可以改成以下程式碼

# set figure size
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = (18, 18)

# original code
import seaborn as sns
sns.heatmap(corr, square=True ,vmax=1.0, linecolor='white', annot=True)

有了以上的code,我們就可以知道

台灣股票跟誰最連動

我們可以人眼觀察,發現台灣指數TSEC weighted index跟英國前一百大Cboe UK 100超像!相關係數高達0.9,代表非常非常像

我們可以將這兩個指數畫出來檢查一下:

close['Cboe UK 100']['2015':].plot()
close['TSEC weighted index']['2015':].plot()
7 1

雖然價格不同,但是趨勢還真的頗像的耶!然而台灣的加權指數,在2020年的價格,跟某幾個美國的指數相關性非常高,究竟是哪一個指數呢?可以使用我們寫好的colab範例跑跑看喔!

如何用於交易?

兩個相關性很高的股票,可以拿來做pair trading配對交易,但也不是只看相關性,
這個就容我們之後再慢慢分析吧!
這個單元會一直帶你從零開始,慢慢學習,直到機器學習的部分喔!敬請期待~
下一個單元中,我們來看一下要怎麼控制報酬與風險

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!