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

概要

・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

為替秒足データ作成

概要

・いわゆる前処理
・TrueFX(参考1)にて公開されているミリ秒単位のクオートをもとに秒足データに加工する

NYSOLを使うまで

そもそもなんでNYSOLなのかといいますと、とてもcsvの処理が早いらしい(参考3)
しかもTrueFXからダウンロードできるcsvファイルが月別に1つのファイルにまとめてありエクセルではもはや開けない代物
というわけで実験がてらNYSOLを試してみることに。

で、

NYSOLはなんとまさかのUNIX環境のみの提供だったのでWindowsでは動かない。
Cygwin環境ならインストールできるかなとも思ったりしましたが

屋上へ行こうぜ…キレちまったよ…という感じだったので大人しくLinux環境(今回はUbuntu)を整えるの巻
今回はVMware Playerを使って仮想マシンをセットアップしました。詳しくは参考サイト4を参照ということで。

NYSOLのサイトにはUbuntu 12.04まで動作確認されていると書いてありますが、私の環境(14.04)でも特に問題なく動いています。

コード

シェルスクリプトにまとめています。
やっている内容としては、1行目でTrueFXからダウンロードしてきた対象csvを指定し、秒毎に終値を取得して秒足チャートとしています。
4本値はめんどくさくて取ってないよ。
私の環境では今回のファイル(147万行ほど)の処理に5秒ほどですね。速度は比較してないのです。速さはどうなんですかね、ようしらんけど。

1箇所ハマった点としては、TrueFXからダウンロードできるcsvの改行コードはCRLFである一方、nysolで対応しているのはLFのみ。
1行目でNYSOLが処理できるようにcsvの改行コードを修正しています。

また、NYSOLは秒単位までにしか対応していないので、日時と時間をパースしたりらじばんだりというのが2行目以降。
9行目で欲しい項目だけを選択してoutput.csvに吐き出しています。

結果

ということでめでたく秒足のbidサイドをまとめることができましたというお話でした。

Image

感想

NYSOLは各処理のアウトプットをパイプ(縦棒記号 |)でつなげてチェーンすることができるので文法が分かってくるとやりやすいですね。
ただ一方で純和製ソフトなのか知名度が低いのかよく分かりませんが公式サイト以外にネット上に文章が無いのが調べにくいですね。

ちなみになんでこんなことをやってるかというと、秒単位のデータはリバーサルが効きやすいというのを聞いたからです(参考5)
さらにちなむと、この動画ではマイクロ秒ではモメンタムが効きやすいって話もしていますので、誰か分析はよ!という感じですね。

ついでにちなむとTrueFXというサイトを知ったのは参考6の書籍からでした^^

参考

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

NYSOL
http://www.nysol.jp/

#TokyoR 39 高速に前処理するNYSOL
http://www.slideshare.net/SatoshiKitajima2/nysol-tokyor39

Ubuntuで作業環境を整えよう
http://www.aise.ics.saitama-u.ac.jp/~gotoh/HowToUbuntu.html

Algorithmic Trading and Machine Learning | TechTalks.tv
http://techtalks.tv/talks/algorithmic-trading-and-machine-learning/60847/

Amazon.co.jp: 金融データ解析の基礎 (シリーズ Useful R 8): 高柳 慎一, 井口 亮, 水木 栄, 金 明哲: 本
http://www.amazon.co.jp/dp/4320123719