pythonの外部ライブラリTA-Libを使用して、株価のテクニカル指標を計算する方法を紹介します。
プログラミングができる人にとっては、テクニカル指標の数式を見れば自分で計算することも簡単かもしれません。
しかし、TA-Libを使用すると次のようなメリットがあります:
- 移動平均系、オシレータ系など様々な指標を手軽に計算可能(インポートするだけ)
- 自分でコーディングするより計算速度が速い(場合が多い)
ネット上で調べると、Ta-libはインストールが難しいという意見も聞きますが…。
私のWindows環境では1分くらいでライブラリを準備、3分後には普通に使用していました!
この記事では、TA-Libの準備方法から使い方まで詳しく解説していきます。
Ta-libの準備
次の順番で紹介していきます。
- Ta-Libのインストール
- jupyter notebookでTa-Libを使う
- PyCharmでTa-Libを使う
Ta-Libのインストール
ネット上ではTa-Libのインストールで苦労されているという意見もよく見ます。
しかし、私のWindows環境ではAnacondaのconda-forgeからインストールすると問題なく動作することを確認済みです。
Anacondaのターミナルで次のコマンドを実行するとインストールできます。
conda install ta-lib -c conda-forge
ただし、baseの環境には新規のライブラリをインストールすることは推奨されていません。
次のように新規の仮想環境を作成することをオススメします。
conda create -n 環境名
conda activate 環境名
conda install ta-lib -c conda-forge
仮想環境の作成、仮想環境の有効化、Ta-Libのインストールの順に実行しています。
必要に応じて新規の仮想環境にjupyter notebookやNumPy、pandasもインストールしておきましょう。
conda install numpy pandas notebook
上の例ではTa-Libはconda-forgeから、NumPy等はAnacondaレポジトリからインストールしています。
このあたりの詳しい内容が知りたい方は、以下の記事を参考にしてください。
jupyter notebookでTa-Libを使う
Ta-Libをインストールした仮想環境でjupyter notebookを起動する方法を紹介します。
Anacondaのターミナルで次のコマンドを実行しましょう。
conda activate 環境名
conda jupyter notebook
もしくは、スタートメニュー ⇒ <Anaconda3(64-bit)> ⇒ <Jupyter Notebook(環境名)>をクリックしてもOKです。
notebookのセルでtalib
をインポートしてエラーがでなければ、準備完了です。
以下の例では、Ta-Libをインポートして、バージョンを出力しています。
import talib
talib.__version__ # バージョン確認
# '0.4.19'
無事、Ta-Libのバージョン情報が出力されましたね。インストール完了です。
PyCharmでTa-Libを使う
PyCharmでTa-Libを使用するには、PyCharmでプロジェクトを作成する際に、Ta-Libをインストールした仮想環境を選択すればOKです。
PyCharmとAnacondaの連携手順は次の記事を参考にしてください。
Ta-Libの基本的な使い方
まずは、移動平均を例に計算方法の全体的な流れを紹介します。
Ta-Libの基本的な使い方は次の通りです。
- 計算するテクニカル指標の関数をインポート
- 価格データの準備(NumPyの
ndarray
またはpandasのDataFrame
) - テクニカル指標の計算
以下では、次のサンプルデータを使用します。
date = pd.date_range(start='1/1/2022', periods=100, freq='D')
o = np.random.randint(3000,3010, 100).astype(np.float64) + np.arange(100)/10
c = np.random.randint(3000,3010, 100).astype(np.float64) + np.arange(100)/10
h = np.maximum(o, c) + np.random.randint(0,5, 100)
l = np.minimum(o, c) - np.random.randint(0,5, 100)
df = pd.DataFrame({"Date":date,"Open":o, "High":h, "Low":l, "Close":c}).set_index("Date")
ここでは、乱数を使って疑似的な価格データを準備しました。
DataFrame
の中身は次のようになっています。
実際にはCSVなどから読み取ったデータ等を使うことになると思います。
1. テクニカル指標関数インポート
計算するテクニカル指標の関数を、Ta-Libのライブラリからインポートします。
ここでは、移動平均(Moving Average)の関数MA()
をインポートします。
from talib import MA # MA -> Moving Average
主要な指標の関数名、パラメータ設定方法については、この記事の後半で紹介しています。
まずは詳細設定は割愛して、使い方の流れを見てみましょう。
2. 価格データの準備
PandasのDataFrame
やNumPyのndarray
で価格データを準備します。
今回は前述の疑似的な価格データを使用します。
CSVからDataFrame
を作成する場合は、pd.read_csv()
を使用することが多いと思います。
pandasの操作に慣れていない方は、次の記事を参考にしてみてください。
3. テクニカル指標の計算
テクニカル指標計算では、関数に応じて価格データとパラメータを与えます。
- 価格データ:必須の引数(始値、高値、安値、終値のうち必要なもの)
- 各種パラメータ:省略可能なキーワード引数(計算期間など、関数による)
- 省略すると、Ta-Libのデフォルト設定値を使用
例えば、移動平均の場合は価格データとして終値を、パラメータとして平均に使用する日数を与えます。
ma = MA(df["Close"], timeperiod=10)
print(ma)
# 出力結果
# Date
# 2022-01-01 NaN
# 2022-01-02 NaN
# ...
# 2022-04-09 3014.15
# 2022-04-10 3014.65
# Length: 100, dtype: float64
グラフにすると次のように、無事10日移動平均が計算されています。
対応する関数をインポートして計算するだけなので、とても手軽ですね。
入力と出力の型の関係
各種テクニカル指標の詳細を紹介する前に、入力と出力の型の関係に関して解説します。
計算されるテクニカル指標の型は、入力する価格データの型と同じもので返されます。
入力(価格データ)の型 | 出力(テクニカル指標)の型 |
---|---|
DataFrame の列データ(Series ) |
pandas Series |
NumPy ndarray |
NumPy ndarray |
入出力の型が自動で対応するので、価格データと同じDataFrame
にテクニカル指標を追加していくこともできます。
df["MA"] = MA(df["Close"], timeperiod=10)
一つのDataFrame
内に価格データ、テクニカル指標をまとめてしまった方が、後々の取り扱いが楽なことが多いと思います。
DataFrame
の行・列の操作については次の記事を参考にしてください。
次に、インプットをNumPyのndarray
で渡すと、結果もndarray
で返されます。
ma = MA(c, timeperiod=10)
print(ma)
# 出力
# [ nan nan nan nan nan nan nan nan nan
# 3006.65 3006.55 3006.35 3005.75 3006.55 3006.65 3006.05 3005.85 3006.45…
NumPyの方が使い慣れている方は、この方が良いかもしれませんね。
以下では、トレンド系、オシレータ系の順に代表的な指標の計算方法、パラメータの設定方法について紹介していきます。
トレンド系指標の計算
トレンド系の指標の一覧は公式ドキュメントの次のページに掲載されています。
以下では代表的なトレンド系指標として次の指標を紹介します。
指標名 | 指標名(英語) | 関数名 |
---|---|---|
単純移動平均 | Moving average | MA() |
指数移動平均 | Exponential Moving Average | EMA() |
ボリンジャーバンド | Bollinger Bands | BBANDS() |
単純移動平均:MA()
単純移動平均, MA()
関数は次のように使用します。
ma = MA(close, timeperiod)
このときの、引数は次の通りです。
入力値のタイプ | 引数名 | 概要 |
---|---|---|
価格データ(必須) | close |
終値 |
パラメータ(オプション) | timeperiod |
平均をとる日数 (デフォルト値30) |
例として、5日移動平均と25日移動平均を計算してみましょう。
from talib import MA
df["MA5"] = MA(df["Close"], timeperiod=5)
df["MA25"] = MA(df["Close"], timeperiod=25)
df[["Open", "High", "Low", "Close", "MA5", "MA25"]].tail()
出力結果は次の通りです。
グラフにすると次のようになっています。
あとは簡単な判定式を追加すればゴールデンクロスやデッドクロスも判定できますね。
指数移動平均:EMA()
指数移動平均, EMA()
関数は次のように使用します。
ma = EMA(close, timeperiod)
このときの、引数は次の通りです。
入力値のタイプ | 引数名(デフォルト値) | 概要 |
---|---|---|
価格データ(必須) | close |
終値 |
パラメータ(オプション) | timeperiod |
平均をとる日数 (デフォルト値30) |
例として、5日移動平均と25日移動平均を計算してみましょう。
from talib import EMA
df["EMA5"] = EMA(df["Close"], timeperiod=5)
df["EMA25"] = EMA(df["Close"], timeperiod=25)
df[["Open", "High", "Low", "Close", "EMA5", "EMA25"]].tail()
出力結果は次の通りです。
グラフにすると次のようになっています。
ボリンジャーバンド:BBANDS()
ボリンジャーバンド, BBANDS()
関数は次のように使用します。
upper, middle, lower = BBANDS(close, timeperiod)
このときの、引数は次の通りです。上下のバンドのσ値や移動平均の種類も設定できます。
入力値のタイプ | 引数名(デフォルト値) | 概要 |
---|---|---|
価格データ(必須) | close |
終値 |
パラメータ(オプション) | timeperiod |
計算期間 (デフォルト値5) |
nbdevup |
上側バンドのσ値 (デフォルト値2) |
|
nbdevdn |
下側バンドのσ値 (デフォルト値2) |
|
matype |
移動平均の種類 (デフォルト 単純移動平均) |
例として、計算期間を20日に設定してボリンジャーバンドを計算してみましょう。
from talib import BBANDS
df["UPPER"], df["MIDDLE"], df["LOWER"] = BBANDS(df["Close"], timeperiod=20)
df[["Open", "High", "Low", "Close", "UPPER", "MIDDLE", "LOWER"]].tail()
出力結果は次の通りです。
グラフにすると次のようになっています。
ボリンジャーバンドは通常移動平均を使用して計算されますが、matype
を変更して移動平均の種類を変更することができます。
例として、指数移動平均を使用したボリンジャーバンドを計算してみましょう。
from talib import BBANDS
from talib import MA_Type
df["UPPER"], df["MIDDLE"], df["LOWER"] = BBANDS(df["Close"], timeperiod=20, matype=MA_Type.EMA)
グラフにすると次のようなボリンジャーバンドが作成されます。
指数移動平均の方が好みの方にとっては、嬉しい機能ですね。
オシレータ系指標の計算
オシレータ系の指標の一覧は公式ドキュメントの次のページに掲載されています。
以下では代表的なトレンド系指標として次に指標を紹介します。
指標名 | 指標名(英語) | 関数名 |
---|---|---|
RSI | Relative Strength Index | RSI() |
ストキャスティクス | Stochastic | STOCH() |
DMI | Directional Movement Index | PLUS_DI() , MINUS_DI ,ADX() |
MACD | Moving Average Convergence Divergence |
MACD() |
DMIとMACDの分類に悩みますが、公式ドキュメントのリンクの関係からオシレータにまとめました。
RSI:RSI()
RSI()
関数は次のように使用します。
rsi = RSI(close, timeperiod)
このときの、引数は次の通りです。
入力値のタイプ | 引数名 | 概要 |
---|---|---|
価格データ(必須) | close |
終値 |
パラメータ(オプション) | timeperiod |
計算日数 (デフォルト値14) |
例として、5日間RSIを計算してみましょう。
from talib import RSI
df["RSI"] = RSI(df["Close"], timeperiod=5)
df[["Open", "High", "Low", "Close", "RSI"]].tail()
出力結果は次の通りです。
グラフにすると次のようになっています。
ストキャスティクス:STOCH()
ストキャスティクスには、スローとファストでそれぞれ関数が異なります。
slowk, slowd = STOCH(high, low, close, fastk_period, slowk_period, slowd_period)
fastk, fastd = STOCHF(high, low, close, fastk_period, fastd_period)
このときの、引数は次の通りです。
入力値のタイプ | 引数名 | 概要 |
---|---|---|
価格データ(必須) | high |
高値 |
low |
安値 | |
close |
終値 | |
パラメータ(オプション) | fastk_period |
ファスト%Kの計算日数 (デフォルト値5) |
fastd_period |
ファスト%Dの計算日数 (デフォルト値3) |
|
slowk_period |
スロー%Kの計算日数 (デフォルト値3) |
|
slowd_period |
スロー%Dの計算日数 (デフォルト値3) |
例として、スローストキャスティクスを計算してみましょう。
from talib import STOCH
df["SLOW_K"], df["SLOW_D"] = STOCH(df["High"], df["Low"], df["Close"], fastk_period=5, slowk_period=3, slowd_period=3)
df[["Open", "High", "Low", "Close", "SLOW_K", "SLOW_D"]].tail()
出力結果は次の通りです。
グラフにすると次のようになっています。
ファストストキャスティクスは、STOCHF()
で同じように計算することができます。
DMI:PLUS_DI(), MINUS_DI(), ADX()
DMIは、+DI、-DI、ADXをそれぞれ別の関数で計算する必要があります。
plus_di = PLUS_DI(high, low, close, timeperiod)
minus_di = MINUS_DI(high, low, close, timeperiod)
adx = ADX(high, low, close, timeperiod)
このときの、引数は次の通りです。
入力値のタイプ | 引数名(デフォルト値) | 概要 |
---|---|---|
価格データ(必須) | high |
高値 |
low |
安値 | |
close |
終値 | |
パラメータ(オプション) | timeperiod |
計算日数 (デフォルト値5) |
例として、14日間の±DIとADXを計算してみましょう。
from talib import PLUS_DI, MINUS_DI, ADX
df["+DI"] = PLUS_DI(df["High"], df["Low"], df["Close"], timeperiod=14)
df["-DI"] = MINUS_DI(df["High"], df["Low"], df["Close"], timeperiod=14)
df["ADX"] = ADX(df["High"], df["Low"], df["Close"], timeperiod=14)
df[["Open", "High", "Low", "Close", "+DI", "-DI", "ADX"]].tail()
出力結果は次の通りです。
グラフにすると次のようになっています。
DMI関係は計算結果が不安定な期間があるので、実装する際には特に注意して使う必要があります。
マックディー:MACD()
マックディー, MACD()
関数は次のように使用します。
macd, signal, hist= MACD(close, fastperiod, slowperiod, signalperiod)
このときの、引数は次の通りです。
入力値のタイプ | 引数名(デフォルト値) | 概要 |
---|---|---|
価格データ(必須) | close |
終値 |
パラメータ(オプション) | fastperiod |
短期EMAの期間 (デフォルト値12) |
slowperiod |
長期EMAの期間 (デフォルト値26) |
|
signalperiod |
シグナルラインの平均期間 (デフォルト値9) |
例として、短期EMA期間が12日、長期EMA期間が26日、シグナルが9日のMACDを計算してみましょう。
from talib import MACD
df["MACD"], df["SIGNAL"], df["HIST"] = MACD(df["Close"], fastperiod=12, slowperiod=26, signalperiod=9)
df[["Open", "High", "Low", "Close", "MACD", "SIGNAL", "HIST"]].tail()
出力結果は次の通りです。
グラフにすると次のようになっています。
MACDのグラフは様々な要素が含まれますが、Matplotlibを使えば簡単に作成できます。
Matplotlibの使い方については次の記事を参考にしてください。
おわりに
今回はTa-Libのインストール方法、主要なテクニカル指数の計算方法を紹介しました。
Ta-Libを使用すると、とても手軽に、しかも高速にテクニカル指標を計算することができます。
様々なテクニカル指標を組み合わせるなど、いろいろな拡張性がありますね。