見出し画像

仮想通貨 1分足〈数年分〉の OHLC ヒストリカルを csv 取得する方法

バックテストをする際に必要なヒストリカルデータだが、1分足以下の OHLCで、長期間(数年分)のものは探すのが難しい。今回、その入手方法を発見したので共有しようと思う。本書を読むとできる事は以下になる。

(できること)
・ 1分足以下の仮想通貨 OHLC ヒストリカル を CSV 保存できる
・ 数年分単位で取得可能
・ ほぼ全てのメジャー取引所 & 全ての仮想通貨(アルトも含む)が対象
・ すべて無料(現時点では)
★ 実践される方は重要事項があるので、最後までお読みいただきたい。

OHLC ヒストリカルデータとは

用語を少し解説しておく。OHLC とは、通貨の Open、High、Low、Close の頭文字を取ったもので「始値・高値・安値・終値」の事である。その時系列データをヒストリカル・データと呼ぶ。取引高 (Volume) を入れて「OHLCV」とすることもある。

1分足は使い勝手が良い

1分足は加工がしやすい。1分足の OHLC があれば、そこから10分足、1時間足、日足、と何でも生成できる。より詳細な検証も可能にしてくれる。

1分足で長期間は入手が困難

現在、OHLC の入手には、Cryptowatch 一択だと思うが、実は1分足でさかのぼれるのは3日程度である。「1分足以下」で「長期間」というのは殆ど出回っていないのが現状である。


coinapi で 1分足 OHLC をゲットする

さっそく本題に入ろう。ヒストリカルデータは coinapi からゲットできる。実は、以前ツイッターでも紹介した、注目の API 業者だ。 とにかく取り扱う業者が豊富で API も優秀である。しかも蓄積データが半端じゃない。


OHLC 取得の流れ

ヒストリカルデータの入手は、以下の手順で行う。

1. 無料のアカウント作成 → API キーを取得する
2. 業者の id を調べる(exchange_id)
3. 通貨ペアの id を調べる(symbol_id)
4. HTTP で REST データで取得 → ローカル保存(リミット制限あり)


1. 無料で API キー を取得する

ご覧の通り、coinapi は「無料枠」がある。とりあえず「GET A FREE API KEY」から、メールアドレスを登録し、API キーを入手しよう。


2. 業者の id を調べる

以下の URL をたたくと、取扱業者のステータス一覧が現れる。OHLC を取得したい業者の exchange_id をメモっておく。

https://rest.coinapi.io/v1/exchanges


3. 通貨ペアの id を調べる

次に、SDK をゲットする。以下の URL からサンプルコードをゲットし「python-rest」の中から、以下の2ファイルを取り出す。

coinapi SDK

https://github.com/coinapi/coinapi-sdk

Python ファイルで必要なもの
・examples.py
・coinapi_v1.py

examples.py に例があるので分かる人はそれを参照。面倒な人は、以下をコピペして、hoge.py (名前は自由) として保存し実行する。xxxxx は自分の API キー、wwwwwww のところは、さっきメモした exchange_id に変更する

from coinapi_v1 import CoinAPIv1
import datetime

test_key = 'xxxxxxxxxxxxxxxxxxxxxxxxx'

api = CoinAPIv1(test_key)
exchanges = api.metadata_list_exchanges()

symbols = api.metadata_list_symbols()
print('Symbols')
for symbol in symbols:
   #if(symbol['exchange_id']=="BITFINEX"): <= 例 BITFINEX を指定した場合
   if(symbol['exchange_id']=="wwwwwww"):
       print('Symbol ID: %s' % symbol['symbol_id'])

実行結果

ずらっと出てくる。この業者で入手可能な通貨ペア一覧だ。大体一番上がメインの通貨ペア。この場合 BTC/USD の symbol_id「BITFINEX_SPOT_BTC_USD」だというのがこれでわかった。次はいよいよ OHLC の取得。


4. OHLC の取得 / 保存

OHLC の取得は、HTTP でアクセスする。これもリファレンス通りやればOK面倒な人は、下のサンプルをコピペする。
注意点としては、アクセス制限があること。無料枠の場合、リクエストは1日100回まで。HTTP のリミットは1回あたり 10万 まで。ただし1万を超えるとBANになるので、地道に落としていくしか無い。

1. API キーを変更する XXXXXXXXXX の箇所

2. 日付を指定する
 例:2014年 11 月 1日 からのデータが欲しい場合は以下のようにする
 start_of = datetime.date(2014, 11, 1).isoformat()

