Python + Talibでボリンジャーバンドと5日単純移動平均をローソク足チャートに出してみる
こんばんは、新米データサイエンティスト(@algon_fx)です。気づけば4月に突入しており、会社で新卒の方々も無事入社されました。日曜日はちょっと所用で他の勉強をして、月曜日は簡単な新卒の方々の歓迎会でした。
ってことで、2日も機械学習 x FXから離れてしまったので、今日はがっつりと勉強をしました。さて、今日は以前に紹介したテクニカル指標をPythonで超絶簡単に計算をしてくれるライブラリ「Ta-Lib」を紹介しましたが、今日は実際に使ってみたいと思います。
具体的にやることとしては、毎度おなじみの3月2週目のドル円データセットを使って、Ta-Libで5日単純移動平均とボリンジャーボンドを1分足ローソク足チャートに表示させてみようかと思います。
【人気記事】
為替レートの準備
下のコードで使っている USD_JPY_Week2.csv ですが、こちらの記事をご参考ください。お決まりですがCSVデータをPandasのデータフレームとして読み込んで1週間のデータから1分ごとに変換をしてあげましょう。
加えて、今回はテクニカル指標のMACDとボリンジャーバンドをプロッティングしたいので、データの欠損値をPandasの fillna(method=’ffill’) で穴埋めします。(ffillのメソッドですが、欠損箇所の次のデータの値を取得して穴埋めしてくれます)
まずは必要なライブラリのインポートから。
1 2 3 4 5 6 7 8 9 10 |
import pandas as pd import numpy as np import talib as ta import time import matplotlib.pyplot as plt import datetime ta.get_function_groups %matplotlib qt |
次にCSVファイルを読み込んで、少しだけクレンジングしてあげましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
# データフレームを読み込む df = pd.read_csv('USD_JPY_Week2.csv', index_col='DateTime', names=['Tid', 'Dealable', 'Pair', 'DateTime', 'Buy', 'Sell'], skiprows=1) # indexをdatatime型へ df.index = pd.to_datetime(df.index) # 不必要な項目を落とす del df['Tid'] del df['Dealable'] del df['Pair'] |
最後に買値のみ切り出して、Tickデータを1分間データへ、1週間を100分へデータを変更してあげましょう。(1週間分のデータを1分足ローソク足チャートにするとカオスになる)
加えて、先述した欠損値の穴埋めも行ってあげます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Tickから1分ごとのデータへ変換 min_1 = df.resample('1Min', how='ohlc') # 買値のみに切り出し buy_1min = min_1.xs('Buy', axis=1, drop_level=True) # 1週間のデータから100分へ変更 buy_1min_s = buy_1min[0:100] # 欠損データが多数あるので今回はffillで欠損値に前の分のデータを穴埋め buy_1min_s = buy_1min_s.fillna(method='ffill') |
ひとまず、これでデータの準備OK!
Ta-Libで5日単純移動平均をプロットしてみる
さて、いよいよ先週からいじりたくてたまらなかったTa-Lib先生の登場です。まずはシンプルなところで5日単純移動平均(Simiple Moving Average)を上記のデータから計算をしてプロットしてみよう。
一つ注意点として上のデータ準備で作成した buy_1min_s の close の値を渡しているので要注意。close=終値で単純移動平均を計算しています。
1 2 3 4 |
# 5日単純移動平均 sma5 = ta.SMA(buy_1min_s.close, timeperiod=5) |
…これだけ?!と驚くくらいシンプルですね笑。初めて使うので、型の確認もしてみましょう。
1 2 3 4 |
# 型の確認 type(sma5) |
pandas.core.series.Series
おー、Pandasのシリーズで返してくれるのですね。これは超絶便利!!まさか計算間違いはないとは思うが、念のため…元データとTa-libが生成したデータを確認してみよう。(データサイエンティストのサガw)
1 2 3 4 5 6 7 |
# 元データの最初の5行の平均値 buy_1min_s['close'][0:5].mean() # Ta-Libが生成した最初の5日平均 sma5[4] |
(106.64700000000001, 106.64700000000001)
おぉ…そりゃ当然あってますよね笑。では、このSMAとドル円の1分データを使って、ローソク足チャートをMatplotlibで作ってみましょう。(参照:Pythonでローソク足チャート)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# SMA5を引いてみよう import numpy as np import matplotlib.pyplot as plt import matplotlib.finance as mpf from matplotlib import ticker import matplotlib.dates as mdates import pandas as pd fig = plt.figure() ax = plt.subplot() ohlc = np.vstack((range(len(buy_1min_s)), buy_1min_s.values.T)).T mpf.candlestick_ohlc(ax, ohlc, width=0.8, colorup='r', colordown='b') xtick0 = (5-buy_1min_s.index[0].weekday())%5 ax.plot(range(len(buy_1min_s)), sma5, color='green') plt.xticks(range(xtick0,len(buy_1min_s),5), [x.strftime('%Y-%m-%d') for x in buy_1min_s.index][xtick0::5]) ax.grid(True) ax.set_xlim(-1, len(buy_1min_s)) fig.autofmt_xdate() |
これでオッケーですね。1分ローソク足チャートに5日単純移動平均線が引かれましたね。正直、5日平均なんてライブラリ使う必要ねーよと思っているあなた!そんな方のために、ボリンジャーバンドを次はチャートに落としてみましょう。
Ta-libでボリンジャーバンドをプロット
以前に私が裁量トレードにかじっていた時に、標準でボリンジャーバンドは表示させていました。名前がなんとなく好きです。ボリンジャー。ボリンジャー。
では、Ta-Lib先輩にボリンジャーバンドで必要なデータを作っていただきましょう。
1 2 3 4 |
# ボリンジャーバンド upper, middle, lower = ta.BBANDS(buy_1min_s.close, timeperiod=5) |
またもや…これだけ笑。
では、次はこちらのボリンジャーバンドの値をMatplotlibでチャートに落とし込んでみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# ボリンジャーバンド import numpy as np import matplotlib.pyplot as plt import matplotlib.finance as mpf from matplotlib import ticker import matplotlib.dates as mdates import pandas as pd fig = plt.figure() ax = plt.subplot() ohlc = np.vstack((range(len(buy_1min_s)), buy_1min_s.values.T)).T #x軸データを整数に mpf.candlestick_ohlc(ax, ohlc, width=0.8, colorup='r', colordown='b') xtick0 = (5-buy_1min_s.index[0].weekday())%5 #最初の月曜日のインデックス #ax.plot(range(len(buy_1min_s)), sma5, color='green') ax.plot(range(len(buy_1min_s)), upper, color='gray') ax.plot(range(len(buy_1min_s)), middle, color='yellow') ax.plot(range(len(buy_1min_s)), lower, color='gray') plt.xticks(range(xtick0,len(buy_1min_s),5), [x.strftime('%Y-%m-%d') for x in buy_1min_s.index][xtick0::5]) ax.grid(True) #グリッド表示 ax.set_xlim(-1, len(buy_1min_s)) #x軸の範囲 fig.autofmt_xdate() #x軸のオートフォーマット |
自分で色を指定したのですが、ボリンジャーバンドの色のセンスが悪い。醜い。気持ち悪い。ですが、ひとまずはボリンジャーバンドが表示されています。
まとめと次のステップ
さて、今日はTa-Libを使って5日単純移動平均線とボリンジャーバンドをロウソク足チャートへMatplotlibを使って描写してみました。
Ta-libですが、公式ドキュメントが異様に少なかったので、少し手こずる予感はしていたのですが、思ったよりも使い方が簡単でした。
これで、Pythonでローソク足チャートを描いたり、テクニカル指標を計算してチャートに落とし込む的な基本操作は覚えれました。
次の課題としては、APIと連携して最新の為替レートを取得→決まった期間で定点的にローソク足チャート+テクニカル指標を描写+チャートを画像としてDBに保存していく。という流れもやっていきたい。
これをやることで、大量のチャート画像を取得して、チャート+テクニカル指標の画像を訓練して、簡単なFX予測ができるのではと考えています。(参照:プロジェクト進捗表)
ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
通りすがりのものです。
コラム楽しくよませていただきました。
一箇所だけ、この記事でのffillの説明がbfillの説明になっているようにおもいました。
暑さが厳しいですが、ご自愛ください。
かしこ