Pythonで為替のテクニカル指標を可視化

はじめまして、2017年新卒システムエンジニアの鈴木です。
6月から解析ユニットに配属され、現在は広告の分析業務をしています。
解析ユニットはとても良い所です。

今回は、Pythonを用いて為替のテクニカル指標を簡単にプロットする方法を紹介したいと思います。

準備

為替情報の取得には、OANDA社の提供するREST-V20 APIを使います。

https://www.oanda.com/

こちらのウェブサイトからデモトレード用の口座を開設することで、APIを利用するためのアクセストークンを取得することができます。

APIのラッパーと、データ操作・可視化用のライブラリを導入します。

pip install oandapyV20
pip install pandas
pip install matplotlib
pip install seaborn

以上で準備完了です。

データ取得

実際に為替データを取得してみます。
今回はドル円1分足のローソク足データを1時間分取ります。

ローソク足とは
単位時間あたりの始値、高値、安値、終値の4つで構成される指標です。
単位時間によって1分足、1時間足、日足という呼び方をします。
足を「あし」と呼びます。

candlestick.py

import datetime
import pandas
import seaborn
import matplotlib.pyplot as plt
from matplotlib.finance import candlestick_ohlc as plot_candle
from oandapyV20 import API
import oandapyV20.endpoints.instruments as oandapy

if __name__ == '__main__':
    now          = datetime.datetime.now() - datetime.timedelta(hours = 9) # 標準時に合わせる
    minutes      = 61 # 60分取得
    time_min     = now - datetime.timedelta(minutes = 120) # 2時間前からデータを取得する
    time_min     = time_min.strftime("%Y-%m-%dT%H:%M:00.000000Z")
    access_token = "**********************************************"
    api          = API(access_token = access_token, environment="practice")
    request      = oandapy.InstrumentsCandles(instrument = "USD_JPY", params = { "alignmentTimezone": "Japan", "from": time_min, "count": minutes, "granularity": "M1" })
    api.request(request)

    candle = pandas.DataFrame.from_dict([ row['mid'] for row in request.response['candles'] ])
    candle = candle.set_index([[ row['time'] for row in request.response['candles'] ]])
    print(candle)

実行結果(一部抜粋)
f:id:AdwaysEngineerBlog:20171006113849p:plain

先ほどのスクリプトを実行すると、1時間分のローソク足データをPandasデータフレームに読み込むことができます。 インデックスに時間、カラムoに始値、カラムlに安値、カラムhに高値、カラムcに終値が格納されています。

可視化

データフレームに格納されたデータはmatplotlibを使って可視化することができます。

figure, ax = plt.subplots()
plt_candle( ax, opens = candle.o.values, highs = candle.h.values, lows = candle.l.values, closes = candle.c.values, width=0.4, colorup='#77d879', colordown='#db3f3f')
plt.show()

実行結果 f:id:AdwaysEngineerBlog:20171006113955p:plain

テクニカル指標の計算

テクニカル指標の計算を行います。
今回は、もっとも有名なテクニカル指標の一つであるボリンジャーバンドをプロットします。

ボリンジャーバンドとは
1980年前半にジョン・ボリンジャー氏が公表したテクニカル分析方法です。
移動平均線と、それを中心とした±1σ、±2σ、±3σの7本のラインから成り立っています。
±2σ内でチャートが推移する確率が95.45%なので、それを超えると買われ過ぎ、売られ過ぎといった判断ができます。

シグマの計算式は少し複雑ですが、PandasのSeriesを使うと簡単に計算が可能です。

candlestick.py

avg_move     = pandas.Series.rolling(candle.c, window = 5).mean().dropna().reset_index(drop = True)
sigma        = pandas.Series.rolling(candle.c, window = 5).std(ddof = 0).dropna().reset_index(drop = True)
sigma_plus1  = avg_move + sigma
sigma_plus2  = avg_move + sigma * 2
sigma_plus3  = avg_move + sigma * 3
sigma_minus1 = avg_move - sigma
sigma_minus2 = avg_move - sigma * 2
sigma_minus3 = avg_move - sigma * 3

計算したボリンジャーバンドを先ほどのローソク足チャートに描画すると以下のようになります。

実行結果 f:id:AdwaysEngineerBlog:20171006114039p:plain

一般的には日足で25日平均線などを使用するのが一般的ですが、今回は分足なので分かりやすくするために5分間平均線で計算しています。

まとめ

テクニカル指標の一つであるボリンジャーバンドのプロットをしました。 PythonとPandasを用いると、分析の際に作業の8割を占めると言われている、データの前処理にかかる時間を短縮することができます。
もし興味があればPythonとPandasを使ってみてください。
ありがとうございました。