BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

一文了解Python如何應用於Coinbase

ChinaDeFi
特邀专栏作者
2021-12-17 08:54
本文約8779字,閱讀全文需要約13分鐘
如何利用Coinbase Pro等開放API來提取市場數據?
AI總結
展開
如何利用Coinbase Pro等開放API來提取市場數據?

加密領域是試驗不同技術的好方法。在本文中,我們將涵蓋以下內容:

  • 如何從Coinbase Pro加載數據到Pandas數據框?

  • 如何轉化和分析歷史加密貨幣市場數據?

  • 如何添加簡單移動平均線(SMA),指數移動平均線(EMA), MACD, MACD信號?

  • 如何使用Plotly和Python可視化加密貨幣市場數據?

本文只展示最相關的Python代碼。

在文章的最後,我們將能夠產生一個加密貨幣蠟燭棒圖表,包括各種性能指標和市場趨勢,像這樣:

最終結果——包含市場趨勢的OHLC 蠟燭圖

第一步:連接Coinbase Pro

在cbpro庫的幫助下,連接到Coinbase Pro是一條單線:

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

我們將定義幾個常量,因為我們想要限制想要分析的貨幣數量。讓我們還可以選擇一個基礎貨幣,如美元或歐元,我們想要使用它們來顯示每種貨幣的價值。

FIAT_CURRENCIES = ['EUR','USD']
MY_BASE_CURRENCY = FIAT_CURRENCIES[0]
MY_CRYPTO_CURRENCIES = ["BTC","ETH","LTC","ALGO","SHIB","MANA"]

GRANULARITIES = ['daily','60min','15min','1min']

定義常量

第二步:最近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'])

圖片描述

圖片描述

24小時加密貨幣數據和表現


第三步:加載不同粒度的歷史數據

接下來,我們將使用不同的時間片粒度下載歷史市場數據。因此,我們需要像步驟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小時)

圖片描述

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)

圖片描述

帶有每日時間片的加密貨幣歷史市場數據


第四步:添加指標

現在是最具挑戰性的部分。我們想在我們的數據中添加一些自定義的投資指標。這將增強我們從簡單的市場數據中獲得的信息。我們將添加以下信息:

  • 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())

圖片描述

圖片描述

過去90天內各種加密貨幣的表現


第六步:可視化加密市場數據

在最後一步中,我們希望可視化到目前為止構建的基礎數據。為了可視化,我們將使用強大的Plotly庫。

在我們能夠可視化數據之前,我們需要再創建一個Pandas數據框,它將包含繪製下圖中看跌(紅色)和看漲(綠色)框所需的信息。因此,我們需要構建一個表,它將給出牛市和熊市的時間週期,包括開始和結束的時間週期。多虧了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)

圖片描述

圖片描述

圖片描述


圖片描述

複雜的加密貨幣蠟燭圖,包括性能指標和市場趨勢


原文鏈接

小結

小結

原文鏈接

原文鏈接

Coinbase
歡迎加入Odaily官方社群