
この記事の目的は、Anacondaを使用したデータ分析を簡単に紹介することです。 簡単なPythonスクリプトを作成して、さまざまな暗号通貨のデータを抽出、分析、視覚化します。
ステップ1-作業環境のセットアップ。
必要なスキルは、Pythonの基本的な理解だけです。
ステップ1.1-Anacondaのインストール
Anacondaディストリビューションは、 公式Webサイトからダウンロードできます。
インストールは、標準のステップバイステップモードで行われます。
ステップ1.2-プロジェクト作業環境のセットアップ
Anacondaのインストール後、依存関係を整理するために新しい環境を作成してアクティブ化する必要があります。
環境を使用する理由 コンピューターで複数のPythonプロジェクトを開発する予定がある場合は、競合を回避するために、依存関係(ソフトウェアライブラリとパッケージ)を個別に保存すると便利です。 Anacondaは、各プロジェクトの依存関係用の特別な環境ディレクトリを作成して、すべてを整理して分離します。
これは、コマンドラインから行うことができます
conda create --name cryptocurrency-analysis python=3.6
source activate cryptocurrency-analysis
(Linux / macOS)
または
activate cryptocurrency-analysis
(Windows)
Anaconda Navigatorから

この場合、環境は自動的にアクティブ化されます。
次に、必要な依存関係NumPy 、 Pandas 、 nb_conda 、 Jupiter 、 Plotly 、 Quandlをインストールする必要があります。
conda install numpy pandas nb_conda jupyter plotly quandl
Anaconda Navigatorを介して、各パッケージを順番に

これには数分かかる場合があります。
ステップ1.3-Jupyterノートブックを起動する
また、
jupyter notebook
コマンドラインからオプションを選択し、
http://localhost:8888/
ブラウザーを開き
http://localhost:8888/
そして、Anaconda Navigatorを介して

ステップ1.4-依存関係のインポート
空のJupyter Notebookを開いたら、最初に必要な依存関係をインポートします。
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)
ステップ2-ビットコイン価格データの取得
すべてが設定されたので、分析用のデータの抽出を開始する準備ができました。 まず、無料のQuandl APIを使用して価格データを取得します。
ステップ2.1-Quandl関数の定義
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
pickleを使用して、ダウンロードしたデータをシリアル化してファイルとして保存します。これにより、スクリプトを実行するたびにスクリプトが同じデータをリロードしないようにできます。
関数は、データをパンダデータセットとして返します。
ステップ2.2- クラーケン取引所でのビットコイン為替レートの取得
次のように実装します。
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')
スクリプトの実行の正確性を確認するために、head()メソッドを使用して受信した回答の最初の5行を見ることができます。
btc_usd_price_kraken.head()
結果:
日付 | 開く | 高い | 低い | 閉じる | ボリューム(BTC) | ボリューム(通貨) | 加重価格 |
---|---|---|---|---|---|---|---|
2014-01-07 | 874.67040 | 892.06753 | 810.00000 | 810.00000 | 15.622378 | 13151.472844 | 841.835522 |
2014-01-08 | 810.00000 | 899.84281 | 788.00000 | 824.98287 | 19.182756 | 16097.329584 | 839.156269 |
2014-01-09 | 825.56345 | 870.00000 | 807.42084 | 841.86934 | 8.158335 | 6784.249982 | 831.572913 |
2014-01-10 | 839.99000 | 857.34056 | 817.00000 | 857.33056 | 8.024510 | 6780.220188 | 844.938794 |
2014-01-11 | 858.20000 | 918.05471 | 857.16554 | 899.84105 | 18.748285 | 16698.566929 | 890.671709 |
そして、結果の配列を視覚化するグラフを作成します
btc_trace = go.Scatter(x=btc_usd_price_kraken.index, y=btc_usd_price_kraken['Weighted Price']) py.iplot([btc_trace])

