加密領域是試驗不同技術的好方法。在本文中,我們將涵蓋以下內容:
如何從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'])
從Coinbase Pro加載并格式化所有加密貨幣的24小時市場數據
Pandas數據框的格式化輸出如下所示:
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小時)
如果你想獲得過去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)
現在我們的Pandas數據框如下(為了更好的可讀性,增加了一些額外的列,如年、月、日):
帶有每日時間片的加密貨幣歷史市場數據
第四步:添加指標
現在是最具挑戰性的部分。我們想在我們的數據中添加一些自定義的投資指標。這將增強我們從簡單的市場數據中獲得的信息。我們將添加以下信息:
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())
第五步:利用信息進行決策
現在我們已經為進一步的分析創建了良好的基礎,我們可以利用這些信息并創建一個定制的Pandas數據框。它保存了我們選擇的加密貨幣的一些基本表現信息:
過去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)
強大的 Pandas 功能來改變我們的時間片
這段代碼將給我們一個Pandas數據框,如下所示:
壓縮看漲和看跌時間段的 Pandas 數據框
關于Plotly代碼,可以在Jupyter Notebook中操作。Plotly的輸出如下所示:
復雜的加密貨幣蠟燭圖,包括性能指標和市場趨勢
這個圖表使用了Plotly中的兩個y軸。右邊的y軸是用來繪制蠟燭圖的。左邊的y軸用于繪制MACD和MACD信號線。
每當MACD線越過MACD信號線上方時,我們就進入一個牛市周期,這個周期用綠色方框表示。每當MACD線跌破MACD信號線,我們就進入熊市周期。后一種情況用一個紅框表示。
小結
到目前為止,我們已經學習了如何利用Coinbase Pro等開放API來提取市場數據,并根據需求進行轉換。
發文者:鏈站長,轉載請註明出處:https://www.jmb-bio.com/4151.html