暗号通貨レート相関検索の例を使用したAnacondaとの連携





この記事の目的は、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から







この場合、環境は自動的にアクティブ化されます。



次に、必要な依存関係NumPyPandasnb_condaJupiterPlotlyQuandlをインストールする必要があります。



 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&currencyPair={}&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でのデータ操作の概要が正常に完了したと仮定します。



All Articles