ここでは、Plotlyを使用して視覚化を生成します。 これはMatplotlibなどのよく知られているライブラリのいくつかよりも伝統的な選択ではありませんが、 D3.jsを使用して完全にインタラクティブな図を作成するPlotlyは素晴らしい選択だと思います。
ステップ2.3-複数の取引所でビットコインレートを取得する
交換の性質は、価格設定が需要と供給によって決定されることであるため、交換にはビットコインの「真の価格」は含まれません。 この問題を解決するために、3つの大規模な取引所からデータをさらに抽出して、総合価格指数を計算します。
各エクスチェンジのデータを辞書にロードします。
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
ステップ2.4-すべての価格を単一のデータセットにまとめる
データを結合するための簡単な関数を定義します。
def merge_dfs_on_column(dataframes, labels, col): series_dict = {} for index in range(len(dataframes)): series_dict[labels[index]] = dataframes[index][col] return pd.DataFrame(series_dict)
次に、「加重価格」列のすべてのデータを結合します。
btc_usd_datasets = merge_dfs_on_column(list(exchange_data.values()), list(exchange_data.keys()), 'Weighted Price')
それでは、tail()メソッドを使用して最後の5行を見て、すべてが正常に表示され、希望どおりに表示されていることを確認しましょう。
btc_usd_datasets.tail()
結果:
日付 | ビットスタンプ | コインベース | ITBIT | クラーケン | avg_btc_price_usd |
---|---|---|---|---|---|
2018-02-28 | 10624.382893 | 10643.053573 | 10621.099426 | 10615.587987 | 10626.030970 |
2018-03-01 | 10727.272600 | 10710.946064 | 10678.156872 | 10671.653953 | 10697.007372 |
2018-03-02 | 10980.298658 | 10982.181881 | 10973.434045 | 10977.067909 | 10978.245623 |
2018-03-03 | 11332.934468 | 11317.108262 | 11294.620763 | 11357.539095 | 11325.550647 |
2018-03-04 | 11260.751253 | 11250.771211 | 11285.690725 | 11244.836468 | 11260.512414 |
ステップ2.5-価格データセットを比較します。
次の論理ステップは、受け取った価格の比較を視覚化することです。 これを行うには、Plotlyを使用して各交換のチャートを作成する補助関数を定義します。
def df_scatter(df, title, seperate_y_axis=False, y_axis_label='', scale='linear', initial_hide=False): 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' trace_arr = [] for index, series in enumerate(series_arr): trace = go.Scatter( x=series.index, y=series, name=label_arr[index], visible=visibility ) 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)
彼女に電話して
df_scatter(btc_usd_datasets, ' (USD) ')
結果:

ここで、すべてのゼロ値を削除します。これは、検討している期間中に価格がゼロになったことがないことがわかっているためです。
btc_usd_datasets.replace(0, np.nan, inplace=True)
そして、スケジュールを再作成します
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')
結果:

ステップ2.6-平均価格の計算
これで、すべての取引所でのビットコインの1日の平均価格を含む新しい列を計算できます。
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])
結果:

