仮想通貨のポテンシャルをpythonでまとめて取得してみた


使用環境

  • python 3.5.1
  • Anaconda 4.0.0

前置き

CoinMarketCapというサイトに記載されている情報を元に、仮に他のアルトがビットコインの時価総額に到達した場合、対BTC比でどのぐらいのポテンシャル(現在価格からどのぐらいの倍率で伸びるのか)があるのかをみることで今後のアルトコインのポテンシャル測ることが出来ます。

これは他の上位アルトコインがビットコインのドミナンスを食いつぶした場合のエグジットのポイントの目安にも約に立つと個人的に思っております。

そんなわけで、やっていきたいと思います。

導出手順

APIの取得

まず、CoinMarketCap JSON API Documentation Version1のTicker(相場一覧)を取得するため、APIにGETメソッドをリクエストします。

cmc_coin_potential.py
import urllib.request
import json

url = 'https://api.coinmarketcap.com/v1/ticker/?limit=100'
response = urllib.request.urlopen(url)
cmc_ticker = json.loads(response.read().decode('utf8'))

?limit=のパラメータの数値を変更することで、取得したい数を変更することができます。ここでは2-100位のポテンシャルを調べたいので100を指定しています。

次にurllib.request.urlopenにてurlにリクエストを投げて、返ってきたデータをresponseに格納します。

これはhttp.client.HTTPResponse型で格納されているため、.read()で読み込み、json.loadsにてpythonで扱えるデータ型に変換します。

中身はリスト型にそれぞれのコインが辞書型で格納されています。

以下が実際のデータになります。

[{
    "id": "bitcoin", 
    "name": "Bitcoin", 
    "symbol": "BTC", 
    "rank": "1", 
    "price_usd": "15424.4", 
    "price_btc": "1.0", 
    "24h_volume_usd": "22149000000.0", 
    "market_cap_usd": "258868090810", 
    "available_supply": "16783025.0", 
    "total_supply": "16783025.0", 
    "max_supply": "21000000.0", 
    "percent_change_1h": "-0.78", 
    "percent_change_24h": "1.89", 
    "percent_change_7d": "3.84", 
    "last_updated": "1515129861"
}, 
{
    "id": "ripple", 
    "name": "Ripple", 
    "symbol": "XRP", 
    "rank": "2", 
    "price_usd": "3.18734", 
    "price_btc": "0.00021254", 
    "24h_volume_usd": "7896020000.0", 
    "market_cap_usd": "123474825937", 
    "available_supply": "38739144847.0", 
    "total_supply": "99993093880.0", 
    "max_supply": "100000000000", 
    "percent_change_1h": "-1.3", 
    "percent_change_24h": "-9.92", 
    "percent_change_7d": "106.57", 
    "last_updated": "1515129841"
}]

導出方法

ポテンシャルはビットコイン価格からビットコインとの発行枚数を比較した倍率を割り、更にそれの結果をそれぞれの通貨の価格で割って算出します。って言ってもわかりませんよね。

参考までに、式を記載しておきます。

(BTC価格 ÷ (アルト発行枚数 ÷ BTC発行枚数)) ÷ アルト価格

これを上位100位までに当てはめて実行します。

cmc_coin_potential.py
btc_supply = float(cmc_ticker[0]['available_supply'])
btc_price_usd = float(cmc_ticker[0]['price_usd'])

all_id = []
all_supply = []
all_price = []
potential_result = []


for i in range(len(cmc_ticker) - 1):
    all_id.append(cmc_ticker[i + 1]['id'])
    all_supply.append(float(cmc_ticker[i + 1]['available_supply']))
    all_price.append(float(cmc_ticker[i + 1]['price_usd']))

    potential_result.append(round(((btc_price_usd / (all_supply[i] / btc_supply)) / all_price[i]), 2))

まず、はじめにリストの先頭にあるBTCの供給量と価格をそれぞれbtc_supply, btc_price_usdに格納します。この際、取り出される情報が文字列であったので、float()を使って変換しています。

次に上位アルトの名前all_id(後で、書き出しの際に使用します)、供給量all_supply、価格all_priceを格納するリストを作成し、.append()を使用してリストに全てのアルトコインの情報を追加しています。この際、ビットコインの情報が入らないように要素の数を1つずらしています。

それらの情報からポテンシャルを算出し、potential_resultに結果を追加していきます。

書き出し

書き出しには、Pandasの書き出しが楽なので、それを使用しました。

cmc_coin_potential.py
import pandas as pd

potential_df = pd.DataFrame({'id': all_id, 'potential_result': potential_result}, index=list(range(2, len(cmc_ticker) + 1)))

potential_df.to_csv('cmc_coin_potential.csv')

idと、potential_resultのデータフレームを作成し、csvファイルにて書き出しています。

出力結果は以下のようになります。(見やすいようにPDFで出力しています)

6位でテンバガー、21位でハンドレットバガーを狙えるポテンシャルがあるという結果になりました。勿論、ビットコインと同等の価値になったらの話なんですが、それでも凄いポテンシャルですね。

備考

floatで全て変換しているのは冗長だな、と書いてから思いました。

また、何かアドバイスがあればコメント残して頂ければ幸いです。

では。