superi

働かないために全力で働くスタイル

【FX】Pythonでローソク足をプロットする


スポンサーリンク

f:id:ukichang:20190330165117j:plain
前回、為替レートの5分足のヒストリカルデータを入手しました。
www.superi.jp
今回は、このOHLCデータを、PythonのPandasを使ってFXの分析に欠かせない、ローソク足のプロットをしたいと思います。

5分足への変換

読み込むデータは前回入手したファイルです。入手データは1分足(で時折欠損している時間がある)のもので、粒度が細かすぎるので5分足に変換します。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns

#ファイルの読み込み
data = pd.read_csv('USDJPY.txt',delimiter=',',dtype = {'<DTYYYYMMDD>':'object','<TIME>':'object'})

#datetimeをパースする
import datetime
from dateutil.parser import parse

data['datetime']=data['<DTYYYYMMDD>'].astype('str').str.cat(data['<TIME>'].astype('str'), sep=' ').apply(lambda x:parse(x))

#GMTの時間となっているため、+9の日本時間に変換
data['time']=data['datetime']+datetime.timedelta(hours=9)

#時系列として扱うため、timeをインデックスにセット
data.set_index('time', inplace=True)

#5分足にリサンプリング
ticks_5T = data.resample('5T').agg({'<OPEN>':'first', '<HIGH>':'max', '<LOW>':'min', '<CLOSE>':'last'})
ticks_5T = ticks_5T.rename(columns={'<OPEN>':'open', '<HIGH>':'high', '<LOW>':'low', '<CLOSE>':'close'})
ticks_5T = ticks_5T.loc[:,['open','high','low','close']]

1分足を5分足にリサンプリングするにはresample().agg()を使用します。resampleの引数は、以下のとおりです。

引数 ローソク足
D
H 時間
T

この際、5分足のOHLCを算出したい場合は'5T'と数値を加えてあげます。 結果、次のようなデータが作成されるかと思います。
f:id:ukichang:20190330174514p:plain

チャートのプロット

次に作成した5分足データをチャートにプロットします。

import matplotlib.pyplot as plt
import matplotlib.finance as mpf
from matplotlib import ticker
import matplotlib.dates as mdates

#チャート描画オブジェクトの定義
def candlechart(data, width=0.8):
    fig, ax = plt.subplots()
    # ローソク足
    mpf.candlestick2_ohlc(ax, opens=data.open.values, closes=data.close.values,
                          lows=data.low.values, highs=data.high.values,
                          width=width, colorup='r', colordown='b')
 
    xdate = data.index
    ax.xaxis.set_major_locator(ticker.MaxNLocator(6))
 
    def mydate(x, pos):
        try:
            return xdate[int(x)]
        except IndexError:
            return ''
 
    xtick0 = (5-data.index[0].weekday())%5 #最初の月曜日のインデックス
    plt.xticks(range(xtick0,len(data),5), [x.strftime('%Y-%m-%d') for x in data.index][xtick0::5])

    ax.xaxis.set_major_formatter(ticker.FuncFormatter(mydate))
    ax.format_xdata = mdates.DateFormatter('%Y-%m-%d')
    ax.ticklabel_format(style='plain',axis='y', useOffset=False)
 
    fig.autofmt_xdate()
    fig.tight_layout()
    
 
    return fig, ax

# チャートのプロット
candlechart(ticks_5T['2001-01-03 08:05:00':'2001-01-03 10:05:00'])

matplotlibにはfinance用のプロットmatplotlib.financeがあり、その中でローソク足をプロットする関数candlestick2_ohlcがあるので、そちらを利用します。
またそのままプロットすると休場の日曜日が空白になってしまいますので、営業日以外をスキップしてチャートに表示するようにしてあります。
結果はこちらです。

f:id:ukichang:20190330175819p:plain

これでローソク足がプロットできました。次回はあのアノマリを検証したいと思います。

参考

PythonのMatplotlib+Pandasで為替レートCSVからローソク足チャートを描いてみよう
Pythonでローソク足チャートの表示(matplotlib編) - Qiita
日付の加算 減算 timedelta | Python Snippets
pandasで時系列データのOHLC(四本値)を算出・ダウンサンプリング | note.nkmk.me
PythonでFXのヒストリカルデータ分析 導入編|crz33