後でこのデータを使用して、他の暗号通貨の為替レートを米ドルに変換します。
ステップ3-代替暗号通貨のデータを取得する
ビットコイン価格のデータの配列ができたので、代替の暗号通貨に関するデータをいくつか見てみましょう。
ステップ3.1-Poloniex APIを操作するための関数を定義します。
Poloniex APIを使用してデータを取得します。 このAPIからJSONデータをロードおよびキャッシュするための2つのヘルパー関数を定義します。
最初に、提供されたURLからJSONデータをロードしてキャッシュする
get_json_data
関数を定義します。
def get_json_data(json_url, cache_path): try: f = open(cache_path, 'rb') df = pickle.load(f) print('Loaded {} from cache'.format(json_url)) except (OSError, IOError) as e: print('Downloading {}'.format(json_url)) df = pd.read_json(json_url) df.to_pickle(cache_path) print('Cached response at {}'.format(json_url, cache_path)) return df
次に、Poloniex API HTTPリクエストをフォーマットする関数を定義し、新しい
get_json_data
関数を呼び出して、受信したデータを保存します。
base_polo_url = 'https://poloniex.com/public?command=returnChartData¤cyPair={}&start={}&end={}&period={}' start_date = datetime.strptime('2015-01-01', '%Y-%m-%d') end_date = datetime.now() pediod = 86400 def get_crypto_data(poloniex_pair): json_url = base_polo_url.format(poloniex_pair, start_date.timestamp(), end_date.timestamp(), pediod) data_df = get_json_data(json_url, poloniex_pair) data_df = data_df.set_index('date') return data_df
この入力関数は、「BTC_ETH」などの暗号通貨のペアを受け取り、2つの通貨の為替レートの履歴データを返します。
ステップ3.2-Poloniexからのデータのダウンロード
考えられる代替暗号通貨の一部は、米ドルで直接取引所で購入することはできません。 このため、各通貨の為替レートをビットコインにアップロードし、ビットコインの価格に関する既存のデータを使用して、この値を米ドルに変換します。
イーサリアム 、 ライトコイン 、 リップル 、 イーサリアム クラシック 、 ステラ 、 ダッシュ 、 シアコイン 、 モネロ 、 NEMの 9つの一般的な暗号通貨の交換データをダウンロードします。
altcoins = ['ETH','LTC','XRP','ETC','STR','DASH','SC','XMR','XEM'] altcoin_data = {} for altcoin in altcoins: coinpair = 'BTC_{}'.format(altcoin) crypto_price_df = get_crypto_data(coinpair) altcoin_data[altcoin] = crypto_price_df
現在、9つのデータセットがあり、各データセットには、ビットコインと代替暗号通貨の過去の平均日次交換比率が含まれています。
イーサリアムの価格表の最後の数行を見て、正常に見えることを確認できます。
altcoin_data['ETH'].tail()
日付 | 閉じる | 高い | 低い | 開く | quoteVolume | ボリューム | 加重平均 |
---|---|---|---|---|---|---|---|
2018-03-01 | 0.079735 | 0.082911 | 0.079232 | 0.082729 | 17981.733693 | 1454.206133 | 0.080871 |
2018-03-02 | 0.077572 | 0.079719 | 0.077014 | 0.079719 | 18482.985554 | 1448.732706 | 0.078382 |
2018-03-03 | 0.074500 | 0.077623 | 0.074356 | 0.077562 | 15058.825646 | 1139.640375 | 0.075679 |
2018-03-04 | 0.075111 | 0.077630 | 0.074389 | 0.074500 | 12258.662182 | 933.480951 | 0.076149 |
2018-03-05 | 0.075373 | 0.075700 | 0.074723 | 0.075277 | 10993.285936 | 826.576693 | 0.075189 |
ステップ3.3-価格をUSDに変換します。
各暗号通貨のビットコイン交換レートと米ドルの履歴ビットコイン価格指数があるため、各代替暗号通貨の価格を米ドルで直接計算できます。
for altcoin in altcoin_data.keys(): altcoin_data[altcoin]['price_usd'] = altcoin_data[altcoin]['weightedAverage'] * btc_usd_datasets['avg_btc_price_usd']
これにより、価格が米ドルの代替暗号通貨の各データセットに新しい列を作成しました。
その後、
merge_dfs_on_column
関数を再利用して、暗号通貨ごとに価格データの組み合わせセットを米ドルで作成できます。
combined_df = merge_dfs_on_column(list(altcoin_data.values()), list(altcoin_data.keys()), 'price_usd')
最後のビット列としてビットコイン価格をデータセットに追加しましょう。
combined_df['BTC'] = btc_usd_datasets['avg_btc_price_usd']
その結果、検討中の10の暗号通貨の1日の米ドル価格を含むデータセットがあります。
df_scatter
関数を使用して、すべての暗号通貨価格をチャートに表示します。
df_scatter(combined_df, ' (USD)', seperate_y_axis=False, y_axis_label='(USD)', scale='log')
このグラフは、過去数年間で各通貨の為替レートがどのように変化したかを示す非常に堅実な「全体像」を示しています。

