跳至主要內容
FinLab

用 Python 超簡單計算 158 種常見技術指標 (TA-Lib 教學)

這篇接續著 Python時間序列實做,先複習一下,上回合結束,我們有一個最重要的成果:close,它的 columns 是所有的股票代號,而 index 是日期。

顯示程式碼
close = pd.DataFrame({k:d['收盤價'] for k,d in data.items()}).transpose()
close.index = pd.to_datetime(close.index)
close

還記得嗎?上方式是上次的 code,將 data,把每個股票的收盤價拿出來。因為很重要所以說三遍:

顯示程式碼
open = pd.DataFrame({k:d['開盤價'] for k,d in data.items()}).transpose()
open.index = pd.to_datetime(open.index)
 
high = pd.DataFrame({k:d['最高價'] for k,d in data.items()}).transpose()
high.index = pd.to_datetime(high.index)
 
low = pd.DataFrame({k:d['最低價'] for k,d in data.items()}).transpose()
low.index = pd.to_datetime(low.index)
 
volume = pd.DataFrame({k:d['成交股數'] for k,d in data.items()}).transpose()
volume.index = pd.to_datetime(volume.index)

大家有沒有發現,相同的東西抄了五次,但我們拿出來的不是 close,是 open、high、low 跟 volume。把所有的東西都統整好。 統整好後,再將我們想看的股票拿出來,我們以近年超紅的台積電。

把其中的股票拿出來,變成 dict 結構

顯示程式碼
tsmc = {
    'close':close['2330']['2017'].dropna().astype(float),
    'open':open['2330']['2017'].dropna().astype(float),
    'high':high['2330']['2017'].dropna().astype(float),
    'low':low['2330']['2017'].dropna().astype(float),
    'volume': volume['2330']['2017'].dropna().astype(float),
}
 
tsmc['close'].plot()

台積電 2017 年收盤價走勢圖

花這麼久時間,tsmc 這個結構有什麼用?來,接下來我們配合一個超厲害的 python package:talib。 安裝 talib 不是直接 pip install 那麼簡單,請參考 python talib 的網頁 來安裝。

接下來任意找出 105 種指標!

KD 值計算

顯示程式碼
 
from talib import abstract
 
def talib2df(talib_output):
    if type(talib_output) == list:
        ret = pd.DataFrame(talib_output).transpose()
    else:
        ret = pd.Series(talib_output)
    ret.index = tsmc['close'].index
    return ret;
 
talib2df(abstract.STOCH(tsmc)).plot()
tsmc['close'].plot(secondary_y=True)

其中,最重要的是第 9 行,我們利用 abstract.STOCH 這個函式,來計算 KD 值,計算好後,再由 talib2df 將格式轉換成 dataframe 方便我們畫圖。第 10 行是說,我們想要同時顯示 tsmc 的收盤價,secondary_y 是說我們需要用第二個 y 軸,因為 KD 我們知道是在 0~100 之間,而台積電股價在 200 左右。

以下就是我們的成品,橘色、藍色代表的就是 KD 值。而紫色的就是收盤價!

台積電 KD 值與收盤價對照圖

收盤價對應到右邊的 y 軸,而左邊的 y 軸則是 KD 值。

MACD 計算

這還不夠酷炫,以上的鋪陳都是為了接下來的爽:

顯示程式碼
talib2df(abstract.MACD(tsmc)).plot()
tsmc['close'].plot(secondary_y=True)

台積電 MACD 指標與收盤價對照圖

只要把 STOCH 改成 MACD 就好了,各種指標隨便用:

OBV計算

顯示程式碼
talib2df(abstract.OBV(tsmc)).plot()
tsmc['close'].plot(secondary_y=True)

台積電 OBV 能量潮指標與收盤價對照圖

威廉指數計算

WILLR 計算

顯示程式碼
talib2df(abstract.WILLR(tsmc)).plot()
tsmc['close'].plot(secondary_y=True)

台積電 WILLR 威廉指數與收盤價對照圖

ATR 計算

顯示程式碼
talib2df(abstract.ATR(tsmc)).plot()
tsmc['close'].plot(secondary_y=True)

台積電 ATR 平均真實區間指標與收盤價對照圖

我的天所以到底有幾種指標?!總共有

顯示程式碼
talib.get_functions()

talib.get_functions() 列出所有可用的技術指標清單

這些就是可以用的指標,總共有 158 種,慢慢看,學也學不完 XDD。

改變參數

之前不是說 KD 指標有三個參數:(9、3、3),假如今天我想要客製化,怎麼修改呢? 我們現在只知道 KD 指標是 abstract.STOCH 這個 function,要如何看如何設定呢?直接 print 這個函式看看:

function detail

顯示程式碼
print(abstract.STOCH)

print abstract.STOCH 顯示 KD 指標的參數細節

我們可以改變得參數是 Parameters 項目中的五個,可以看到假如什麼都不輸入的話,它的值預設是(5、3、0、3、0),這邊的 0 代表的就是平滑的演算法式哪一種,例如我們希望它的三個參數不要是(5、3、3),想改成台灣常用的(9、3、3),也就是我們想把 fast_period 從原本的 5 改成 9,只要在呼叫 talib.abstract.STOCH 的時候輸入 fastk_period=9 就可以了:

MACD 計算

顯示程式碼
talib2df(abstract.STOCH(tsmc, fastk_period=9)).plot()
tsmc['close'].plot(secondary_y=True)

今天教了大家這麼多的 index,大家幾乎可以做自己的玩股網,Cmoney 了,再配合上次教的用 pandas 選股,一個系統就快被搭建起來了!

接下來,你應該會想要建立自己的回測系統吧!不妨看一下這篇文章喔!

想建立自己的策略?

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

免費開始