3. さっきメモった symbol_id を変更する。zzzzzzzzzzz の箇所。
 例:ohlcv_historical = api.ohlcv_historical_data('BITFINEX_SPOT_BTC_USD', {'period_id': '1MIN', 'time_start': start_of, 'limit': 10000})

4. ファイル名を変更する(任意)

もし1分足以下を入手したいなら、api.ohlcv_historical_data のパラメーターである period_id を 1MIN ではなく、30SEC とかに変えればOKだ。以下参照(API仕様より


以下がサンプルコード。もしこの note が気に入ったら ツイッター  @mirr_manフォロー & RT リツイート!お願いします。


(HTTP アクセス → 保存するコード)

# coding: utf-8
import requests,time, datetime, calendar, os, sys
import urllib.request
import json
from coinapi_v1 import CoinAPIv1
 #ご自分のAPIキーに差し替え
test_key = 'xxxxxxxxxxxxxxxxx'

api = CoinAPIv1(test_key)
exchanges = api.metadata_list_exchanges()

def write(path, fileName, filemode, Msg):
   
   try:
       path = os.path.join(path, fileName)
       with open(path, mode=filemode, encoding="utf-8") as f:
           f.write(Msg)
       
   except Exception as e:
       print(str(TimeCurrent()), " Exception => Output Write: ", fileName, str(e))

def writeFile(res, path, file_Name):
   
   try:
       for i in range(len(res)):

           timeVal = res[i]['time_period_start']
           timestmp = timeRegex(timeVal)

           _O = res[i]['price_open']
           _H = res[i]['price_high']
           _L = res[i]['price_low']
           _C = res[i]['price_close']

           val = "{0};{1};{2};{3};{4}{5}".format(timestmp, str(_O), str(_H), str(_L), str(_C), "\n")

           write(path, file_Name, "a", val)
           
       print(str(TimeCurrent()), "作業中")
       
   except Exception as e:
       print("Exception => writeFile: " + str(e))

def timeRegex(timeVal):
   import re
   regex_1 = r'\d\d\d\d-\d\d-\d\d.\d\d:\d\d:\d\d'

   try:
       p1 = re.compile(regex_1)
       text = timeVal
       m1 = p1.match(text)
       src = m1.group()
       dst = src.replace('T', ' ')
       return dst

   except Exception as e:
       print("Exception => timeRegex: " + str(e))
       return "0000-00-00 00:00:00"

def TimeCurrent():
   now = datetime.datetime.now()
   return now

if __name__ == '__main__':

   #日付を指定する
   start_of = datetime.date(2014, 11, 17).isoformat()
   #例
   #ohlcv_historical = api.ohlcv_historical_data('BITFINEX_SPOT_BTC_USD', {'period_id': '1MIN', 'time_start': start_of, 'limit': 10000})
   
   ohlcv_historical = api.ohlcv_historical_data('ZZZZZZZZZZZ', {'period_id': '1MIN', 'time_start': start_of, 'limit': 10000})
   print("len: ", len(ohlcv_historical))
   
   #保存
   PATH = "./"
   FILE_NAME = "HistData_1.csv" #ファイル名
   
   writeFile(ohlcv_historical, PATH, FILE_NAME)

   print(str(TimeCurrent()), "作業完了")

一度、10万 リミットでアクセスしてみた。すると3ヶ月分くらいのデータが一気に落とせた。しかし一瞬で BAN になり数時間は使えなくなった。その後 5万で試したが、それも一瞬にして BAN。半日使えなくなった。おそらく無料でこれを繰り返したら、id ごと BAN になっていたかもしれない。結果として1万リミットで安定するようになった。数分の間隔をあけながら落としていくのがベストである。

実行結果


●API 仕様は以下を参照


重要事項

ヒストリカルデータの取扱は要注意。個人で利用する範囲での使用は大丈夫かと思われる。ただしコピーライトもあるので、データの二次利用や商用利用は著作権上、NG なはず。どこかにデータとしてアップするのも論外。ただし法人提携の相談はできるみたいなので何か大規模で行ったり商用利用したい場合はお問い合わせされると良いでしょう。

「投げ銭」感覚で有料にしました、もしよけれご購入ください。ただしこれ以上の情報は下にはありませんのでご了承ください。

※本内容について、サポートなどは特に行っておりません。

この続きをみるには

この続き: 14文字 / 画像1枚

仮想通貨 1分足〈数年分〉の OHLC ヒストリカルを csv 取得する方法

ミラーマン

980円

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
93

こちらでもピックアップされています

仮想通貨
仮想通貨
  • 192本
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。