この例では、Y軸の対数目盛を使用して、同じセクション内のすべての通貨を比較します。 さまざまなパラメーター値(scale = 'linear'など)を試して、データのさまざまな視点を取得できます。
ステップ3.4-暗号通貨相関の計算。
暗号通貨の為替レートは、値やボラティリティがまったく異なるにもかかわらず、わずかに相関しているように見えるかもしれません。 そして、2017年4月の急増からわかるように、小さな変動でさえ市場全体で同期して発生しているようです。
Pandas
corr ()
メソッドを使用して相関仮説をテストできます。このメソッドは、データセット内の各列のピアソン相関係数を相互に計算します。 計算では、データセットの各セルを価格の絶対値からパーセンテージの変化に変換する
pct_change ()
メソッドも使用します。
最初に、2016年の相関を計算します。
combined_df_2016 = combined_df[combined_df.index.year == 2016] combined_df_2016.pct_change().corr(method='pearson')
結果:
ダッシュ | Ect | Et | LTC | SC | STR | Xem | XMR | Xrp | BTC | |
---|---|---|---|---|---|---|---|---|---|---|
ダッシュ | 1.000000 | 0.003992 | 0.122695 | -0.012194 | 0.026602 | 0.058083 | 0.014571 | 0.121537 | 0.088657 | -0.014040 |
Ect | 0.003992 | 1.000000 | -0.181991 | -0.131079 | -0.008066 | -0.102654 | -0.080938 | -0.105898 | -0.054095 | -0.170538 |
Et | 0.122695 | -0.181991 | 1.000000 | -0.064652 | 0.169642 | 0.035093 | 0.043205 | 0.087216 | 0.085630 | -0.006502 |
LTC | -0.012194 | -0.131079 | -0.064652 | 1.000000 | 0.012253 | 0.113523 | 0.160667 | 0.129475 | 0.053712 | 0.750174 |
SC | 0.026602 | -0.008066 | 0.169642 | 0.012253 | 1.000000 | 0.143252 | 0.106153 | 0.047910 | 0.021098 | 0.035116 |
STR | 0.058083 | -0.102654 | 0.035093 | 0.113523 | 0.143252 | 1.000000 | 0.225132 | 0.027998 | 0.320116 | 0.079075 |
Xem | 0.014571 | -0.080938 | 0.043205 | 0.160667 | 0.106153 | 0.225132 | 1.000000 | 0.016438 | 0.101326 | 0.227674 |
XMR | 0.121537 | -0.105898 | 0.087216 | 0.129475 | 0.047910 | 0.027998 | 0.016438 | 1.000000 | 0.027649 | 0.127520 |
Xrp | 0.088657 | -0.054095 | 0.085630 | 0.053712 | 0.021098 | 0.320116 | 0.101326 | 0.027649 | 1.000000 | 0.044161 |
BTC | -0.014040 | -0.170538 | -0.006502 | 0.750174 | 0.035116 | 0.079075 | 0.227674 | 0.127520 | 0.044161 | 1.000000 |
1または-1に近い係数は、データがそれぞれ強く相関または逆相関していることを意味し、ゼロに近い係数は、値が互いに独立して変動する傾向があることを意味します。
これらの結果を視覚化するために、別のヘルパー関数を作成します。
def correlation_heatmap(df, title, absolute_bounds=True): heatmap = go.Heatmap( z=df.corr(method='pearson').as_matrix(), x=df.columns, y=df.columns, colorbar=dict(title='Pearson Coefficient'), ) layout = go.Layout(title=title) if absolute_bounds: heatmap['zmax'] = 1.0 heatmap['zmin'] = -1.0 fig = go.Figure(data=[heatmap], layout=layout) py.iplot(fig)
correlation_heatmap(combined_df_2016.pct_change(), " (2016)")

