見出し画像

TA-Lib辞典

こんにちは、minaulです。
今回は、TA-Libがカバーしているテクニカル指標のほぼ全てを、公式から和訳して羅列するだけの記事を書きたいと思います。

はじめに


TA-Libとは、Technical Analysis Library の略であり、その名の通りテクニカル分析に特化した機能を有するPython対応ライブラリです。

公式サイトによれば、150以上のテクニカル指標に対応しているようです。
指定のコードを書くだけで、高速計算して値を返してくれるので、金融系モデリングを一気に効率化してくれる便利ツール、という位置付けになります。

記事の内容は、以下の公式サイトを和訳して要約しているだけです。

なぜこの記事を書こうと思ったかというと、TA-Lib関連の記事は結構ありますが、内容が限定的なものがほとんどで、網羅的に抑えている日本語ソースが少ないという中で、一定の需要が存在するだろうと思ったからです。

現に私もそういうサイトがあればいいな、と思っていたのでこの機会にまとめます。
辞書的な使い途として、覗いていただけたらと思います。
仮想通貨界隈以外の方にも、活用していただけたら嬉しいです。


基本説明


TA-Libを使ったことない方に向けても、環境構築レベルで1から解説します。

インストール

TA-Libのインストールに関しては、少し手間取るかもしれません。
以下の説明でも詰まる場合は、各自で調べて下さい。
先人たちの知恵をフル活用しましょう。

Mac
筆者のMac環境では、以下をターミナルで実行することでインストールしました。

brew install TA-Lib

pip installではうまくいきませんでした。
事前にHomebrewをインストールする必要があります。

windows
筆者はwindows仮想環境にて、Anacondaのコマンドプロンプトで以下のようにインストールしました。

conda install -c conda-forge ta-lib


インポート

OSにインストールできたら、次は開発環境にライブラリをインポートします。

import talib


データ準備

当然ですが、分析対象のデータが存在しなければ、TA-Libは使えません。
与えるデータは、始値・高値・安値・終値・出来高の5種類です。
データ数は、同じ長さである必要があります。

データの形式はNumPyのndarray、あるいはPandasのdataframeなどで入力します。
ちなみに、入力と出力は同じ形でデータが返ります。
例えば、ndarrayの価格データでtalibに渡すと、指標の計算結果はndarray形式のデータで受け取ります。

分析対象のデータは各自で用意していただければと思いますが、準備の仕方が分からないなどの場合は、サンプルデータとして公式サイトにはランダムな配列の例が紹介されています。

import numpy as np
# note that all ndarrays must be the same length!
inputs = {
    'open': np.random.random(100),
    'high': np.random.random(100),
    'low': np.random.random(100),
    'close': np.random.random(100),
    'volume': np.random.random(100)
}

ランダムデータでも問題ないですが、より実践に近づけるため、参考までに2022/1/1〜2022/06/30の日足BTC価格データを準備するサンプルコードも紹介します。

# CryptowatchからBTCデータを取得する関数の呼び出し
price = get_price(86400, before=1656597600, after=1640962800)  # 86400秒で1日、unixtimeで期間指定

# 格納する配列の準備
time = []
open = []
high = []
low = []
close = []
volume = []

# 各配列にデータを格納
for i in range(len(price)):
    time.append(price[i]["close_time_dt"])
    open.append(price[i]["open_price"])
    high.append(price[i]["high_price"])
    low.append(price[i]["low_price"])
    close.append(price[i]["close_price"])
    volume.append(price[i]["volume"])
    
# dataframeにデータを格納
df = pd.DataFrame({
    "time_dt" : time,
    "open"   : open,
    "high"   : high,
    "low"    : low,
    "close"  : close,
    "volume" : volume})

# dfの表示
display(df)
dfの出力結果

BTC価格データはCryptowatchから取得しています。
get_price関数の中身については、以下の記事にあるので参照ください。

また、記事中でTA-Libから取ってくる指標データは、全てこのdataframeに格納するようなコードにしています。
理由としては、一元管理が容易であり、より実践的なデータ管理が可能になるからです。
ただし、別々で個別の値を返すだけのコードでも、もちろん問題はありません。


データ入力/出力

一例として、トレンド系指標の一番上に載っているボリンジャーバンドのデータ入力/出力のサンプル例を紹介します。
公式サイトには、以下のようにサンプルコード例があります。

upperband, middleband, lowerband = BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)

この通りに記述しても良いのですが、上記ではいくつかの前提条件があります。

まず、BBANDS単体で関数を呼び出していますが、この場合はインポートの時点で、import BBANDS from talib と単体で指定する必要があります。
また、closeには基本的にNumPy型のデータを入力する必要があります。
その場合、upperbandなどの値には同じ型でのデータが出力されます。

