本ページはプロモーションが含まれています。

Python

【Python】CryptowatchのAPIを叩いて仮想通貨(暗号資産)のヒストリカルデータを取得

こんにちは、hokkyokunです。

仮想通貨 × Pythonで
資産形成とプログラミングの学習を一挙両得していこうと思います。

Cryptowatchという
仮想通貨の取引所ごとのデータをまとめてくれているウェブサイトを利用し、
データを取得していこうと思います。

APIが提供されており、
制限ありですが、無料で使えます。

10クレジットが配布され、24時間立つと回復します。
リクエストをするたびに少しずつ(0.1とか)消費され、
クレジットがなくなると24時間立たないと情報が取得できません。

取引所のデータを取得

CryptoWatchでは複数の取引所のデータを取得できます。

取引所ごとのデータをとるためにも
まずはどんな取引所があるのかデータをとってみましょう。

def get_exchanges():
    
    url="https://api.cryptowat.ch/exchanges"
    res = requests.get(url).json()
    results=res["result"]
    symbols=[]
    for result in results:
        symbols.append(result["symbol"])
    print(symbols)
    return symbols

 

こんな感じでした。

 

取引所ごとに微妙に価格は異なるようですし、
これで取得した取引所ごとに過去データ(ヒストリカルデータ)をとっていきます。

BitFlyer取り扱いの銘柄のデータを取得

取得した取引所のデータを活用して
取引所ごとのデータを取得してみます。

データとしては私がメインで活用している
BitFlyerの取り扱い銘柄のデータを取得してみます。

BitFlyerで購入できる通貨ペアは以下の通りです。

ティッカー 名称
BTC-JPY ビットコイン
ETH-JPY イーサリアム
XRP-JPY リップル
FLR-IPY フレア
ZPG-JPY ジパングコイン
MATIC-JPY ポリゴン
MKR-JPY メイカー
XYM-JPY シンボル
LINK-JPY チェーンリンク
DOT-JPY ポルカドット
XTZ-JPY テゾス
XLM-JPY ステラルーメン
XEM-JPY ネム
BAT-JPY ベーシックアテンショントークン
ETC-JPY イーサリアムクラシック
LTC-JPY ライトコイン
BCH-JPY ビットコインキャッシュ
MONA-JPY モナコイン
LSK-JPY リスク
#IDs:通貨ペアのティッカー(例:BTC-JPY)
#exchange:取引所のシンボル

def get_datas(IDs,exchange):
    IS_datas=[]
    len_datas=[]
    first_days=[]

    for ID in IDs:
        #IDをrequestできるように編集(BTC-JPY ⇒ btcjpy)
        convert_ID=ID.replace("-","").lower()

        #過去データを取得
        #ohlc:始値、高値、低値、終値を取得できる
        #after:unixで時間を指定し、その時間~現在までの価格を取得
        #periods:時間間隔、今回は一日毎のデータが欲しいので60秒×60分×24時間=86400
        url= f"https://api.cryptowat.ch/markets/{exchange}/{convert_ID}/ohlc?periods=86400&after=0"
        columns = ["Date","Open","High","Low","Close","Volume","QuoteVolume"]

        res = requests.get(url).json()
    
        try:
            df = pd.DataFrame(res['result']['86400'], columns=columns)
            df["Date"]=[datetime.datetime.fromtimestamp(dt) for dt in df["Date"]]
            print(res["allowance"])
            IS_datas.append(1)  # データ取得に成功したら1、失敗したら0
            len_datas.append(len(df)) # データ量を取得
            first_days.append(df.loc[0,"Date"]) # データの開始日を取得

            #データフレームにして価格データを格納
            file_dir=f"../30_datas/10_temporarily_saved/{exchange}"
            if not os.path.isdir(file_dir):
                os.makedirs(file_dir)
            df.to_csv(file_dir + f"/{ID}_{exchange}.csv")
        
        except:
            print(ID,"データが取得できません")
            print(res["allowance"])
            IS_datas.append(0)
            len_datas.append(0)
            first_days.append("-")
    
    return [IS_datas,len_datas,first_days]

 

試しに取引所:Bitflyerで通貨ペア:BTC-JPYを取得してみます。
取得したデータはこんな感じでした。

ちなみに私が作った関数でデータのあるなしなどを同時に探っています。
こんな感じでした。

IS_datas : 1 (1なのでデータあり。当たり前)
len_datas : 2265 (データ量)
first_days : 2015/6/26 9:00:00(データの開始日)

取引所によって、取得できるデータが異なる

さて、上記の関数を全取引先で試してみます。

def get_data_by_exchanges(IDs):
    exchanges=get_exchanges()

    df_result1=pd.DataFrame(data={"ID":IDs})  #データの有無 1:ある 0:ない
    df_result2=pd.DataFrame(data={"ID":IDs})  #データ量
    df_result3=pd.DataFrame(data={"ID":IDs})  #データの開始日
    for exchange in exchanges:
        IS_datas,len_datas,first_days=get_datas(IDs,exchange)

        df_result1[exchange]=IS_datas
        df_result1.to_csv("../30_datas/10_temporarily_saved/IS_data.csv",index=False)

        df_result2[exchange]=len_datas
        df_result2.to_csv("../30_datas/10_temporarily_saved/len_datas.csv",index=False)

        df_result3[exchange]=first_days
        df_result3.to_csv("../30_datas/10_temporarily_saved/first_days.csv",index=False)

各取引所でデータが取得できたのは以下の通りでした