ここで、濃い赤の値は強い相関を表し、青の値は強い逆相関を表します。 他のすべての色は、微妙な/存在しない相関の度合いを表します。
このチャートは何を教えてくれますか? 実際、これは、2016年中にさまざまな暗号通貨の価格がどのように変動したかについて、統計的に有意な関係がほとんどなかったことを示しています。
ここで、ここ数か月で暗号通貨の相関性が高まっているという仮説をテストするために、2017年と2018年のデータを使用して同じテストを繰り返しましょう。
combined_df_2017 = combined_df[combined_df.index.year == 2017] combined_df_2017.pct_change().corr(method='pearson')
結果:
ダッシュ | Ect | Et | LTC | SC | STR | Xem | XMR | Xrp | BTC | |
---|---|---|---|---|---|---|---|---|---|---|
ダッシュ | 1.000000 | 0.387555 | 0.506911 | 0.340153 | 0.291424 | 0.183038 | 0.325968 | 0.498418 | 0.091146 | 0.307095 |
Ect | 0.387555 | 1.000000 | 0.601437 | 0.482062 | 0.298406 | 0.210387 | 0.321852 | 0.447398 | 0.114780 | 0.416562 |
Et | 0.506911 | 0.601437 | 1.000000 | 0.437609 | 0.373078 | 0.259399 | 0.399200 | 0.554632 | 0.212350 | 0.410771 |
LTC | 0.340153 | 0.482062 | 0.437609 | 1.000000 | 0.339144 | 0.307589 | 0.379088 | 0.437204 | 0.323905 | 0.420645 |
SC | 0.291424 | 0.298406 | 0.373078 | 0.339144 | 1.000000 | 0.402966 | 0.331350 | 0.378644 | 0.243872 | 0.325318 |
STR | 0.183038 | 0.210387 | 0.259399 | 0.307589 | 0.402966 | 1.000000 | 0.339502 | 0.327488 | 0.509828 | 0.230957 |
Xem | 0.325968 | 0.321852 | 0.399200 | 0.379088 | 0.331350 | 0.339502 | 1.000000 | 0.336076 | 0.268168 | 0.329431 |
XMR | 0.498418 | 0.447398 | 0.554632 | 0.437204 | 0.378644 | 0.327488 | 0.336076 | 1.000000 | 0.226636 | 0.409183 |
Xrp | 0.091146 | 0.114780 | 0.212350 | 0.323905 | 0.243872 | 0.509828 | 0.268168 | 0.226636 | 1.000000 | 0.131469 |
BTC | 0.307095 | 0.416562 | 0.410771 | 0.420645 | 0.325318 | 0.230957 | 0.329431 | 0.409183 | 0.131469 | 1.000000 |
correlation_heatmap(combined_df_2017.pct_change(), " (2017)")

combined_df_2018 = combined_df[combined_df.index.year == 2018] combined_df_2018.pct_change().corr(method='pearson')
ダッシュ | Ect | Et | LTC | SC | STR | Xem | XMR | Xrp | BTC | |
---|---|---|---|---|---|---|---|---|---|---|
ダッシュ | 1.000000 | 0.775561 | 0.856549 | 0.847947 | 0.733168 | 0.717240 | 0.769135 | 0.913044 | 0.779651 | 0.901523 |
Ect | 0.775561 | 1.000000 | 0.808820 | 0.667434 | 0.530840 | 0.551207 | 0.641747 | 0.696060 | 0.637674 | 0.694228 |
Et | 0.856549 | 0.808820 | 1.000000 | 0.700708 | 0.624853 | 0.630380 | 0.752303 | 0.816879 | 0.652138 | 0.787141 |
LTC | 0.847947 | 0.667434 | 0.700708 | 1.000000 | 0.683706 | 0.596614 | 0.593616 | 0.765904 | 0.644155 | 0.831780 |
SC | 0.733168 | 0.530840 | 0.624853 | 0.683706 | 1.000000 | 0.615265 | 0.695136 | 0.626091 | 0.719462 | 0.723976 |
STR | 0.717240 | 0.551207 | 0.630380 | 0.596614 | 0.615265 | 1.000000 | 0.790420 | 0.642810 | 0.854057 | 0.669746 |
Xem | 0.769135 | 0.641747 | 0.752303 | 0.593616 | 0.695136 | 0.790420 | 1.000000 | 0.744325 | 0.829737 | 0.734044 |
XMR | 0.913044 | 0.696060 | 0.816879 | 0.765904 | 0.626091 | 0.642810 | 0.744325 | 1.000000 | 0.668016 | 0.888284 |
Xrp | 0.779651 | 0.637674 | 0.652138 | 0.644155 | 0.719462 | 0.854057 | 0.829737 | 0.668016 | 1.000000 | 0.712146 |
BTC | 0.901523 | 0.694228 | 0.787141 | 0.831780 | 0.723976 | 0.669746 | 0.734044 | 0.888284 | 0.712146 | 1.000000 |
correlation_heatmap(combined_df_2018.pct_change(), " (2018)")

そして今、私たちが仮定したことを見ることができます-ほとんどすべての暗号通貨は、すべての方向で互いに相互接続されています。
これについては、Anacondaでのデータ操作の概要が正常に完了したと仮定します。