本記事では、前述の通りimport talibとdataframeを前提としているため、

df["upperband"], df["middleband"], df["lowerband"] = talib.BBANDS(df["close"], timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)

のように書き換えています。
ちなみに、引数の数値は全てデフォルトのまま書き写します。


指標一覧


大枠として以下の通りに分けています。
・トレンド系指標
・モメンタム系指標
・ボリューム系指標
・ボラティリティ系指標
・価格系指標
・波動系指標
・統計指標


トレンド系指標


BBANDS - Bollinger Bands
ボリンジャーバンド

df["upperband"], df["middleband"], df["lowerband"] = talib.BBANDS(df["close"], timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)

DEMA - Double Exponential Moving Average
二重指数移動平均線

df["DEMA"] = talib.DEMA(df["close"], timeperiod=30)

EMA - Exponential Moving Average
指数平滑移動平均線

df["EMA"] = talib.EMA(df["close"], timeperiod=30)

HT_TRENDLINE - Hilbert Transform - Instantaneous Trendline
短期トレンドライン(ヒルベルト変換)

df["HT_TRENDLINE"] = talib.HT_TRENDLINE(df["close"])

KAMA - Kaufman Adaptive Moving Average
カウフマン適応型移動平均線

df["KAMA"] = talib.KAMA(df["close"], timeperiod=30)

MA - Moving average
移動平均線

df["MA"] = talib.MA(df["close"], timeperiod=30, matype=0)

MAMA - MESA Adaptive Moving Average
メサ適応型移動平均線

df["mama"], df["fama"] = talib.MAMA(df["close"], fastlimit=0, slowlimit=0)

MAVP - Moving average with variable period
移動平均線(変動周期)

df["MAVP"] = talib.MAVP(df["close"], df["periods"], minperiod=2, maxperiod=30, matype=0)

MIDPOINT - MidPoint over period
中間点

df["MIDPOINT"] = talib.MIDPOINT(df["close"], timeperiod=14)

MIDPRICE - Midpoint Price over period
中間価格

df["MIDPRICE"] = talib.MIDPRICE(df["high"], df["low"], timeperiod=14)

SAR - Parabolic SAR
パラボリックSAR

df["SAR"] = talib.SAR(df["high"], df["low"], acceleration=0, maximum=0)

SAREXT - Parabolic SAR - Extended
パラボリックSAR(機能拡張版)

df["SAREXT"] = talib.SAREXT(df["high"], df["low"], startvalue=0, offsetonreverse=0, accelerationinitlong=0, accelerationlong=0, accelerationmaxlong=0, accelerationinitshort=0, accelerationshort=0, accelerationmaxshort=0)

SMA - Simple Moving Average
単純移動平均線

df["SMA"] = talib.SMA(df["close"], timeperiod=30)

T3 - Triple Exponential Moving Average (T3)
三重指数移動平均線

df["T3"] = talib.T3(df["close"], timeperiod=5, vfactor=0)

TEMA - Triple Exponential Moving Average
三重指数移動平均線

df["TEMA"] = talib.TEMA(df["close"], timeperiod=30)

TRIMA - Triangular Moving Average
三角移動平均線

df["TRIMA"] = talib.TRIMA(df["close"], timeperiod=30)

WMA - Weighted Moving Average
加重移動平均線

df["WMA"] = talib.WMA(df["close"], timeperiod=30)

トレンド系指標のdfへの出力イメージは以下の通りです。

トレンド系指標のdataframeイメージ

指標値は見やすくするため、全てround()で丸めています。
列が多くて視覚できないですが、MAMAはデフォルトでは計算不可のため、0.5, 0.05の値を設定しました。
MAVPのperiodが分からなかったので、計算を省いています。


モメンタム系指標


ADX - Average Directional Movement Index
平均方向性指数

df["ADX"] = talib.ADX(df["high"], df["low"], df["close"], timeperiod=14)

ADXR - Average Directional Movement Index Rating
平滑化平均方向性指数

df["ADXR"] = talib.ADXR(df["high"], df["low"], df["close"], timeperiod=14)

APO - Absolute Price Oscillator
絶対価格オシレーター

df["APO"] = talib.APO(df["close"], fastperiod=12, slowperiod=26, matype=0)

AROON - Aroon
アルーン

df["aroondown"], df["aroonup"] = talib.AROON(df["high"], df["low"], timeperiod=14)

AROONOSC - Aroon Oscillator
アルーンオシレーター

