過去の為替レートデータをPandasで読み込んでティックから1分へ変更してみた
みなさん、こんにちは。朝にAlexa君(アマゾンエコー)のニュース聴いてたら、桜が満開したとのことだったので、気分転換がてら、目黒川散策に出かけました。
目黒駅前からめっちゃカオスで…人混みに揉まれながら川沿いに着くも…そこにも人。人。人。これは桜を見にきたのか、人を見にきたのかわからない状況へ。
なんとか人混みの流れに沿って、やっとのこと川沿いを歩き出せましたが、人の多さで超トロトロ歩き。もういいやと、川沿いを歩き始めて20秒程度で横の細道にそれました。
平日、また行こう。とりあえず歩いて恵比寿まで行って、今日の勉強と作業を始めました。
【人気記事】
バックテスト用に過去の為替レートが必要
ってことで、本題に戻ります。昨日は投稿したAPIを使った超絶アホなシステムトレードをやりましたが、今日はバックテストについてちょっと考えていきたいなと。
そもそも、機械学習でモデルの訓練をするにも、さらに構築したモデルの評価をするにも、過去の期間のまとまった為替データが必要な訳です。
最新のデータはAPI経由でプライスのストリーミングをDBにぶち込んでいけば良さそうですが、過去のまとまったデータ(例えば2015年から3年分のティック)などは、APIじゃ作れません。
なので、今日は過去為替データで使えそうなものを探してみることにしました。
探したら結構出てくる過去為替データ
調べてみると思ったよりもありました。パッと見た感じ、下の三つのサイトがよく使われているようです。
ロシアのファイナンス系のポータルのサイトのようです。インターフェースがロシア語なのが難儀。海外系のサイトは母国語以外に大半のケースで英語で翻訳されているのに…どうやらそのオプションはなさそう。
Google翻訳先輩に訳してもらったところ、データは全て1分毎、扱っている通過数は12ペアのようです。一見、使い勝手が悪そうですが、なぜかこのサイトからデータを使っている人が海外ではよく見かけました。
このサイトも使われているのが多そうでした。調べてみるとスイスの銀行のようです。サイトを見る限り、ドル円はもちろんのこと、見た感じざっと30通貨ペア以上のデータがダウロード可能のようです。
また、データの期間も選べます。ティック単位でも可能ですし、1分、1日、1月など選択肢がありました。ただ厄介なのが、期間がティックと秒だと一日単位でしかデータが落とせなさそうです。1分以上の期間だと年月を指定して取得が可能ですが、2014年からのデータしかありません。
日本でもお馴染みの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のインポートから。
1 2 3 4 |
# Pandasをpdとしてインポート import pandas as pd |
次にCSVを read_csv で読み込みましょう。データを見ると最初の行がヘッダーになっているんですが、邪魔なので skiprows で飛ばして、カラムに名前をつけてあげます。タイムスタンプが RateDateTime として元データに入っているので、こちらを DateTime と名前を変えてあげて、さらにデータフレームの index へアサインします。
最後にhead()で読み込んだデータの最初の5行を表示して見ましょう。
1 2 3 4 5 6 7 |
# データの読み込み df = pd.read_csv('USD_JPY_Week2.csv', index_col='DateTime', names=['Tid', 'Dealable', 'Pair', 'DateTime', 'Buy', 'Sell'], skiprows=1) # データフレームの最初の5行を表示 df.head() |
DateTimeがミリセカンドまで入ってますね。TidやらPairやら不要な項目があるので、データフレームから落としてあげましょう。
1 2 3 4 5 6 7 8 9 |
# 今回使わない3カラムを削除 del df['Tid'] del df['Dealable'] del df['Pair'] # 念のため再度確認しておく df.head() |
これで、3月11日〜3月16日までのドル円の全ティックのBuyとSellのプライスのみとなりました。次は簡単なデータの確認を行いましょう。
1 2 3 4 |
# データフレームのサイズを確認 df.shape |
(327308, 2)
ドル円の一週間のティック数が約32.7万あるのですね。次はデータに欠損値(データが空の行)があるか確認しておきましょう。
1 2 3 4 |
# データの欠損を確認 df.isnull().sum() |
Buy 0
Sell 0
dtype: int64
どうやら欠損は無さそうですね。良かったです。データのソース元を探している時に、色々な記事で為替データは欠損が多い!マジでしんどい!フザケンナ!的な記事が多数あったので…ちょっと心配でしたが。Gain Capitalの今回のデータは少なくとも欠損なし。
ティックから1分へデータを変換
データの読み込み、必要最低限の初期確認が出来たので、次はこのティックのデータを1分間のデータへ変換して見ましょう。
前の処理でタイムスタンプを DateTime としてデータムレームの index として使っていますが、まずはこれを DateTime の型へ変換してあげましょう。じゃないと、期間など日付系の処理ができません。
1 2 3 4 |
# データフレームのインデックスをto_datetimeで変換 df.index = pd.to_datetime(df.index) |
現在、1行=1ティックのデータとなっています。これを1行=1分と変換してあげましょう。
1 2 3 4 5 6 7 |
# 1分間ごとのデータへ変換 grouped_data = df.resample('1Min', how='ohlc') # 最初の5行を表示 grouped_data.head() |
もう、ほんと、Pandasさまさまですね(笑)。最初の5行を表示させて見ましたが、しっかりティックから1分へデータがまとまっています。
まとめと次のステップ
とりあえず、今日は過去データの取得先の検討と、実際にデータを落として見て軽くいじってみました。実際にバックテスト用のデータを使うときは、この1000倍くらい面倒そうですが、ひとまずはGain Capitalのデータで進めたいと思います。
ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
まだ、コメントがありません