Innovation Tips

Innovation, Data Science, Research, Business, etc.

ビットコイン(Bitcoin)をはじめとした暗号通貨の分析  [データの取得編01]

今回からはいよいよ分析に入りたいと思います。
ただ、よくあるirisなどの分析からはじめても、ありきたりすぎるので、
みんな大好きビットコイン(Bitcoin)の分析をして興味を持ってもらおうと思います。

今回のゴールはデータの取得までですが、アウトプットイメージは以下のような感じです。
coincheck_crypt

前提として、
・以下pythonコードで書いていきます。python基本的な使い方AnacondaJupyter NotebookPyCharmの使い方などは他のサイトをご参照ください。
(↑一応リンクは貼っています。)

・万が一コードの意味がわからなくても、コピー&ペーストで進めましょう。「できた!」感をまずは優先して、不明点については個別調査。

・使用するデータは海外の取引所のデータ(ドルベース)を使用します。(海外の方が取り扱うコインが多く、今後の展開を考えて)


ビットコインデータの取得
ビットコインの価格が11月に入ってから80万円を超え、ますますビットコインの注目が高まっています。
まずはビットコインの時系列データを引っ張ってくることにします。

最初にデータを引っ張ってくるための準備をします。
今回、ビットコインのデータは、様々な金融データがあるQuandlから持ってきます。
import os
import numpy as np
import pandas as pd
import pickle import quandl from datetime import datetime

また、グラフ描写のために、Plotlyを使います。
import plotly.offline as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
py.init_notebook_mode(connected=True)

そしていよいよ、Quandlからビットコインのデータを引っ張ってきます。
def get_quandl_data(quandl_id):
    '''Download and cache Quandl dataseries'''
    cache_path = '{}.pkl'.format(quandl_id).replace('/','-')
    try:
        f = open(cache_path, 'rb')
        df = pickle.load(f)   
        print('Loaded {} from cache'.format(quandl_id))
    except (OSError, IOError) as e:
        print('Downloading {} from Quandl'.format(quandl_id))
        df = quandl.get(quandl_id, returns="pandas")
        df.to_pickle(cache_path)
        print('Cached {} at {}'.format(quandl_id, cache_path))
    return df
次に、KRAKENという取引所のビットコインのデータを持ってきて、表データを表示してみましょう。
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')
btc_usd_price_kraken.head()
btc1

表データの確認が終わったら、今度はグラフにプロットしてみましょう。
btc_trace = go.Scatter(x=btc_usd_price_kraken.index, y=btc_usd_price_kraken['Weighted Price'])
py.iplot([btc_trace])

BTC2

グラフの中に一部、データが欠落している箇所が見られます。
他の取引所のデータはどうでしょうか。COINBASE, BITSTAMP, ITBITという取引所のデータもあわせて見てみます。

exchanges = ['COINBASE','BITSTAMP','ITBIT']

exchange_data = {}

exchange_data['KRAKEN'] = btc_usd_price_kraken

for exchange in exchanges:
    exchange_code = 'BCHARTS/{}USD'.format(exchange)
    btc_exchange_df = get_quandl_data(exchange_code)
    exchange_data[exchange] = btc_exchange_df

def merge_dfs_on_column(dataframes, labels, col): '''Merge a single column of each dataframe into a new combined dataframe''' series_dict = {} for index in range(len(dataframes)): series_dict[labels[index]] = dataframes[index][col] return pd.DataFrame(series_dict)

他の取引所から得たデータを1つのデータフレームに統合します。
btc_usd_datasets = merge_dfs_on_column(list(exchange_data.values()), list(exchange_data.keys()), 'Weighted Price')

def df_scatter(df, title, seperate_y_axis=False, y_axis_label='', scale='linear', initial_hide=False):
    '''Generate a scatter plot of the entire dataframe'''
    label_arr = list(df)
    series_arr = list(map(lambda col: df[col], label_arr))
    
    layout = go.Layout(
        title=title,
        legend=dict(orientation="h"),
        xaxis=dict(type='date'),
        yaxis=dict(
            title=y_axis_label,
            showticklabels= not seperate_y_axis,
            type=scale
        )
    )
    
    y_axis_config = dict(
        overlaying='y',
        showticklabels=False,
        type=scale )
    
    visibility = 'visible'
    if initial_hide:
        visibility = 'legendonly'
        
    # Form Trace For Each Series
    trace_arr = []
    for index, series in enumerate(series_arr):
        trace = go.Scatter(
            x=series.index, 
            y=series, 
            name=label_arr[index],
            visible=visibility
        )
        
        # Add seperate axis for the series
        if seperate_y_axis:
            trace['yaxis'] = 'y{}'.format(index + 1)
            layout['yaxis{}'.format(index + 1)] = y_axis_config    
        trace_arr.append(trace)

    fig = go.Figure(data=trace_arr, layout=layout)
    py.iplot(fig)


btc_usd_datasets.replace(0, np.nan, inplace=True)

df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')

ここまでくると、以下のような結果が得られます。

BTC3

各取引所のデータの平均をとって整理します。

btc_usd_datasets['avg_btc_price_usd'] = btc_usd_datasets.mean(axis=1)

btc_trace = go.Scatter(x=btc_usd_datasets.index, y=btc_usd_datasets['avg_btc_price_usd']) py.iplot([btc_trace])

BTC4

以上までで、分析する対象としてのビットコインデータの取得はおわりです。

しかしながら、ビットコイン以外にも面白い値動きをしている暗号通貨(アルトコイン)はたくさんあります。
次はビットコインの他に、暗号通貨取引所のCoincheckで取引されている以下の暗号通貨の時系列データを引っ張って来たいと思います。

・イーサリウム (ETH)
・イーサリウムクラシック (ETC)
リップル (XRP)
ネム (XEM)
ライトコイン (LTC)
ダッシュ (DASH)
・モネロ (XMR)

(実際に自分も暗号通貨を買っていますが、身銭を切ると学習の密度が高くなっている感覚がします。)

ただ、少し文章が長くなってしまったので、アルトコインのデータ取得は次のページに移行します。

次のページ
ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin