こんにちは、hokkyokunです。
仮想通貨 × Pythonで
資産形成とプログラミングの学習を一挙両得していこうと思います。
APIが提供されており、
制限ありですが、無料で使えます。
取引所のデータを取得
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で情報とるのは結構簡単でした。
ただ、クレジットがすぐなくなってしまったので
使いどころをちゃんと考えないととりたい情報がとれない事態に陥ります。
今回の総当たりで狙うべき取引所と通貨ペアのめどがついたので
そこだけに絞ってデータを取得していきます。
さて、こういったデータの大筋の使い方はおそらく、
有名通貨ペアに対してボリンジャーバンドや移動平均線を当ててみて
テクニカルトレードのバックテストだと思いますが、
私は(今のところ)積立投資での資産形成を目指しています。
今回取得できたデータを用いて
積立投資のバックテストやってみます。
これで利益が出るのかどうか検証してみたいと思います。
ではでは。