為替高頻度データから任意のロウソク足チャートの作成

概要

・TrueFXにて公開されているミリ秒単位のクオートをもとに秒足データに加工する
・Pandasを用いて任意の間隔(今回は5秒間隔)のOHLCデータにリサンプリング
・matplotlibでロウソク足チャートを描画する

nysol前処理

為替データに関しては参考サイト1からダウンロード可能。
nysolは2.0を使用。

TrueFXのサイトからダウンロードできるデータは月次でcsvにまとまっているので、とりあえず日次に分解して個別ファイルに保存するようにしています。
私はこれをparseFxData.shというシェルスクリプトとして保存しています。

対象ファイルは2014年8月(古くてすみません)としています。適当に実行するとdailyというディレクトリが作成され、その中に各ファイルが生成されます。

150104_1

各csvのフォーマットは
USDJPY, yyyymmdd, yyyymmdd hh:mm:ss:sss, bid, ask
という感じになっています。
sssはミリセカンドです。どうでもいいですが、ミリセカンドってこういう場合どうやって記述するんですかね。

pandasリサンプリングとロウソク足チャートの描画

pandasにはデータフレームを任意の時間間隔でリサンプリングしてくれるメソッドがあります。(参考2)
が、ドキュメントには「これだけ書いとけばあとは分かるだろ」と非常に簡素なやっつけ仕様になっています。

11行目でread_csvを使用しcsvを読み込むまでは良いのですが、ロウソク足チャートを使用するためには時刻データをDatetimeIndex形式に変更しなければなりません。
が、この処理が非常に重いです。なので既に変数dfが定義されている場合にはその処理を割愛するようにtry exceptを使っています。
また、コメントにも書いてありますが、DataFrameのdtypeはfloatに指定しないと後々エラーになります(にっこり

22行目がリサンプリングを行なっているところになります。2014年8月1日の時刻が10時(つまり10時0分0.000秒から10時59分59.999秒まで)を対象に、ohlc形式でリサンプリングを行ないます。
脱線ですが、このhowの部分はfirst, last, min, max, sumなど基本的なものには対応しています。
closed=“right”で各バケットの右境界を含むようにしています。
label=“right”で、各バケットのindexとして、右境界の時刻が使用されます。(ex.0秒〜5秒のデータを対象とした四本値が5秒としてインデックスされる。closeが5秒なので個人的にはこっちのほうが読みやすい)
fill_method=“ffill”で、NAとなる部分は、最も最近の値で埋めます。こうすることで値動きが無い部分に関してはグラフが直線になります。

さらに23行目でインデックスに使用した時刻データを別個のカラムとして追加しています。
調べた範囲ではなぜかこうしないと後のロウソク足チャートに時刻データを渡すことが出来ませんでした。

26行目以降はmatplotlibで描画する方法。
ロウソク足のロウソクの部分の幅を力技で指定しています。どうやらこのwidthは単位がdayのようなので、5秒をday換算したのち、見やすくするために少し調整(candleBoxAdj)を行なっています。

で、でてきたものがこちら

150104_2

もう少し調整が必要な気もするが、まあとりあえず今日はこのへんで

参考

TrueFX — Tick-By-Tick Real-Time And Historical Market Rates, Clean, Aggregated, Dealer Prices
https://www.truefx.com/?page=frontpage

pandas.DataFrame.resample — pandas 0.15.2 documentation
http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.resample.html