df["AROONOSC"] = talib.AROONOSC(df["high"], df["low"], timeperiod=14)

BOP - Balance Of Power
バランス・オブ・パワー

df["BOP"] = talib.BOP(df["open"], df["high"], df["low"], df["close"])

CCI - Commodity Channel Index
商品チャネル指数

df["CCI"] = talib.CCI(df["high"], df["low"], df["close"], timeperiod=14)

CMO - Chande Momentum Oscillator
シャンデ・モメンタムオシレーター

df["CMO"] = talib.CMO(df["close"], timeperiod=14)

DX - Directional Movement Index
方向性指数

df["DX"] = talib.DX(df["high"], df["low"], df["close"], timeperiod=14)

MACD - Moving Average Convergence/Divergence
移動平均収束拡散法

df["macd"], df["macdsignal"], df["macdhist"] = talib.MACD(df["close"], fastperiod=12, slowperiod=26, signalperiod=9)

MACDEXT - MACD with controllable MA type
移動平均収束拡散法(機能拡張版)

df["macd"], df["macdsignal"], df["macdhist"] = talib.MACDEXT(df["close"], fastperiod=12, fastmatype=0, slowperiod=26, slowmatype=0, signalperiod=9, signalmatype=0)

MACDFIX - Moving Average Convergence/Divergence Fix 12/26
移動平均収束拡散法(固定版)

df["macd"], df["macdsignal"], df["macdhist"] = talib.MACDFIX(df["close"], signalperiod=9)

MFI - Money Flow Index
マネーフロー指数

df["MFI"] = talib.MFI(df["high"], df["low"], df["close"], df["volume"], timeperiod=14)

MINUS_DI - Minus Directional Indicator
方向インジケーター(マイナス)

df["MINUS_DI"] = talib.MINUS_DI(df["high"], df["low"], df["close"], timeperiod=14)

MINUS_DM - Minus Directional Movement
方向性(マイナス)

df["MINUS_DM"] = talib.MINUS_DM(df["high"], df["low"], timeperiod=14)

MOM - Momentum
モメンタム

df["MOM"] = talib.MOM(df["close"], timeperiod=10)

PLUS_DI - Plus Directional Indicator
方向インジケーター(プラス)

df["PLUS_DI"] = talib.PLUS_DI(df["high"], df["low"], df["close"], timeperiod=14)

PLUS_DM - Plus Directional Movement
方向性(プラス)

df["PLUS_DM"] = talib.PLUS_DM(df["high"], df["low"], timeperiod=14)

PPO - Percentage Price Oscillator
割合価格オシレーター

df["PPO"] = talib.PPO(df["close"], fastperiod=12, slowperiod=26, matype=0)

ROC - Rate of change : ((price/prevPrice)-1)*100
価格変化率

df["ROC"] = talib.ROC(df["close"], timeperiod=10)

ROCP - Rate of change Percentage: (price-prevPrice)/prevPrice
価格変化率(パーセンテージ表示)

df["ROCP"] = talib.ROCP(df["close"], timeperiod=10)

ROCR - Rate of change ratio: (price/prevPrice)
価格変化レシオ

df["ROCR"] = talib.ROCR(df["close"], timeperiod=10)

ROCR100 - Rate of change ratio 100 scale: (price/prevPrice)*100
価格変化レシオ(整数表示)

df["ROCR100"] = talib.ROCR100(df["close"], timeperiod=10)

RSI - Relative Strength Index
相対力指数

df["RSI"] = talib.RSI(df["close"], timeperiod=14)

STOCH - Stochastic
ストキャスティクス

df["slowk"], df["slowd"] = talib.STOCH(df["high"], df["low"], df["close"], fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)

STOCHF - Stochastic Fast
ファストストキャスティクス

df["fastk"], df["fastd"] = talib.STOCHF(df["high"], df["low"], df["close"], fastk_period=5, fastd_period=3, fastd_matype=0)

STOCHRSI - Stochastic Relative Strength Index
ストキャスティクス相対力指数

df["fastk"], df["fastd"] = talib.STOCHRSI(df["close"], timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0)

TRIX - 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
一日変化率

df["TRIX"] = talib.TRIX(df["close"], timeperiod=30)

ULTOSC - Ultimate Oscillator
アルティメット・オシレーター

df["ULTOSC"] = talib.ULTOSC(df["high"], df["low"], df["close"], timeperiod1=7, timeperiod2=14, timeperiod3=28)

WILLR - Williams' %R
ウィリアムズ%R

df["WILLR"] = talib.WILLR(df["high"], df["low"], df["close"], timeperiod=14)
モメンタム系指標df


ボリューム系指標


