Python が Coinbase にどのように適用されるかを 1 つの記事で学びましょう
暗号空間は、さまざまなテクノロジーを実験するのに最適な方法です。この記事では、次の内容について説明します。
Coinbase Pro から Pandas データフレームにデータをロードするにはどうすればよいですか?
過去の仮想通貨市場データを変換して分析するにはどうすればよいですか?
単純移動平均 (SMA)、指数移動平均 (EMA)、MACD、MACD シグナルを追加するにはどうすればよいですか?
Plotly と Python を使用して暗号通貨市場データを視覚化する方法?
この記事では、最も関連性の高い Python コードのみを示します。

この記事の最後では、次のようなさまざまなパフォーマンス指標や市場動向を含む暗号通貨のローソク足チャートを生成できるようになります。

最終結果 - 市場トレンドを含む OHLC ローソク足チャート
ステップ 1: Coinbase Pro に接続する
cbpro ライブラリの助けを借りて、Coinbase Pro への接続は 1 行で完了します。
import cbpro
public_client = cbpro.PublicClient()
server_time = public_client.get_time()
# Server time does not comply to iso format, therefore slight modification of string needed
server_time_now = datetime.fromisoformat(server_time['iso'].replace('T', ' ', 1)[0:19])
print(server_time_now)
Coinbase Proへのパブリッククライアントを起動する
分析する通貨の数を制限したいため、いくつかの定数を定義します。各通貨の価値を表示するために使用する USD や EUR などの基本通貨も選択しましょう。
FIAT_CURRENCIES = ['EUR','USD']
MY_BASE_CURRENCY = FIAT_CURRENCIES[0]
MY_CRYPTO_CURRENCIES = ["BTC","ETH","LTC","ALGO","SHIB","MANA"]
GRANULARITIES = ['daily','60min','15min','1min']
定数を定義する
ステップ 2: 過去 24 時間の統計をロードする
次に、過去 24 時間の各暗号通貨の基本統計を確認します。また、レポート期間の開始から終了までのパフォーマンスを表示するカスタム列「パフォーマンス」も追加します。コードの残りの部分は数値の書式設定を処理します。
currency_rows = []
for currency in MY_CRYPTO_CURRENCIES:
data = public_client.get_product_24hr_stats(currency+'-'+MY_BASE_CURRENCY)
currency_rows.append(data)
df_24hstats = pd.DataFrame(currency_rows, index = MY_CRYPTO_CURRENCIES)
df_24hstats['currency'] = df_24hstats.index
df_24hstats['open'] = df_24hstats['open'].astype(float)
df_24hstats['high'] = df_24hstats['high'].astype(float)
df_24hstats['low'] = df_24hstats['low'].astype(float)
df_24hstats['volume'] = df_24hstats['volume'].astype(float)
df_24hstats['last'] = df_24hstats['last'].astype(float)
df_24hstats['volume_30day'] = df_24hstats['volume_30day'].astype(float)
df_24hstats['performance'] = ((df_24hstats['last']-df_24hstats['open']) / df_24hstats['open']) * 100
df_24hstats_formatted = df_24hstats.copy()
df_24hstats_formatted['performance'] = df_24hstats_formatted['performance'].apply(lambda x: "{:.2f}%".format((x)))
df_24hstats_formatted['open'] = df_24hstats_formatted['open'].apply(lambda x: "{:,.2f}€".format((x)))
df_24hstats_formatted['high'] = df_24hstats_formatted['high'].apply(lambda x: "{:,.2f}€".format((x)))
df_24hstats_formatted['low'] = df_24hstats_formatted['low'].apply(lambda x: "{:,.2f}€".format((x)))
df_24hstats_formatted['last'] = df_24hstats_formatted['last'].apply(lambda x: "{:,.2f}€".format((x)))
df_24hstats_formatted.style.hide_columns(['volume','volume_30day'])
Coinbase Pro からすべての暗号通貨の 24 時間市場データをロードしてフォーマットします
画像の説明

