marcy's Lab

理系大学生のブログ

仮想通貨の自動売買システムを作ってみる その1 ~Bitcoinの5分足データを集める~

はじめに

最近、急に仮想通貨の自動売買システム作って一生遊んで暮らしたいなという気持ちが湧いてきました。ほんと急にです。

仮想通貨については、ちょうど一年前くらいに興味を持ったものの当時は未成年だったので成人したら手を出そうと思ってました。

それでその半年後くらいに仮想通貨のバブルがはじけて、NEM流出事件が起きて、成人する前には完全に興味が薄れてました。

でも最近、多分バイトを再開したあたりからですかね。

働きたくないなあと思って、株やFX、仮想通貨の自動売買システムについて調べ始めました。

仮想通貨の取引所はAPIを用意してくれてたんで、仮想通貨に決めました。

取引所もいろいろある中で、Zaifを選びました。理由は特にないです。

口座開設をついこの前数日前に完了したところです。

ブームも過ぎたのか、口座開設には全然時間かかりませんでした。

他の取引所(bitFlyerとか)が良さそうだったらそっちも口座開設することにします。

ということで、APIもあるし機械学習走らせて、ゴリゴリ自動売買していくぞ!

と思ったら肝心のデータがなかったんですよね。

どれくらいのデータがいるのかよくわかってないので、いろんなデータで試していくぜと思ってたんですけど、Zaif公式からは日足のデータしか配布されてません。

データ量的に、1分足、5分足のデータなら一年分あれば、充分かなと思ってたんですけど、それすらもなかなか落ちないんです。

探したら、一年分程度の生の取引データが落ちていたので、この取引データから5分足データを作っていくことにします。

実装

データをダウンロード

データは↓のzaifJPY.csv.gzをダウンロードしました。

bitcoincharts.com

このファイル、解凍してみると2.5GBありました。

中身を確認しようと思ったんですけど当然Excelじゃ開けませんし、その他手持ちのテキストエディタでも開けません。

Pythonで開いてみると、58,000,000行超あることが確認できました。

Pythonで開くにしても180秒ほどかかるし、開発環境のSpyderもフリーズします。

メモリは5GBも使ってます。

まともに作業できたもんじゃないですよ。

とりあえず、それぞれ500,000行のファイルに分割します。

import pandas as pd

dtyp = {'time': 'int32', 'price':'int32', 'amount': 'float32'}
btc = pd.read_csv("data/zaifJPY.csv", names=("time", "price", "amount"), dtype=dtyp)

a = range(0, len(btc.index) + 500000, 500000)

for i in range(len(a)-1):
    btc[a[i]:a[i+1]].to_csv("data/zaifJPY-" + str(i) + ".csv")
    print(i)

これで117個のファイルができました。

分けすぎですかね?まあ適当です。

5分足のデータにする

取引データから5分足のデータにする処理がけっこう難しいんじゃないかと、プログラム書く前からちょっと憂鬱だったんですけど、Pandasで一発でした。

Pandasのすごさに感動した勢いでこの記事書いてるといっても過言ではないです。

import pandas as pd

csv = pd.DataFrame()

for i in range(117):
    btc = pd.read_csv("data/zaifJPY-" + str(i) + ".csv", index_col=0, parse_dates=True)
    
    #時間をインデックスに指定
    btc.set_index('time', inplace=True)
    
    #UnixTimeを日本時間に変換
    btc.index = pd.to_datetime(btc.index, unit='s')
    btc.index = btc.index.tz_localize('UTC').tz_convert('Asia/Tokyo')

    #5分でリサンプリングして、終値をとる
    btc = btc.resample('5T').last()
    csv = pd.concat([csv, btc])
    print(i)

csv.to_csv("data/5min/zaifJPY5min.csv")
print("done!")

なんとpandasを使えば一行で、5分毎のリサンプリングをしてくれます。

しかも、last()の部分を変えることで、平均や中央値、始値などを取る事も出来ます。

Pandasには頭が上がりません。

おわりに

これで約一年分の5分足データが揃いました。

これからRNNらへんを使って、予測するプログラムを作っていきたいと思います。

ちなみに続きそうな記事のタイトルしてますが、続くかはわかりません。

それではまた今度。