過去の為替レートデータをPandasで読み込んでティックから1分へ変更してみた

2018年6月27日

使っているFX会社はどこ?
自動売買用(1万円キャッシュバック中) → インヴァスト証券
Python API用(FX APIはここしかない) → OANDA ジャパン

みなさん、こんにちは。朝にAlexa君(アマゾンエコー)のニュース聴いてたら、桜が満開したとのことだったので、気分転換がてら、目黒川散策に出かけました。

目黒駅前からめっちゃカオスで…人混みに揉まれながら川沿いに着くも…そこにも人。人。人。これは桜を見にきたのか、人を見にきたのかわからない状況へ。

なんとか人混みの流れに沿って、やっとのこと川沿いを歩き出せましたが、人の多さで超トロトロ歩き。もういいやと、川沿いを歩き始めて20秒程度で横の細道にそれました。

平日、また行こう。とりあえず歩いて恵比寿まで行って、今日の勉強と作業を始めました。

【人気記事】

私の機械学習の開発環境&トレード環境を解説

バックテスト用に過去の為替レートが必要

ってことで、本題に戻ります。昨日は投稿したAPIを使った超絶アホなシステムトレードをやりましたが、今日はバックテストについてちょっと考えていきたいなと。

そもそも、機械学習でモデルの訓練をするにも、さらに構築したモデルの評価をするにも、過去の期間のまとまった為替データが必要な訳です。

最新のデータはAPI経由でプライスのストリーミングをDBにぶち込んでいけば良さそうですが、過去のまとまったデータ(例えば2015年から3年分のティック)などは、APIじゃ作れません。

なので、今日は過去為替データで使えそうなものを探してみることにしました。

探したら結構出てくる過去為替データ

調べてみると思ったよりもありました。パッと見た感じ、下の三つのサイトがよく使われているようです。

Finam

ロシアのファイナンス系のポータルのサイトのようです。インターフェースがロシア語なのが難儀。海外系のサイトは母国語以外に大半のケースで英語で翻訳されているのに…どうやらそのオプションはなさそう。

Google翻訳先輩に訳してもらったところ、データは全て1分毎、扱っている通過数は12ペアのようです。一見、使い勝手が悪そうですが、なぜかこのサイトからデータを使っている人が海外ではよく見かけました。

Duskacopy

このサイトも使われているのが多そうでした。調べてみるとスイスの銀行のようです。サイトを見る限り、ドル円はもちろんのこと、見た感じざっと30通貨ペア以上のデータがダウロード可能のようです。

また、データの期間も選べます。ティック単位でも可能ですし、1分、1日、1月など選択肢がありました。ただ厄介なのが、期間がティックと秒だと一日単位でしかデータが落とせなさそうです。1分以上の期間だと年月を指定して取得が可能ですが、2014年からのデータしかありません。

GAIN Capital

日本でもお馴染みのforex.comのゲインキャピタルのデータもダウンロードが可能です。こちらですが、データは全てティック、過去2000年から2018年現在に至るまでのデータを公開しています。

調べて見たら、2000年〜2002年のデータはドル円を含む3通貨しかカバーしていませんでした。2003年からは通貨数も徐々に増えています。またデータは1ファイル=1週間の通貨別でダウロードしなくてはいけません。

使うのはGain Capitalのデータが良さそう

ってことで、以下の理由から私はGain Capitalのデータを使いたいと思います。

  • 会員登録などが必要なくURL叩くだけでダウロードが可能
  • 最小単位のティックなのが◎
  • 通貨数も主要通貨をカバーしている
  • 世界的に有名なゲインキャピタルなのでデータも少し安心(完全主観)

後半に連れて、個人的主観がめっちゃ入りましたが、まぁでも他の二つのソースよりかは扱いやすそうなのは間違いなさそうです。

データを落として触ってみよう

早速、Gain Capitalからデータをダウロードしてちょっといじってみようかと。とりあえず、やって見ることは下記。

  • データ落としてPandasで読み込む
  • ティックから1分データへ変換

先述した通り1週間毎の通貨ペア別データなので、とりあえずは2018年3月2週目のドル円のデータで試して見たいと思います。

まずはダウンロード。下のURLから USD_JPY_Week2.zip を探してダウロードしました。データのサイズは約2.4MB。思ったよりも小さい。ZIP形式で落とせるので、解凍して作業のディレクトリーへ移動。ちなみにファイルはCSVでした。

http://ratedata.gaincapital.com/2018/03%20March/

PandasでCSVファイルを読み込み

Pandasですが、大規模なデータを高速にいじれるPythonのライブラリです。機械学習では必須と行っても過言じゃないライブラリです。ダウロードしたCSVファイルをPandasのデータフレーム形式で読み込みましょう。

まずはPandasのインポートから。

次にCSVを read_csv で読み込みましょう。データを見ると最初の行がヘッダーになっているんですが、邪魔なので skiprows で飛ばして、カラムに名前をつけてあげます。タイムスタンプが RateDateTime として元データに入っているので、こちらを DateTime と名前を変えてあげて、さらにデータフレームの index へアサインします。

最後にhead()で読み込んだデータの最初の5行を表示して見ましょう。

DateTimeがミリセカンドまで入ってますね。TidやらPairやら不要な項目があるので、データフレームから落としてあげましょう。

これで、3月11日〜3月16日までのドル円の全ティックのBuyとSellのプライスのみとなりました。次は簡単なデータの確認を行いましょう。

(327308, 2)

ドル円の一週間のティック数が約32.7万あるのですね。次はデータに欠損値(データが空の行)があるか確認しておきましょう。

Buy 0
Sell 0
dtype: int64

どうやら欠損は無さそうですね。良かったです。データのソース元を探している時に、色々な記事で為替データは欠損が多い!マジでしんどい!フザケンナ!的な記事が多数あったので…ちょっと心配でしたが。Gain Capitalの今回のデータは少なくとも欠損なし。

ティックから1分へデータを変換

データの読み込み、必要最低限の初期確認が出来たので、次はこのティックのデータを1分間のデータへ変換して見ましょう。

前の処理でタイムスタンプを DateTime としてデータムレームの index として使っていますが、まずはこれを DateTime の型へ変換してあげましょう。じゃないと、期間など日付系の処理ができません。

現在、1行=1ティックのデータとなっています。これを1行=1分と変換してあげましょう。

もう、ほんと、Pandasさまさまですね(笑)。最初の5行を表示させて見ましたが、しっかりティックから1分へデータがまとまっています。

まとめと次のステップ

とりあえず、今日は過去データの取得先の検討と、実際にデータを落として見て軽くいじってみました。実際にバックテスト用のデータを使うときは、この1000倍くらい面倒そうですが、ひとまずはGain Capitalのデータで進めたいと思います。

ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!

使っているFX会社はどこ?
自動売買用(1万円キャッシュバック中) → インヴァスト証券
Python API用(FX APIはここしかない) → OANDA ジャパン

2018年6月27日FX 機械学習

Posted by algon