ID bitfinex coinbase-pro bitstamp kraken wex cryptsy cexio gemini quoine liquid bitflyer okcoin 796 bitvc btc-china bitmex mexbt huobi vault-of-satoshi luno poloniex mtgox bisq bithumb bittrex quadriga binance zonda okx count
BTC-JPY 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 6
ETH-JPY 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5
XRP-JPY 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3
FLR-IPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ZPG-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
MATIC-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
MKR-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
XYM-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LINK-JPY 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
DOT-JPY 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
XTZ-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
XLM-JPY 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3
XEM-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
BAT-JPY 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
ETC-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LTC-JPY 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
BCH-JPY 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3
MONA-JPY 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
LSK-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

取引所をBitFlyerにして全件取得できなかったのは
残念なような、ちゃんとしろというような。。。

無料だから文句言えないですが。。。

取引所ごとのデータ量の違いも見てみます。
表の数値は取引先毎のデータのレコード量です。

ID bitfinex coinbase-pro bitstamp kraken wex cryptsy cexio gemini quoine liquid bitflyer okcoin 796 bitvc btc-china bitmex mexbt huobi vault-of-satoshi luno poloniex mtgox bisq bithumb bittrex quadriga binance zonda okx
BTC-JPY 1785 0 0 2969 0 0 0 0 2265 1148 2792 0 0 0 0 0 0 0 0 0 0 0 64 0 0 0 0 0 0
ETH-JPY 1785 0 0 2518 0 0 0 0 1671 1435 1239 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
XRP-JPY 0 0 0 1806 0 0 0 0 0 1420 686 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
FLR-IPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ZPG-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
MATIC-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
MKR-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
XYM-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LINK-JPY 0 0 0 288 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
DOT-JPY 0 0 0 297 0 0 0 0 0 163 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
XTZ-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
XLM-JPY 647 0 0 0 0 0 0 0 0 235 686 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
XEM-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
BAT-JPY 0 0 0 321 0 0 0 0 0 242 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ETC-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LTC-JPY 0 0 0 828 0 0 0 0 0 253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
BCH-JPY 0 0 0 805 0 0 0 0 1158 1395 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
MONA-JPY 0 0 0 0 0 0 0 0 0 0 686 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LSK-JPY 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Krakenがデータ多いですね

多分日本円とのペアだから情報量が少ないんだと思います。
USドル建てで取得してみるともう少しあるかも
ドル円情報をどこかでとってきて変換してもいいかもしれません。

取引所間のデータ比較

取引所ごとに価格が違うとはよく言いますが、
実際どうなんでしょうか?

通貨ペア:ビットコイン(BTC-JPY)で
bitflyerとkrakenで比較してみました。

そもそもデータの開始日が違います。
bitflyerは2015/6/26から
krakenは2014/11/7からです。

2015/6/26から30日間分、価格(終値)の比較をしてみました。

Date bitflyer kraken bitflyer-kraken
2015/6/26 9:00 32000 29785.37 2214.628
2015/6/27 9:00 31700 30500 1200.001
2015/6/28 9:00 31000 30950 50
2015/6/29 9:00 30870 31997.99 -1127.987
2015/6/30 9:00 31550 31450 99.999
2015/7/1 9:00 32850 33000 -150
2015/7/2 9:00 31850 32000 -150
2015/7/3 9:00 31720 31385.11 334.89
2015/7/4 9:00 31790 31600 190
2015/7/5 9:00 32280 32100 180
2015/7/6 9:00 33300 33055 245
2015/7/7 9:00 34000 35000 -999.999
2015/7/8 9:00 33340 32702.45 637.546
2015/7/9 9:00 33900 32557.04 1342.965
2015/7/10 9:00 34530 34935.93 -405.931
2015/7/11 9:00 36000 35600 399.997
2015/7/12 9:00 36000 35345.32 654.677
2015/7/13 9:00 38290 39000 -710
2015/7/14 9:00 36150 36000 150
2015/7/15 9:00 36000 36109.1 -109.102
2015/7/16 9:00 35700 35999.1 -299.1
2015/7/17 9:00 34100 35000 -900
2015/7/18 9:00 34600 35441.68 -841.679
2015/7/19 9:00 34500 35463.08 -963.081
2015/7/20 9:00 34260 34477.2 -217.195
2015/7/21 9:00 34800 34400 400
2015/7/22 9:00 34710 35700.03 -990.032
2015/7/23 9:00 34950 34000 949.999
2015/7/24 9:00 34790 34425.17 364.828
2015/7/25 9:00 35809 35600 209

全然違いますね(笑)
取引所間の価格差を利用した取引をアービトラージというらしいですが、
これをみると利益あげれそうですね。

ただ、これをやっている人が増えれば
価格差は瞬間で埋められるから今は厳しいかもしれませんが。。。

今後の戦略

APIで情報とるのは結構簡単でした。
ただ、クレジットがすぐなくなってしまったので
使いどころをちゃんと考えないととりたい情報がとれない事態に陥ります。

今回の総当たりで狙うべき取引所と通貨ペアのめどがついたので
そこだけに絞ってデータを取得していきます。

さて、こういったデータの大筋の使い方はおそらく、
有名通貨ペアに対してボリンジャーバンドや移動平均線を当ててみて
テクニカルトレードのバックテストだと思いますが、

私は(今のところ)積立投資での資産形成を目指しています。

今回取得できたデータを用いて
積立投資のバックテストやってみます。

これで利益が出るのかどうか検証してみたいと思います。

ではでは。