仮想通貨(ビットコイン)がトレード商品として画期的なのは、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に設定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | importsys importcsv importdatetime ##設定値 #元データの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 forrowinf: if(datetime.datetime.fromtimestamp(int(row[0]))<kijyun_date+kizami_date): ifpriceH==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: ifpriceT<int(row[1].replace('.000000000000','')): priceT=int(row[1].replace('.000000000000','')) ifpriceY>int(row[1].replace('.000000000000','')): priceY=int(row[1].replace('.000000000000','')) else: ifpriceH>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') forjinrange(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やサービスってないからね)。。
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ゴリゴリ書いてます。