AD - Chaikin A/D Line
蓄積/発散

df["AD"] = talib.AD(df["high"], df["low"], df["close"], df["volume"])

ADOSC - Chaikin A/D Oscillator
チャイキン・オシレーター

df["ADOSC"] = talib.ADOSC(df["high"], df["low"], df["close"], df["volume"], fastperiod=3, slowperiod=10)

OBV - On Balance Volume
オン・バランス・ボリューム

df["OBV"] = talib.OBV(df["close"], df["volume"])
ボリューム系指標df


ボラティリティ系指標


ATR - Average True Range
アベレージ・トゥルー・レンジ

df["ATR"] = talib.ATR(df["high"], df["low"], df["close"], timeperiod=14)

NATR - Normalized Average True Range
標準化アベレージ・トゥルー・レンジ

df["NATR"] = talib.NATR(df["high"], df["low"], df["close"], timeperiod=14)

TRANGE - True Range
トゥルー・レンジ

df["TRANGE"] = talib.TRANGE(df["high"], df["low"], df["close"])
ボラティリティ系指標df


価格系指標


AVGPRICE - Average Price
平均価格

df["AVGPRICE"] = talib.AVGPRICE(df["open"], df["high"], df["low"], df["close"])

MEDPRICE - Median Price
中央価格

df["MEDPRICE"] = talib.MEDPRICE(df["high"], df["low"])

TYPPRICE - Typical Price
基準価格

df["TYPPRICE"] = talib.TYPPRICE(df["high"], df["low"], df["close"])

WCLPRICE - Weighted Close Price
加重終値

df["WCLPRICE"] = talib.WCLPRICE(df["high"], df["low"], df["close"])
価格系指標df


波動系指標


HT_DCPERIOD - Hilbert Transform - Dominant Cycle Period
ドミナントサイクル期間(ヒルベルト変換)

df["HT_DCPERIOD"] = talib.HT_DCPERIOD(df["close"])

HT_DCPHASE - Hilbert Transform - Dominant Cycle Phase
ドミナントサイクル位相(ヒルベルト変換)

df["HT_DCPHASE"] = talib.HT_DCPHASE(df["close"])

HT_PHASOR - Hilbert Transform - Phasor Components
フェーザ成分(ヒルベルト変換)

df["inphase"], df["quadrature"] = talib.HT_PHASOR(df["close"])

HT_SINE - Hilbert Transform - SineWave
正弦波(ヒルベルト変換)

df["sine"], df["leadsine"] = talib.HT_SINE(df["close"])

HT_TRENDMODE - Hilbert Transform - Trend vs Cycle Mode
トレンド対サイクル(ヒルベルト変換)

df["integer"] = talib.HT_TRENDMODE(df["close"])
波動系指標df


統計指標


BETA - Beta
ベータ値

df["BETA"] = talib.BETA(df["high"], df["low"], timeperiod=5)

CORREL - Pearson's Correlation Coefficient (r)
ピアソンの積率相関係数

df["CORREL"] = talib.CORREL(df["high"], df["low"], timeperiod=30)

LINEARREG - Linear Regression
線形回帰

df["LINEARREG"] = talib.LINEARREG(df["close"], timeperiod=14)

LINEARREG_ANGLE - Linear Regression Angle
線形回帰(角度)

df["LINEARREG_ANGLE"] = talib.LINEARREG_ANGLE(df["close"], timeperiod=14)

LINEARREG_INTERCEPT - Linear Regression Intercept
線形回帰(切片)

df["LINEARREG_INTERCEPT"] = talib.LINEARREG_INTERCEPT(df["close"], timeperiod=14)

LINEARREG_SLOPE - Linear Regression Slope
線形回帰(傾き)

df["LINEARREG_SLOPE"] = talib.LINEARREG_SLOPE(df["close"], timeperiod=14)

STDDEV - Standard Deviation
標準偏差

df["STDDEV"] = talib.STDDEV(df["close"], timeperiod=5, nbdev=1)

TSF - Time Series Forecast
時系列予測

df["TSF"] = talib.TSF(df["close"], timeperiod=14)

VAR - Variance
分散

df["VAR"] =talib.VAR(df["close"], timeperiod=5, nbdev=1)
統計指標df


最後に


いかがでしたでしょうか。
めちゃくちゃ多いですね。さすがに疲れました。

マイナーな指標もカバーしているため、検索結果が乏しいものもあり、一部日本語訳が適切でない部分もありますが、ご容赦ください。

それではみなさま、よきテクニカルライフを〜。

お読みいただきありがとうございました。


この記事が気に入ったらサポートをしてみませんか?