之前說過想寫一個系列針對技術指標(均線、KD、RSI、MACD、布林通道)的教學和回測文章,但在寫回測之前當然就是要能夠把技術指標算出來, 這篇文章簡單的介紹一個好用的 open source library:TA-Lib,之後的文章就會用這個工具來幫我們回測過去的資料
TA-Lib
TA-Lib 提供哪些技術指標?
TA-Lib 提供了150+的技術指標,基本上我們根本不會用到這麼多(如果要直接無腦去比對特徵值有效性另當別論), 實務上我們常用的技術指標像是 均線、KD、RSI、MACD ,TA-Lib 都有,這篇文章會直接簡單實作
Windows 安裝
TA-Lib 在 Windows 的安裝不太友善,直接下 pip install ta-lib 會出現一堆錯誤訊息,官方提供的安裝方法如下:https://github.com/TA-Lib/ta-lib-python#windows
- 方法一:相當複雜,看到還要安裝 Visual Studio Community 2015 我就放棄了,不想試
- 方法二:unofficial,不過相對簡單多了,先到 https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib 下載 whl 檔,ex: 我 python 的版本是 3.9,電腦是 64 位元,所以選的就是
TA_Lib‑0.4.24‑cp39‑cp39‑win_amd64.whl
這個檔案, 請依據自己的電腦環境選擇對應的檔案
然後在 cmd 模式執行
pip install TA_Lib‑0.4.24‑cp39‑cp39‑win_amd64.whl
就完成安裝了
Colab 安裝
這個 blog 會提供 Colab 程式碼,如果不知道 Colab 怎麼用的話,可以先看之前的教學【Google Colab(Colaboratory) 簡易教學】
在 Colab 相對就單純的多,直接將這幾行 code 寫在開始就可以
!wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
!tar -xzvf ta-lib-0.4.0-src.tar.gz
%cd ta-lib
!./configure --prefix=/usr
!make
!make install
!pip install Ta-Lib
TA-Lib 實作
以下列了幾個比較常見的技術指標,這篇文章不打算仔細說明技術指標的原理,僅僅說明如何用 TA-Lib 查詢技術指標的值和簡單的繪圖
前置作業
使用 yfinance 取得 SPY 股價
如何取得股價可以參考之前的文章【如何使用Python取得歷史股價,簡介yfinance、ffn、FinMind】, 這裏用的是 yfinance ,因為 TA-Lib 除了收盤價外,有些指標會需要用到像 最高價、最低價 之類的值,用 yfinance 取得 SPY 的價格很簡單,只需要以下幾行 code 就可以了
import yfinance as yf
df = yf.download("spy", "2021-01-01")
TA-Lib 大致分為兩種用法
- 直接使用
- 使用 abstract 套件
其實結果是一樣的,可以自行選擇,以均線為例,直接使用的語法為
import talib
df['spy_sma_20'] = talib.SMA(df['Close'].values, timeperiod=20)
但以下的範例會使用 abstract 套件,abstract 套件會要求傳入的 dataframe 有「open」「high」「low」「close」「volume」欄位,注意:這些欄位 yfinance 都有,但是都是大寫,必須先自行轉換成小寫才能使用
from talib import abstract
df['spy_sma_20'] = abstract.SMA(df, 20)
均線
就剛才寫的一行 code 解決,這裏用的是 SMA(簡單移動平均線),參數為 20日均線,可以自行修改參數
df_sma = abstract.SMA(df, 20)
畫了一下圖,看起來沒有什麼問題
KD
KD 也是一行 code 就解決,這裏用的是台灣比較常用的參數 933,當然也是可以自行修改參數,不輸入參數的話預設值是 533
df_kd = abstract.STOCH(df, fastk_period=9, slowk_period=3, slowd_period=3)
回傳的值為 slowk, slowd, 就是俗稱的 k值和 d值,同樣畫了一下圖
RSI
RSI 也是一行 code 就解決,不輸入參數的話預設值就是 14,一樣可以自行修改參數
df_rsi = abstract.RSI(df, 14)
同樣畫了一下圖
MACD
MACD 也是一行 code 就解決,不輸入參數的話預設值(12,26,9),一樣可以自行修改參數
df_macd = abstract.MACD(df, fastperiod=12, slowperiod=26, signalperiod=9)
回傳值有 macd, macdsignal, macdhist,分別就是 快線、慢線、柱狀圖(國內外對名詞定義有點不一樣),圖比較難畫,先略過晚點再說
布林通道
布林通道也是一行 code 就解決,不輸入參數的話預設值為5日平均線,2倍標準差,一樣可以自行修改參數,這裏改成 20日
df_bbnds = abstract.BBANDS(df, timeperiod=20, nbdevup=2.0, nbdevdn=2.0, matype=0)
回傳值為 upperband, middleband, lowerband,分別為上限,平均值、下限
同樣簡單畫了一下圖,就只有畫收盤價和上下限
小結
先這樣吧,完整程式碼我放在【Colab】, TA-Lib 算是很好用的工具,再來就是對這些技術指標來做回測看看這些技術指標到底有沒有用了...