24 時間の暗号通貨データとパフォーマンス
ステップ 3: さまざまな粒度の履歴データをロードする
次に、さまざまなタイム スライス粒度を使用して過去の市場データをダウンロードします。したがって、ステップ 2 と同様にすべての通貨に対して繰り返す必要があります。日次データを取得する方法の例を次に示します。
currency_history_rows = []
for currency in MY_CRYPTO_CURRENCIES:
start_date = (server_time_now - timedelta(days=90)).isoformat()
end_date = server_time_now.isoformat()
data = public_client.get_product_historic_rates(currency+'-'+MY_BASE_CURRENCY, start=start_date, end=end_date, granularity=86400)
[x.append(currency) for x in data]
[x.append('daily') for x in data]
currency_history_rows.extend(data)
df_history = pd.DataFrame(currency_history_rows)
df_history.columns = ['time','low','high','open','close','volume','currency','granularity']
df_history['date'] = pd.to_datetime(df_history['time'], unit='s')
タイムスライス データを取得するには、次の情報が必要です。
希望する期間の開始日(ISO 形式)
希望の期間の終了日を ISO 形式で指定します。
秒単位の粒度 (この場合は 86400 秒、24 時間に相当)
過去 300 時間の時間ごとのデータを取得したい場合は、次の手順を実行できます。
start_date = (server_time_now - timedelta(hours=300)).isoformat()
end_date = server_time_now.isoformat()
data = public_client.get_product_historic_rates(currency+'-'+MY_BASE_CURRENCY, start=start_date, end=end_date, granularity=3600)
画像の説明

毎日のタイムスライスを含む仮想通貨の過去の市場データ
ステップ 4: メトリクスを追加する
ここからが最も難しい部分です。いくつかのカスタム投資指標をデータに追加したいと考えています。これにより、単純な市場データから得られる情報が強化されます。次の情報を追加します。
SMA3 および SMA7 (過去 3 および 7 タイム スライスの単純移動平均): これは、一定期間にわたる証券の平均価格を示す、価格ベースの遅行 (または反応性) 指標です。移動平均は、チャートを解釈する際の「ノイズ」を除去します。ノイズは価格と出来高の変動で構成されます。単純移動平均は、加重されていない移動平均です。これは、データセット内の各期間が同じ重要性を持ち、同じ重みが与えられることを意味します。
EMA12 および EMA26 (過去 12 および 26 タイム スライスの指数移動平均): EMA は最近の価格に重点を置いているため、SMA よりもラグが大幅に小さくなります。したがって、SMA よりも高速に回転します。別のタイム スライスを選択することもできますが、12 と 26 が一般的に使用される期間なので、例ではそれらを使用します。
MACD (移動平均収束/発散): あらゆる証券の一般的な傾向を判断するのに適した指標です。短期EMAと長期EMAの差が求められます。正の MACD 値は、市場のポジティブな傾向を示します。マイナスの MACD 値は、マイナスの市場トレンドを示します。
MACD シグナル: MACD シグナル ラインは、MACD ラインの特定のタイム スライス グループの EMA です。通常、この値は 9 タイム スライスに設定されます。
MACD ヒストグラム: これは MACD ラインと MACD シグナル ラインの差です。 MACD ラインが MACD シグナルラインを上抜けると、強気クロスが発生します。弱気クロスは、MACD ラインが MACD シグナルラインを下回るときに発生します。これが何を意味するのかは、後でデータを視覚化するときに確認します。
始値から終値までのパフォーマンス: タイム スライスごとに、特定の期間の終値と始値の差がパーセンテージで表されます。
高値-安値スパン: 期間内の最高価格と最低価格の間の偏差のパーセンテージ。これは、タイム スライス内の変動を示します。
過去 3 つの期間にわたる絶対的なパフォーマンス: このインジケーターは、最後の 3 つのタイム スライスのパフォーマンスを絶対値として取得します (定数で定義した選択した基本通貨で測定)。
過去 3 つの期間のパフォーマンスのパーセンテージ: このインジケーターは、最後の 3 つのタイム スライスのパフォーマンスを相対値 (パーセンテージ) の形式で提供します。
強気または弱気: MACD ヒストグラムが正の場合は「強気」と書き込み、MACD ヒストグラムが負の場合は「弱気」と書き込みます。
継続する市場トレンド: 強気から弱気へ、またはその逆の遷移を識別するために、前のタイム スライスからの傾向が継続する場合、この列は「True」になり、傾向が変化した場合は「False」になります。
Panda の強力なベクトル演算と組み込み関数のおかげで、わずか数行のコードでこれを実現できました。
currency_history_rows_enhanced = []
for currency in MY_CRYPTO_CURRENCIES:
for granularity in GRANULARITIES:
df_history_currency = df_history.query('granularity == @granularity & currency == @currency').copy()
df_history_currency = df_history_currency.sort_values(['date'], ascending=True)
df_history_currency['SMA3'] = df_history_currency['close'].rolling(window=3).mean()
df_history_currency['SMA7'] = df_history_currency['close'].rolling(window=7).mean()
df_history_currency['EMA12'] = df_history_currency['close'].ewm(span=12, adjust=False).mean()
df_history_currency['EMA26'] = df_history_currency['close'].ewm(span=26, adjust=False).mean()
df_history_currency['MACD'] = df_history_currency['EMA12'] - df_history_currency['EMA26']
df_history_currency['MACD_signal'] = df_history_currency['MACD'].ewm(span=9, adjust=False).mean()
df_history_currency['macd_histogram'] = ((df_history_currency['MACD']-df_history_currency['MACD_signal']))
df_history_currency['open_to_close_perf'] = ((df_history_currency['close']-df_history_currency['open']) / df_history_currency['open'])
df_history_currency['high_low_span'] = ((df_history_currency['high']-df_history_currency['low']) / df_history_currency['high'])
df_history_currency['open_perf_last_3_period_abs'] = df_history_currency['open'].rolling(window=4).apply(lambda x: x.iloc[1] - x.iloc[0])
df_history_currency['open_perf_last_3_period_per'] = df_history_currency['open'].rolling(window=4).apply(lambda x: (x.iloc[1] - x.iloc[0])/x.iloc[0])
df_history_currency['bull_bear'] = np.where(df_history_currency['macd_histogram']< 0, 'Bear', 'Bull')
currency_history_rows_enhanced.append(df_history_currency)
df_history_enhanced = pd.concat(currency_history_rows_enhanced, ignore_index=True)
df_history_enhanced = df_history_enhanced.sort_values(['currency','granularity','date'], ascending=True)
df_history_enhanced['market_trend_continued'] = df_history_enhanced.bull_bear.eq(df_history_enhanced.bull_bear.shift()) & df_history_enhanced.currency.eq(df_history_enhanced.currency.shift()) & df_history_enhanced.granularity.eq(df_history_enhanced.granularity.shift())
ステップ 5: 情報を使用して意思決定を行う
画像の説明

