用 Python 快速計算 158 種技術指標!

AI StockBoy
AI 股仔-創新投資理財模式
8 min readSep 27, 2019

TA-Lib 的完整教學

股仔與新創夥伴合作打造的美股資訊站 — FinGuider,歡迎前往體驗!

小小前言

上週分享了如何建立自己的資料庫 — 美股篇點此連結前往文章),內容教各位使用 Python 程式從各個管道取得總經、股價、財報、情緒等等相關的資料,但卻沒有提到技術指標,為什麼呢?

原因是有了價量資料後,我們可以使用強大的 Python module — TA-Lib,在一兩秒的時間內快速計算多達 158 種的技術指標!指標的選擇眾多以外,還可以微調每個技術指標參數值的設定,非常好用!我們也因此不需要特地找資源管道去取得技術指標的資料了。 😃

本文內容大綱

  • TA-Lib 的安裝
  • 怎麼看 TA-Lib 提供了哪些技術指標?
  • 準備好一份價量資料,開始計算 158 種技術指標!

※ TA-Lib 的安裝

如果是使用 Google Colab 的讀者,請複製以下程式碼貼上 colab 後執行運作,就可以直接安裝好 TA-Lib 了喔! 🍰

如果是在自己電腦上安裝的話,依照平常安裝 module 的慣性, 首先都會:

pip install TA-Lib # windows/mac
brew install ta-lib # mac

如果是 Windows 的話,一般來說都會出現各種的錯誤訊息 😵,沒關係!請照著以下步驟安裝:

1. 前往這個網站下載 .whl 檔案(點此連結前往
2. 依照自己電腦 Python 版本選擇相對應的 .whl 檔案
3. 下載好之後,複製檔案的全名,記得要包含『.whl』喔!
4. 也可透過 cd 轉至對應資料夾
5. 輸入『pip install 』接著把複製好的檔案全名貼上,再按執行
6. 這樣就成功安裝 TA-Lib 了!👍

※ 怎麼看 TA-Lib 提供了哪些技術指標?

先匯入本文所需的 modules:

import numpy as np
import pandas as pd
import talib

一行指令,就可以得到 TA-Lib 提供的所有技術指標的代碼:

清單的部份截圖

指標太多太亂沒關係,一行指令取得分類清單:

整理一下類別名稱 & 指標總數

雖然快速取得了所有技術指標的代碼,但很多代碼其實有看沒有懂。我們還是需要去看 TA-Lib 官方文件,才能了解每一個代碼指的是哪一個技術指標,以及預設定的參數是什麼。(TA-Lib 文件連結請按此

紅圈就是我們剛才用 Python 取得的所有分類
選一個分類點進去,就可看到該分類每一項技術指標的完整資訊

以上圖為例,雖然我們用get_function()可得知有一個技術指標叫做『ADX』,但要看 TA-Lib 文件才能知道『ADX』技術指標原來就是『Average Directional Movement Index』。

接著再去 Google 或維基百科一番,我們就知道原來『ADX』中文可翻譯做『平均動向指數』,由 Welles Wilder JR. 提出。這個指標主要是衡量一個趨勢走勢的強度,其中並無趨勢方向之分,計算過程參考下段內容或直接忽略 😆。

如果我們要自己算出這個指標,要先:
1. 算出各期 TR、+DM、-DM
2. 再依參數值(預設為 14)平滑 TR
3. 拿 TR14 計算 +DM、-DM
3. 再依據平滑後的+DM14、-DM14 計算 DX
4. 完成後再計算 DX 移動平均(預設為 14)

使用 TA-Lib 就可以省去建構這些指標計算函數的時間!而省下來的時間就可以照著上面示範的過程(查技術指標全名 → Google/Wiki 指標涵義)去了解技術指標的涵義,產生概念後才知道如何應用指標喔! 🌱

※ 準備好一份價量資料,開始計算 158 種技術指標!

我們先準備一份價量資料,來示範如何用 TA-Lib 算出技術指標。如果手頭上沒有資料的話,可以參考這篇文章去抓資料。

沒時間慢慢讀那一篇文章的話,就先複製貼上這段程式碼,快速從 yahoo finance 中取得 AAPL 的價量資料來練習 TA-Lib!# 安裝 yfinance
pip install yfinance
# 匯入 yfinance
import yfinance as yf
# 取得 AAPL 價量資料
df = yf.Ticker('AAPL').history(period = 'max')

計算方法 1:Function API

例1:先算個 ADX

一切技術指標的計算都需要價量資料:開盤價、最高價、最低價、收盤價、成交量。而計算 ADX 指標需要的資料就是上圖括號內的 4 個參數:

資料需求:
high:最高價
low:最低價
close:收盤價
參數設定:
timeperiod:天數參數,預設為 14

我們只需要提供以上資料與設定參數,就能得到 ADX 技術指標,語法為:

talib.ADX(df.High, df.Low, df.Close, timeperiod = 14)

例2:再算個 RSI

只需要收盤價就可以了,來試試看:

talib.RSI(df.Close) # 天數參數採用預設值 14 天

計算方法 2:Abstract API

由於技術指標的計算所需的資料永遠都是『開、高、低、收、量』。而我們的 DataFrame 已經備齊了『開、高、低、收、量』五項資料,能否直接給 TA-Lib 整張 DataFrame,讓它自己選擇所需資料就好呢?

沒問題!答案就是透過 Abstract API 去計算技術指標,可以省去選擇『開、高、低、收、量』這步驟。Abstract 的要求只有一個,他需要看得懂哪一個欄位是開盤價、哪一個欄位是最低價等等。因此我們有一個小小的前置作業,就是把欄位名稱改成 Abstract API 看得懂的名稱:

『開盤價』的欄位名稱要改成『open』
『最高價』的欄位名稱要改成『high』
『最低價』的欄位名稱要改成『low』
『收盤價』的欄位名稱要改成『close』
『成交量』的欄位名稱要改成『volume』
注意都是小寫英文喔!

我們來看看Function API 以及 Abstract API 兩種計算方式的差別:

匯入差別

# Function API:
import talib
# Abstract API:
from talib import abstract

計算語法差別

# Function API:
ADX例子:talib.ADX(df.High, df.Low, df.Close, timeperiod = 14)
RSI例子:talib.RSI(df.Close)
# Abstract API:
ADX例子:abstract.ADX(df, timperiod = 14)
RSI例子:abstract.RSI(df)

使用 Abstract API 的話記得匯入方式不太一樣。從結果看到兩種方式得到的輸出答案一模一樣,但 abstract 程式碼簡潔方便許多!😎

看到這裡,已經學會如何用 TA-Lib 計算技術指標了!文章最後再提供一段小小的 code,讓大家可以很快速把計算後的技術指標,併入價量資料的 DataFrame 中。

這段 code 執行後,會發現 158 項技術指標中,有 157 項指標都成功依照預設參數計算,並且併入了價量 DataFrame 裡面,唯獨有一項指標有錯誤被 print 出來。這個指標代碼是 MAVP,名稱叫做 Moving average with variable period。咦!其他的 MA 不是都成功計算了嗎?為什麼這個會有錯誤?

原因是這項指標可讓你自由改變每一期計算移動平均的天數。比如說你有 90 天的資料,
‧ 前面的 30 天想要計算 『5 日移動平均』;
‧ 中間的 30 天想要計算『 10 日移動平均』;
‧ 最後的 30 天想要計算『 20 日移動平均』

TA-Lib 的 MAVP 指標就能夠完成這項要求,只要額外準備一項取名叫做『periods』的資料,把各期天數放進去,
‧ 前面的 30 筆為『5.0』;
‧ 中間的 30 筆為『10.0』;
‧ 最後的 30 筆為『20.0』
再讓 TA-Lib 去計算就可以囉!

恭喜各位學會用 TA-Lib 快速計算大量技術指標!如果喜歡這篇文章,請幫我拍拍手!你們的鼓勵能驅使我加速寫出更多優質文章喔!感謝各位!

--

--