ビットコインの価格はどうでしょう? デジタル通貨の価格の上昇と減少の理由は? 異なるアルトコインの市場価格は密接に関連しているか,またはほとんど独立していますか? 次に何が起こるかを予測するにはどうすればよいですか?
ビットコインやイーサリアムなどのデジタル通貨に関する記事は,現在,憶測に満ちている.何百人もの自称の専門家が,彼らが期待する傾向を支持している.これらの分析の多くは,基本的なデータと統計モデルのための堅固な基盤がない.
この記事の目的は,Python を使用してデジタル通貨分析に簡潔な紹介を提供することです.私たちは,異なるデジタル通貨のデータを取得,分析,視覚化するために単純なPythonスクリプトを使用します.このプロセスでは,これらの変動の市場行動とそれらの発展の興味深い傾向を見つけます.
これはデジタル通貨を説明する記事でもなく,どの通貨が上昇し,どの通貨が減少するかの意見でもありません.その反対に,このチュートリアルで注目しているのは,元のデータを取得し,数字に隠された物語を見つけることです.
このチュートリアルは,すべてのスキルレベルのエキスパート,エンジニア,データサイエンティスト向けです.業界リーダーでもプログラミング初心者でも,必要な唯一のスキルは,Pythonプログラミング言語の基本的な理解とコマンドライン操作の十分な知識です (データサイエンスのプロジェクトを設定することが十分です).
上のすべての機能は Docker のようなシステムに収縮されています. 必要なのは,独自のクラウドコンピューティングサービスを購入またはリースして Docker システムを展開することです.
FMZ Quantプラットフォームの公式名称では,このDockerシステムはDockerシステムと呼ばれています.
ドッカーとロボットの展開について 私の前の記事を参照してください:https://www.fmz.com/bbs-topic/9864.
ドーカーを展開するために独自のクラウドコンピューティングサーバを購入したい読者は,この記事を参照してください:https://www.fmz.com/digest-topic/5711.
次に,Pythonの現在の最大のアーティファクトをインストールします. Anaconda.
この記事で要求されるすべての関連するプログラム環境 (依存ライブラリ,バージョン管理など) を実現するために,最も簡単な方法は Anaconda を使用することです.これはパッケージ化された Python データサイエンスエコシステムと依存ライブラリマネージャです.
Anacondaをクラウドサービスにインストールするので,クラウドサーバーに Linux システムと Anaconda のコマンドラインバージョンをインストールすることをお勧めします.
アナコンダのインストール方法については,アナコンダの公式ガイドを参照してください.https://www.anaconda.com/distribution/.
経験豊富な Python プログラマーで,Anaconda を使用する必要がないと感じている場合は,全く問題ありません.必要な依存環境をインストールする際に助けを必要としないと仮定します.このセクションを直接スキップできます.
Anaconda がインストールされると,依存パッケージを管理するための新しい環境を作成する必要があります. Linux コマンドラインインターフェースで,
conda create --name cryptocurrency-analysis python=3
アナコンダの新しい環境を作りました
次に入力:
source activate cryptocurrency-analysis (linux/MacOS operating system)
or
activate cryptocurrency-analysis (windows operating system)
環境を活性化します
次に入力:
conda install numpy pandas nb_conda jupyter plotly
このプロジェクトに必要な様々な依存パッケージをインストールします
注: Anaconda 環境を使用する理由は? パイソンプロジェクトを多くコンピュータで実行する場合は,紛争を避けるために異なるプロジェクトの依存パッケージ (ソフトウェアライブラリとパッケージ) を分離することが役立ちます. Ananconda は各プロジェクトの依存パッケージの特別な環境ディレクトリを作成し,すべてのパッケージを適切に管理し,区別することができます.
環境と依存パッケージがインストールされた後,実行します:
jupyter notebook
iPython カーネルを起動するには,http://localhost:8888/Pythonのノートブックを作成します.
Python [conda env:cryptocurrency-analysis]
カーネル
必要な依存パッケージをインポートします 必要なパッケージをインポートします
import os
import numpy as np
import pandas as pd
import pickle
from datetime import datetime
オンラインモードを有効にする必要があります.
import plotly.offline as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
py.init_notebook_mode(connected=True)
準備が完了し,分析されるデータを入手し始めます.まずは,FMZ Quantプラットフォームの API インターフェースを使用してビットコインの価格データを入手します.
この2つの機能の使用については,以下を参照してください:https://www.fmz.com/api.
Quandl からデータをダウンロードし,同期する関数を書く必要があります (quandl.com) これは海外で高い評判を得ている無料の金融データインターフェイスです. FMZ Quantプラットフォームも同様のデータインターフェースを提供し,主に実際のボット取引に使用されています.記事は主にデータ分析に焦点を当てているため,私たちはここでQuandlデータをまだ使用しています.
リアルボットトランザクション中に,PythonでGetTickerとGetRecords関数を直接呼び出し,価格データを取得できます.それらの使用については,以下を参照してください:https://www.fmz.com/api.
def get_quandl_data(quandl_id):
# Download and cache data columns from Quandl
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
パンダスデータフレームは,プログラムが実行するたびに同じデータをダウンロードしないように,データをシリアル化し,ダウンロードしたデータをファイルとして保存するために使用されます.この機能はパンダスデータフレーム形式でデータを返します.データフレームの概念に慣れていない場合は,強力なエクセルとして想像できます.
Bitcoinの価格から始めましょう. 価格を計算すると,
# Get prices on the Kraken Bitcoin exchange
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')
データボックスの最初の5行を表示するためにhead (head) メソッドを使用します.
btc_usd_price_kraken.head()
結果として
データの正確性を視覚化することで確認します. データを視覚化することで,
# Make a table of BTC prices
btc_trace = go.Scatter(x=btc_usd_price_kraken.index, y=btc_usd_price_kraken['Weighted Price'])
py.iplot([btc_trace])
ここでは,可視化部分を完了するためにPlotlyを使用します.Matplotlibなどのいくつかの成熟した Python データ可視化ライブラリを使用すると比較して,Plotlyはあまり一般的な選択肢ではありませんが,完全にインタラクティブなチャートD3.js
ヒント:生成されたチャートは,ダウンロードされたデータが一般的に一貫しているかどうかを確認するために,OKX,BinanceまたはHuobiのチャートなどの主流の取引所のビットコイン価格チャートと比較できます.
注意深い読者は,特に2014年末から2016年初旬にかけて,上記のデータにデータ欠落があることに気づいているかもしれません.特にKraken Exchangeでは,この種のデータ損失が特に明らかです.これらの欠落したデータが価格分析に影響を及ぼすことは絶対に望まないでしょう.
デジタル通貨交換の特徴は,供給と需要の関係が通貨価格を決定することである.したがって,取引価格は市場の"主流価格"になることはできません. 先ほど述べた問題とデータ損失の問題を解決するために (技術的な停電やデータエラーによる可能性があります),私たちは世界の3つの主流ビットコイン取引所からのデータをダウンロードし,その後平均ビットコイン価格を計算します.
辞書タイプからなるデータフレームに ダウンロードして始めましょう
# Download price data from COINBASE, BITSTAMP and 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
次に,各データフレームに共通する列を新しいデータフレームにマージする特別な関数を定義します. merge_dfs_on_column関数と呼びましょう.
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)
各データセットの"加重価格"列をベースに 統合されます.
# Integrate all data frames
btc_usd_datasets = merge_dfs_on_column(list(exchange_data.values()), list(exchange_data.keys()), 'Weighted Price')
最後に
btc_usd_datasets.tail()
結果は以下のように示されています.
上記の表から このデータは 予想通りで ほぼ同じデータ範囲ですが 遅延や各交換の特徴によって 少し違います
分析論理の観点から,次のステップは,これらのデータを視覚化を通じて比較することです. そのためには,まず補助関数を定義する必要があります. 図を作成するためにデータを使用するための単行本コマンドを提供することで,それをdf_scatter関数と呼びます.
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'
# Table tracking 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 a separate axis to 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)
この記事では,この補助機能の論理原理についてあまり議論しません.もっと知りたい場合は,Pandas と Plotly の公式ドキュメントを確認してください.
ビットコインの価格データチャートを簡単に作成できます
# Plot all BTC transaction prices
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')
上記のグラフからわかるように,4つのデータシリーズがほぼ同じ経路をたどっているにもかかわらず,不規則な変化が残っています.これらの不規則な変化を排除しようとします.
2012年から2017年の間 ビットコインの価格はゼロに等しくなかったので まずデータフレームの 0値をすべて削除します
# Clear the "0" value
btc_usd_datasets.replace(0, np.nan, inplace=True)
データフレームを再構築すると より明確なグラフが見えます 欠落したデータはありません
# Plot the revised data frame
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')
ビットコインの平均価格を計算できます 取引所の平均価格です
# Calculate the average BTC price as a new column
btc_usd_datasets['avg_btc_price_usd'] = btc_usd_datasets.mean(axis=1)
データを間違えているか確認するために再描きます.
# Plot the average BTC price
btc_trace = go.Scatter(x=btc_usd_datasets.index, y=btc_usd_datasets['avg_btc_price_usd'])
py.iplot([btc_trace])
後で,他のデジタル通貨とドルとの間の為替レートを決定するために,この総額価格シリーズデータを使用し続けます.
これまでのところ,Bitcoin価格のタイムシーズのデータがあります.次に,Bitcoin以外のデジタル通貨,すなわちAltcoinsのデータを見てみましょう. もちろん,Altcoinsという用語は少し誇張されるかもしれませんが,現在のデジタル通貨の発展に関しては,市場価値でトップ10 (Bitcoin,Ethereum,EOS,USDTなど) を除く限り,それらのほとんどはAltcoinsと呼ばれます.取引時にこれらの通貨から遠ざかってみるべきです.それらはあまりにも混乱し,欺くからです.
まず,デジタル通貨取引のデータ情報を入手するためにPoloniex取引所のAPIを使用します. Altcoinに関連するデータを入手するために2つの補助機能を定義します. これらの2つの機能は主にAPIを通じてJSONデータをダウンロードしキャッシュします.
与えられたURLからJSONデータをダウンロードしてキャッシュします. この関数で,JSONのデータをダウンロードし,キャッシュします.
def get_json_data(json_url, cache_path):
'''Download and cache JSON data, return as a dataframe.'''
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 {} 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') # Data acquisition since 2015
end_date = datetime.now() # Until today
pediod = 86400 # pull daily data (86,400 seconds per day)
def get_crypto_data(poloniex_pair):
'''Retrieve cryptocurrency data from poloniex'''
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
アルトコインの大部分はUSDで直接購入することはできません. これらのデジタル通貨を取得するには,個人では通常,まずビットコインを購入し,その価格比率に応じてアルトコインに変換する必要があります. したがって,各デジタル通貨の為替レートをBitcoinにダウンロードし,既存のビットコイン価格データを使ってUSDに変換する必要があります.私たちはトップ9のデジタル通貨の為替レートデータをダウンロードします. Ethereum,Litecoin,Ripple,EthereumClassic,Stellar,Dash,Siacoin,Monero,NEM.
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とBitcoinの 日々の平均価格が 記録されています
Ethereumの価格表の最後の数行で データの正しさを判断できます
altcoin_data['ETH'].tail()
BTCとアルトコインの為替レートのデータを ビットコインの価格指数と組み合わせることで それぞれのアルトコインの 過去価格 (USD) を直接計算できます
# Calculate USD Price as a new column in each altcoin data frame
for altcoin in altcoin_data.keys():
altcoin_data[altcoin]['price_usd'] = altcoin_data[altcoin]['weightedAverage'] * btc_usd_datasets['avg_btc_price_usd']
ここでは,それぞれのアルトコインデータフレームに新しい列を追加し,対応するUSD価格を格納します.
組み合わせたデータフレームを作成し,各デジタル通貨のUSD価格を統合できます. デジタル通貨の価格を組み合わせると,
# Combine the USD price of each Altcoin into a single data frame
combined_df = merge_dfs_on_column(list(altcoin_data.values()), list(altcoin_data.keys()), 'price_usd')
やった!
統合されたデータフレームの最後の列に ビットコインの価格を追加します
# Add BTC price to data frame
combined_df['BTC'] = btc_usd_datasets['avg_btc_price_usd']
確認している10のデジタル通貨の 日々のドル価格を含んでいる ユニークなデータフレームがあります
グラフの形式ですべてのアルトコインの対応価格を表示します グラフの形式ですべてのアルトコインの対応価格を表示します
このグラフは,過去数年の各デジタル通貨の為替価格の変化の完全なイメージを示しています.
注: ここでは,同じチャート上のすべてのデジタル通貨を比較するために対数式仕様のy軸を使用します.また,異なる視点からデータを理解するために,異なるパラメータ (スケール=
慎重な読者は,デジタル通貨の価格が関連しているように見えますが,その通貨価値は幅広く変動し,非常に不安定です.特に2017年4月の急速な上昇以来,多くの小さな変動でさえ,市場全体の変動と同時に発生しているようです.
もちろんデータに基づいた結論は 画像に基づいた直感よりも説得力があります
上記の相関仮説を検証するために,Pandas corr() 関数を用いることができる.このテスト方法は,他の列に対応するデータフレームの各列のピアソン相関係数を計算する.
2017年8月22日の修正要記: この項目は,相関係数を計算する際には,価格の絶対値ではなく,日々の利回り率を使用するために変更されました.
非固い時間列 (原価データなど) をベースとした直接計算は,相関係数の偏差を引き起こす可能性があります.この問題を解決するには,データフレーム内の各価格の絶対値を対応する日々の収益率に変換するために pct_change (pct_change) 方法を使用することです.
2016年の相関係数を計算してみましょう.
# Calculating the Pearson correlation coefficient for digital currencies in 2016
combined_df_2016 = combined_df[combined_df.index.year == 2016]
combined_df_2016.pct_change().corr(method='pearson')
上記のグラフは相関系数を示しています.相関系数が1または-1に近い場合,このシリーズは順に正相関または負相関であることを意味します.相関系数が0に近い場合,対応するオブジェクトが相関していないことを意味し,それらの変動は相互に独立しています.
視覚的支援機能を作りました 視覚的支援機能を作りました
def correlation_heatmap(df, title, absolute_bounds=True):
'''Plot a correlation heatmap for the entire dataframe'''
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(), "Cryptocurrency Correlations in 2016")
暗黒赤の値は強い相関を表す (各通貨は明らかに自分自身と高度に相関している),暗黒青の値は逆相関を表す.中間にあるすべての色 - 淡い青/オレンジ/灰色/タウニー - は,弱相関または非相関の異なる程度を表す値を有する.
このグラフは 2016年の異なるデジタル通貨価格の変動を示しています 統計的に有意な相関はほとんどありません
デジタル通貨の相関が ここ数ヶ月間 増加したという仮説を検証するために 2017年のデータを使って 同じテストを繰り返します
combined_df_2017 = combined_df[combined_df.index.year == 2017]
combined_df_2017.pct_change().corr(method='pearson')
上記のデータより関連性があるか?投資の判断基準として使用するのに十分ですか?答えはノーです.
しかし,ほとんどのデジタル通貨が 相互に結びついていることに 注目すべきです.
correlation_heatmap(combined_df_2017.pct_change(), "Cryptocurrency Correlations in 2017")
上記のチャートからわかるように 状況はますます興味深いものになっています
いい質問だけど 本当には...
私の最初の反応は,ヘッジファンドが最近デジタル通貨市場で公開取引を開始したことです. これらのファンドは通常のトレーダーよりもはるかに多くの資本を持っています. 基金が複数のデジタル通貨間で投資した資本をヘッジすると,独立した変数 (株式市場など) に基づいて各通貨に対して同様の取引戦略を使用します. この観点から,この増加する関連性の傾向が起こるのは理にかなっています.
XRPとSTRの理解を深める
例えば,上記のチャートからXRP (リップルのトークン) は他のデジタル通貨との相関性が最小であることが明らかである.しかし,STR (ステラルのトークン,公式には
興味深いことに,Stellar と Ripple は非常に類似した金融技術プラットフォームであり,両者は銀行間の国境を越えた転送の退屈なステップを減らすことを目指しています.Stellar と Ripple に投資するいくつかの大手プレイヤーとヘッジファンドは,ブロックチェーンサービスで使用されるトークンの類似性を考慮して,同様の取引戦略を使用することが考えられます.これがXRP が他のデジタル通貨よりも STR に関連がある理由かもしれません.
上記の説明は 概説的なもので,よりよいかもしれません. 私たちが築いた基盤に基づいて,データに含まれる物語を 探求し続けられる何百もの異なる方法があります.
私の提案の一部は以下の通りです.読者は以下の方向での研究を参照することができます.
ビットコインとデジタル通貨の良いところは,その分散型性であり,他の資産よりも自由で民主的なものです.あなたはあなたの分析をオープンソースで共有したり,コミュニティに参加したり,ブログを書くことができます! 将来,特にデータサポートのない投機的なデジタル通貨の記事を読むときに自己分析に必要なスキルと弁解的に考える能力を習得したことを願っています. 読んでくれてありがとう. このチュートリアルについてコメント,提案,批判がある場合は,メッセージを残してください.https://www.fmz.com/bbs.