過去 90 日間のさまざまな暗号通貨のパフォーマンス
ステップ 6: 暗号通貨市場データを視覚化する
最後のステップでは、これまでに構築された基礎となるデータを視覚化します。視覚化には、強力な Plotly ライブラリを使用します。
データを視覚化する前に、下の画像に弱気 (赤) および強気 (緑) のボックスをプロットするために必要な情報を含む Pandas データ フレームをもう 1 つ作成する必要があります。したがって、開始期間と終了期間を含む強気市場と弱気市場の期間を示すテーブルを作成する必要があります。 Pandas のおかげで、次のコード スニペットを使用してこれを簡単に実現できます。
market_trend_interval_rows = []
for currency in MY_CRYPTO_CURRENCIES:
for granularity in GRANULARITIES:
df_history_market_trend_intervals = df_history_enhanced.query('currency == @currency and market_trend_continued == False and granularity == @granularity').copy()
df_history_market_trend_intervals['next_period_date'] = df_history_market_trend_intervals.date.shift(-1)
df_history_market_trend_intervals['next_period_date'] = df_history_market_trend_intervals['next_period_date']
df_history_market_trend_intervals.next_period_date = df_history_market_trend_intervals.next_period_date.fillna(datetime.now())
df_history_market_trend_intervals['color'] = df_history_market_trend_intervals['bull_bear'].apply(lambda x: GREEN_COLOR if x == 'Bull' else RED_COLOR)
df_history_market_trend_intervals = df_history_market_trend_intervals[['currency','granularity','bull_bear','color','date','next_period_date']].rename(columns={"date": "start_date", "next_period_date": "finish_date"})
market_trend_interval_rows.append(df_history_market_trend_intervals)
df_history_market_trend_intervals = pd.concat(market_trend_interval_rows, ignore_index=True)
タイムスライスを変換する強力な Pandas 機能
画像の説明

圧縮された強気期間と弱気期間を含む Pandas データフレーム
画像の説明

パフォーマンス指標や市場動向を含む、洗練された暗号通貨ローソク足チャート
このグラフでは、Plotly で 2 つの y 軸を使用しています。右側の y 軸はローソク足の描画に使用されます。左側の Y 軸は、MACD と MACD シグナル ラインをプロットするために使用されます。
まとめ
まとめ
元のリンク


