仮想通貨(ビットコイン)がトレード商品として画期的なのは、API経由で簡単に自動売買できるところ。
仮想通貨の魅力とはなんでしょう?バカみたいな値上がり?ブロックチェーンの将来性?
まあ、それもあるでしょうけど、投機・トレードやマネーゲームの商品としてみたときに、一番画期的だと思うのは取引所が標準でAPIを公開している点だと私は思います。
だいたいの取引所は公開してますよね。例えばZaifだと、↓こんなやつ。
これは革命的!。従来の株式・先物・FXなどの投資商品では証券会社とかがAPIを公開しているケースは非常にレアでした。なので、自動売買するには色々と工夫が必要だったわけです。
一方、仮想通貨業界はAPIが標準装備。bitFlyerなんてwrapper(pybitflyerというライブラリ)も用意されてるので、Pythonならpip installだけですぐに簡単に自動売買システムの開発が始められちゃう。
トレード判断、発注・決済、ロスカット、資金管理、リスク管理、失敗したときのオートリバランスから、アービトラージ、スクレイピングで取得したチャート以外の要素による投資判断、AIの組み込みですら、Python一本で完全自動化できるということです。
「画面操縦での自動発注じゃ限界があるよ…」とか「Meta Trader 4 + EAで自動売買始めたけど、クソEA掴まされた!」とか「FXのAPIって結局OANDAしか選択肢ないの?」とか「APIあると思ったら法人口座だけじゃねえか!」みたいなものに悩まされる時代は終わったんです。
つまり、これからは、難しいこと抜きに、Pythonとかでプログラム書ける人なら「誰でも」「無料で」「簡単に」「自分だけのロジックで」自動売買が始められる時代になったわけです。
だがしかし。。。問題点がないわけではありません。。。
ビットコイン(BTCJPY)の5分足や15分足の過去価格CSVデータ(4本値)が入手できないんですよ!バックテストができないよ~!!w
ネットを探し回ったんだけど、落ちてないんだよね・・・。
「仮想通貨の過去のヒストリカルデータ(分足)入手できなくね?」。仕方ないから素の取引売買データからPythonで分足四本値をセルフ集計してみた。
一応、こちらの良サイトでCSVがゲットできるのですが、日足は充分な期間が取れるんですが、5分足とかだと非常に短い期間のデータしか取れなかったり。
仮想通貨(暗号通貨)4本値CSVゲッター from Cryptowatch(サイトが消えました・・・
一方、こちらは過去分もたんまりデータがあるんですけど、素の取引売買データで使いにくかったり(しかも時間はUNIXTIMEですw)。
bitcoincharts.com(サイトが消えました・・・)
どっかにあるのかもしれないが探し回るのも時間の無駄なので、苦肉の策で、上述の素の取引データから分足4本値をPythonでセルフ集計してみました。5分毎に区切ってけば、四本値っぽい何かになるだろう…。
やってることは簡単です。bitcoincharts.comでダウンロードしてきた素の取引データ(CSV)を読み込んで、UNIXTIMEを時間に変換して、区切り時間毎に4本値を作りこんでいます。
5分足なら「minutes=5」をtimedeltaに設定。
import sys import csv import datetime ##設定値 #元データのCSVファイル名 ※元データのCSVファイルは「https://api.bitcoincharts.com/v1/csv/」で取得できます input_file_name = "data.csv" #作成する4本値のCSVファイル名 output_file_name = "data_out.csv" #集計を開始する日付+時刻 kijyun_date = datetime.datetime.strptime('20170704 17:15:00', '%Y%m%d %H:%M:%S') #分足の単位。例えば5分足なら「minutes=5」 kizami_date = datetime.timedelta(minutes=5) #CSV読み込み csv_file = open(input_file_name, "r", encoding="ms932", errors="", newline="" ) f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True) #4本値を計算 datalist = [] priceH = 0 priceT = 0 priceY = 0 priceO = 0 for row in f: if (datetime.datetime.fromtimestamp(int(row[0])) < kijyun_date + kizami_date): if priceH == 0: priceH = int(row[1].replace('.000000000000','')) priceT = int(row[1].replace('.000000000000','')) priceY = int(row[1].replace('.000000000000','')) priceO = int(row[1].replace('.000000000000','')) else: if priceT < int(row[1].replace('.000000000000','')): priceT = int(row[1].replace('.000000000000','')) if priceY > int(row[1].replace('.000000000000','')): priceY = int(row[1].replace('.000000000000','')) else: if priceH > 0: priceO = int(row[1].replace('.000000000000','')) datalist_new = '{0:%Y%m%d %H:%M:%S}'.format(kijyun_date + kizami_date), priceH, priceT, priceY, priceO datalist.append(datalist_new) kijyun_date = kijyun_date + kizami_date priceH = 0 priceT = 0 priceY = 0 priceO = 0 #CSVファイルに出力する csv_file = open(output_file_name, 'w', encoding='UTF-8') csv_writer = csv.writer(csv_file, lineterminator='\n') for j in range(len(datalist)): csv_writer.writerow(datalist[j]) csv_file.close()
bitcoincharts.comのデータなら、どの取引所のどの通貨でも、だいたい同じ方法で4本値を生成できるはず^^。
「.000000000000」置換のところは手抜きコーディングなんで、他のデータでは通用しないと思うので、ビットコイン以外の場合は修正してから使ってねw。
あと、流してから気が付いたが、データがない時間帯に「0,0,0,0」が入っちゃう不具合がありました…( ノД`)。気になる人は自分で直してください。
【2022/04/30追記】
bitcoincharts.comのサイトが消えましたね・・・。というわけで、今後はデータは自炊していくしかないかと(海外取引所含めて、過去データが昔まで全部取れる取引所APIやサービスってないからね)。。
【2023/12/26追記】
「仮想通貨(暗号通貨)4本値CSVゲッター from Cryptowatch」も別のサイトになっちゃった模様です。
というか、どこかのサービスに依存すると結局こうなるわけで、自炊データが一番確実だよね。皆さん、自炊!データは自炊するぞ~!!!笑
bitFlyer・coincheckのBTC/JPYの5分足・15分足(4本値)の過去CSVデータのダウンロードはコチラ!
同じ悩みを抱えている人がいるかもなので、一応CSVファイルを公開しておきます(coincheckはもっと昔のもあるけど、容量が大きくなるので、とりあえず8か月分)。
分足四本値ダウンロード
bitFlyer BTC/JPY 5分足(2017/07/06~2018/03/04)
bitFlyer BTC/JPY 15分足(2017/07/06~2018/03/04)
coincheck BTC/JPY 5分足(2017/07/06~2018/03/04)
coincheck BTC/JPY 15分足(2017/07/06~2018/03/04)
ただ、まあ、間違ってるかもなので参考程度で(このデータで検証したロジックで投資に失敗しても知らないよ?w自己責任で!w)。
なぜか全体的に実際よりも少し価格が低いみたいですね・・・。集計が何かおかしいのか、時差とかのせいなのか、海外のデータだからドル/円の関係なのか原因は不明。まあ、仮置きのバックテストくらいには使えるのではないかと。
急がない人は、ちゃんとしたデータはCryptowatchのAPIとかでMySQLとかにコツコツと貯めていくのが良いと思います。私はデータ収集も完全自動化してます~。
あと、自動売買する人は複数の仮想通貨取引所・複数通貨FXを併用するのをオススメします。以下で書きましたけど、仮想通貨FX向きの取引所も結構ありますし。
仮想通貨自動売買の最大の弱点は取引所リスクです。証拠金は取引所に置かないといけないので、GOXするとぶっ飛びますからね。複数の取引所・複数の通貨で分散自動実行+こまめに出金しておかないと、危ないかもですよ…。
こんなのも
こんな記事もあるよ。pythonゴリゴリ書いてます。