Pythonのライブラリ「pyti」を使ってテクニカル指標を計算してみる
【人気記事】私のFX向け機械学習&トレードの環境
こんばんは、新米データサイエンティスト(@algon_fx)です。約三週間もブログをサボってしまいました…。本業が忙しかったのもありますが、最近はブログの記事を書く時間があるのであれば予測モデルへの時間を費やしたく…なかなか記事を書く時間が取れていませんんでした。
プロジェクト管理表にも記載していますが、ここ最近はLSTM(Long-Short-Term-Memory)を使って予測モデルに没頭しています。これがまた、色々と奥が深い。
まだ試行錯誤で利益が出ることはありませんが…OANDAのプロコースで実弾でやっています。100〜1000通貨の小さいトレードですが、デモ口座でやるよりも身が引き締まりますね。
さて、今日の記事はPythonで簡単にテクニカル指標が計算できる「pyti」の初歩的な使い方をまとめます。
紹介すると言っておきながらいきなりですが、個人的にはテクニカル指標はライブラリに頼らないほうが良いと思います。特にFX予測を始めたばかりの方は。Pythonでテクニカル指標シリーズでもやっていますが、テクニカル指標の計算式を理解するためにも、スクラッチで計算することをお勧めします。
とはいえ、少し慣れてきたらやっぱりライブラリに頼るのが楽で簡単です!以前に紹介した「Talib」に加えて、最近新しく使っている「pyti」の基本的な操作方法をまとめました。
そもそもTa-libとpytiの違いとは
テクニカル指標の処理ライブラリの決定版といえば「Ta-lib(タリブ)」です。日本語でもTa-libを紹介しいる記事が多く、リソースも比較的豊富なので使っている方も多いかと。
では、なぜpyti(パイタイと読む)を使うのか?それは、Ta-libで使えないテクニカル指標が稀にあったり、計算方法が若干異なっていたりするからです。
例えば一目均衡表。これはTa-libでは対応していませんがpytiでは対応しています。両ライブラリともに、実装されているテクニカル指標の種類は豊富なんですが、一目均衡表のようにどちらかでしか実装されていない指標もあります。
あとTwitterで何度かDMを頂いたのですが、Talibのインストールが上手くいかない人が一定数います(笑)主にWindowsユーザーに多いようですが、原因不明のエラーが出るそうです。ってことでTalibのインストールが上手くいかなかった人の代替手段としてもpytiを紹介できればと。
pytiのインストールと必要環境
pytiですがPython2とPython3に対応しています。またインストールはpip経由で簡単に行えます。
1 2 3 4 |
# pytiのインストール pip install pyti |
1 2 3 4 5 6 7 8 9 10 11 |
--出力 Downloading https://files.pythonhosted.org/packages/0f/9a/913e5bc3c3e812b490338fc9096b608cf0e19d1c3cd5b1c2b58b77b69b85/pyti-0.2.2-py2.py3-none-any.whl Requirement already satisfied: pandas in /anaconda/lib/python3.6/site-packages (from pyti) Requirement already satisfied: numpy in /anaconda/lib/python3.6/site-packages (from pyti) Requirement already satisfied: python-dateutil>=2 in /anaconda/lib/python3.6/site-packages (from pandas->pyti) Requirement already satisfied: pytz>=2011k in /anaconda/lib/python3.6/site-packages (from pandas->pyti) Requirement already satisfied: six>=1.5 in /anaconda/lib/python3.6/site-packages (from python-dateutil>=2->pandas->pyti) Installing collected packages: pyti Successfully installed pyti-0.2.2 |
Windosでは試していませんが私のMacでは特に問題もなくインストールが出来ました。インストールでエラーが出た方はコメントで共有ください。
データの準備
ではpytiを使ってみましょう。いつものビットコインの過去レートをスクレイピングしたレートを使いましょう。(参照:ビットコインのスクレイピング)
まず必要なライブラリーをインポートします。
1 2 3 4 5 6 7 8 |
# ライブラリーのインポート import pandas as pd from datetime import datetime import matplotlib.pyplot as plt import numpy as np %matplotlib qt |
次にビットコインの今年1月からの過去レートを1日足でスクレイピングしましょう。カラム名にアスタリスクが入っていて邪魔ですので変更しておきます。
1 2 3 4 5 6 7 8 9 10 |
# コインマーケットキャップからデータをスクレイピング bit = pd.read_html("https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20180101&end="+time.strftime("%Y%m%d"))[0] bit = bit.assign(Date=pd.to_datetime(bit['Date'])) bit['Volume'] = bit['Volume'].astype('int64') bit.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Cap'] # 最初の5行を表示 bit.head() |
EMA(指数平滑移動平均)を計算
ではまずはpytiを使ってEMA(指数平滑移動平均)を計算してあげましょう。EMAの計算方法とスクラッチでの書き方はこちらの記事をご参考ください。
まずpytiの必要なモジュールをインポートしましょう。
1 2 3 4 |
# pytiのEMAモジュール from pyti.exponential_moving_average import exponential_moving_average as ema |
EMAですが一般的に短期9と長期26を使いますので、そのまま計算します。
ちょっと汚いコードで恥ずかしいですが、まぁ仕事はしてくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# EMA26を計算 data = bit['Close'].values.tolist() period = 26 ema_26 = ema(data, period) bit['ema_26'] = ema_26 # EMA9を計算 data = bit['Close'].values.tolist() period = 9 ema_9 = ema(data, period) bit['ema_9'] = ema_9 |
これで計算完了です。periodとしてEMAの期間を指定しています。talibとの大きな違いの一つですがpytiはpythonのリストを渡す必要があります。これは少し面倒ですね。
では本当にEMAが計算できているのか確認をしてみましょう。
1 2 3 4 |
# EMAをプロッティング bit[['Close', 'ema_26', 'ema_9']].plot() |
ちゃんとビットコインの終値とEMA26/EMA9が表示されているのが確認できます。EMAをスクラッチで計算処理すると面倒なのですが、Pytiでは終値と期間(period)を関数に渡してあげるだけで計算してくれます。便利ですね。
ボリンジャーバンドを計算
次にテクニカル指標として人気の高いボリンジャーバンドの計算をpytiを使ってやりましょう。(スクラッチで計算したい方はこちらの記事参照:ボリンジャーバンドの使い方と計算式、Pythonでボリンジャーバンドを書いてみる)
上の記事を見ていただくと解りますが、ボリンジャーバンドは標準偏差(データの散らばり度合い)を基本として、1σと-1σを計算します。場合には2σと-2σを使う方もいますが、残念ながらpytiでは2σは標準装備されていません。
ではボリンジャーバンドを計算してみましょう。まずはσ(middle_bollinger_band)、1σ(upper_bollinger_band)、-1σ(lower_bollinger_band)の関数をpytiからインポートしましょう。
1 2 3 4 5 6 |
# ボリンジャーバンドの関数 from pyti.bollinger_bands import upper_bollinger_band as bb_up from pyti.bollinger_bands import middle_bollinger_band as bb_mid from pyti.bollinger_bands import lower_bollinger_band as bb_low |
ボリンジャーバンドは期間20が一般的なので、periodを20として計算をします。
1 2 3 4 5 6 7 8 9 10 11 |
# ボリンジャーバンドの計算 data = bit['Close'].values.tolist() period = 20 bb_up = bb_up(data,period) bb_mid = bb_mid(data,period) bb_low = bb_low(data,period) bit['bb_up'] = bb_up bit['bb_mid'] = bb_mid bit['bb_low'] = bb_low |
念のため値を確認して見ます。tail()でデータフレームの最後の5行を表示させます。
1 2 3 4 |
# ボリンジャーバンドが計算されているか確認 bit[['Close', 'bb_up', 'bb_mid', 'bb_low']].tail() |
大丈夫そうですね。では、終値と一緒にボリンジャーバンドをチャートに落としてみましょう。
1 2 3 4 |
# ボリンジャーバンドをプロッティング bit[['Close', 'bb_up', 'bb_mid', 'bb_low']].plot() |
こうやってみるとボリンジャーバンドがテクニカル指標として優秀なのが解りますね。ちゃんと1σと-1σの間に収まっていますし。ただトレード時はボリンジャーバンドのみで判断はできませんが。
ストキャスティクスを計算する
次はオシレーター系の代表格とも言うべきストキャスティクスをpytiで計算しましょう。(参照:「ストキャスティクス」をPythonを使って書いてみた。ストキャスの使い方、計算方法のまとめ。)
ストキャスは%D、%Kとさらに%SDを計算する必要があります……が!pytiでは%SDを計算する関数が見つかりません。(見落としているのか、海外では%SDはメジャーではないのか)
まぁ何れにしても%Dと%Kを計算してみましょう。
1 2 3 4 5 |
# ストキャスティクスの関数をライブラリからインポート from pyti.stochastic import percent_k as per_k from pyti.stochastic import percent_d as per_d |
1 2 3 4 5 6 7 8 9 10 |
# ストキャスの計算 data = bit['Close'].values.tolist() period = 14 per_k = per_k(data, period) per_d = per_d(data, period) bit['per_k'] = per_k bit['per_d'] = per_d |
では、Matplotlibのサブプロットを使って終値とストキャスを表示してみましょう。
1 2 3 4 5 6 7 8 9 10 |
# ストキャスティクスをMatplotlibを使ってチャート描写 fig, (ax1, ax2) = plt.subplots(2,1, gridspec_kw = {'height_ratios':[3, 1]}) ax1.plot(bit['Date'], bit['Close']) ax2.plot(bit['Date'], bit['per_k']) ax2.plot(bit['Date'], bit['per_d']) plt.legend() fig.tight_layout() plt.show() |
大丈夫そうですね。%SDがないと、どこか寂しいチャートに見えますが(笑)
MACDを計算
最後にこちらもテクニカル指標として定番のMACDをpytiで計算してみましょう。(参照:MACDをPythonを使って計算してみる。MACDの計算方法や使い方のまとめ。)
1 2 3 4 |
# MACDの関数をインポート from pyti.moving_average_convergence_divergence import moving_average_convergence_divergence as macd |
1 2 3 4 5 6 7 8 9 |
# MACDを計算 data = bit['Close'].values.tolist() long = 26 short = 12 macd = macd(data, short, long) bit['macd'] = macd |
MACDの関数ですが短期と長期をアーギュメントで渡す必要があります。今回は一般的な期間26と期間12で計算をします。
ではMatplotlibでチャートに落としてみましょう。
1 2 3 4 5 6 7 8 9 |
# MACDをプロッティング fig, (ax1, ax2) = plt.subplots(2,1, gridspec_kw = {'height_ratios':[3, 1]}) ax1.plot(bit['Date'], bit['Close']) ax2.plot(bit['Date'], bit['macd']) plt.legend() fig.tight_layout() plt.show() |
自分はトレードではMACDとシグナルを使いますが、シグナルに関してはpytiには計算関数がありませんでした。まぁ自分で計算処理を書けば特に問題はありませんが、このようにpytiもTalibも若干歯がゆい部分があるのは事実です。
まとめと次の課題
今回はPythonでテクニカル指標を簡単に計算をしてくれる「pyti」ライブラリのインストールから基礎的な使いをまとめました。いかがでしたか?
次の課題としては自分でPythonでスクラッチで計算、 Talibで計算、Pytiで計算をしてみて、指標の値がちゃんと同等になるか調査をしてみたいですね。
Talibではメジャーなテクニカル指標で比較をしてみたところ、全く同じ値が出るものもありますが、若干ずれるものもありました。私の計算方法が間違っていたり、調べるとTalibの計算方法がマイナーな計算方法を採用していたりと理由はそれぞれでしたが。
ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
【人気記事】
ディスカッション
コメント一覧
まだ、コメントがありません