YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

python vs 株式投資|TA-Libでテクニカル指標を簡単計算!

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レポジトリからインストールしています。

このあたりの詳しい内容が知りたい方は、以下の記事を参考にしてください。

≫Anaconda:デフォルトチャンネルとconda-forgeを最大限に活かす方法
≫Anaconda:デフォルトチャンネルとconda-forgeを最大限に活かす方法
Anacondaで仮想環境を作る際に、conda-forgeにしかないライブラリもインストールする場合には、どういう手順を踏めばいいのでしょうか?Anacondaレポジトリを最大限に活かしつつ、conda-forgeから最低限のライブラリをインストールする方法を整理しました!
www.yutaka-note.com/entry/conda_forge_best
 

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の連携手順は次の記事を参考にしてください。

≫Anaconda の仮想環境を Pycharmで使う方法
≫Anaconda の仮想環境を Pycharmで使う方法
Anaconda はライブラリ、モジュール管理にとても便利ですよね。一方、Pycharm はコード補完が優秀で人気のPythonエディタの一つです。そこで、「Anaconda で作成した仮想環境を Pycharmで使いたい!」という方向けに、AnacondaとPyCharmの連携方法を紹介します。
www.yutaka-note.com/entry/pycharm_anaconda
 

Ta-Libの基本的な使い方

まずは、移動平均を例に計算方法の全体的な流れを紹介します。

Ta-Libの基本的な使い方は次の通りです。

  1. 計算するテクニカル指標の関数をインポート
  2. 価格データの準備(NumPyのndarrayまたはpandasのDataFrame
  3. テクニカル指標の計算

以下では、次のサンプルデータを使用します。

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の操作に慣れていない方は、次の記事を参考にしてみてください。

≫pandas | read_csv() 図解でわかりやすく解説!
≫pandas | read_csv() 図解でわかりやすく解説!
pandasでcsvファイルを読み込むための関数read_csv()について、図解で徹底解説! ①区切り文字の指定②indexやlabelの行や列を指定する方法③読み込む行・列の指定など細かい設定についての解説記事です!
www.yutaka-note.com/entry/pandas_read_csv
 

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の行・列の操作については次の記事を参考にしてください。

≫pandas DataFrameの行・列を抽出|loc, ilocなどわかりやすく解説!
≫pandas DataFrameの行・列を抽出|loc, ilocなどわかりやすく解説!
pandasのDataFrameを使うと、行と列で構成されたデータを簡単に取り扱うことができます。この記事では、「DataFrameの特定の行、列のデータを抽出する方法」、「インデックス参照、.loc、.iloc、at、iat[]の使い方」をわかりやすい図解付きで解説しています。
www.yutaka-note.com/entry/pandas_access
 

次に、インプットを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の使い方については次の記事を参考にしてください。

≫【初心者向け】Matplotlibの特徴と使い方をわかりやすく解説!
≫【初心者向け】Matplotlibの特徴と使い方をわかりやすく解説!
脱初心者のためのMatplotlibマスターガイドです。そもそもどういう流れでプロットするのか?どんな種類のグラフが描けるのか?日本語設定は?タイトルや軸の設定は?オブジェクト指向って何?そんな疑問を解決します!この記事で、脱Matplotlib初心者を目指そう!
www.yutaka-note.com/entry/matplotlib_guid
 

おわりに

今回はTa-Libのインストール方法、主要なテクニカル指数の計算方法を紹介しました。

Ta-Libを使用すると、とても手軽に、しかも高速にテクニカル指標を計算することができます。

様々なテクニカル指標を組み合わせるなど、いろいろな拡張性がありますね。