Tìm hiểu cách Python được áp dụng cho Coinbase trong một bài viết
Không gian tiền điện tử là một cách tuyệt vời để thử nghiệm các công nghệ khác nhau. Trong bài viết này, chúng tôi sẽ đề cập đến những điều sau:
Làm cách nào để tải dữ liệu từ Coinbase Pro vào khung dữ liệu Pandas?
Làm cách nào để chuyển đổi và phân tích lịch sử dữ liệu thị trường tiền điện tử?
Làm cách nào để thêm Đường trung bình động đơn giản (SMA), Đường trung bình động hàm mũ (EMA), MACD, tín hiệu MACD?
Làm cách nào để trực quan hóa dữ liệu thị trường tiền điện tử bằng Plotly và Python?
Bài viết này chỉ hiển thị mã Python phù hợp nhất.

Ở cuối bài viết, chúng ta sẽ có thể tạo biểu đồ thanh nến tiền điện tử, bao gồm các chỉ báo hiệu suất và xu hướng thị trường khác nhau, như sau:

Kết quả cuối cùng - Biểu đồ nến OHLC theo xu hướng thị trường
Bước 1: Kết nối với Coinbase Pro
Với sự trợ giúp của thư viện cbpro, việc kết nối với Coinbase Pro rất đơn giản:
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)
Khởi chạy ứng dụng khách công khai lên Coinbase Pro
Chúng tôi sẽ xác định một vài hằng số vì chúng tôi muốn giới hạn số lượng tiền tệ mà chúng tôi muốn phân tích. Chúng ta cũng hãy chọn một loại tiền tệ cơ sở, chẳng hạn như USD hoặc EUR, mà chúng ta muốn sử dụng để hiển thị giá trị của từng loại tiền tệ.
FIAT_CURRENCIES = ['EUR','USD']
MY_BASE_CURRENCY = FIAT_CURRENCIES[0]
MY_CRYPTO_CURRENCIES = ["BTC","ETH","LTC","ALGO","SHIB","MANA"]
GRANULARITIES = ['daily','60min','15min','1min']
xác định hằng số
Bước 2: Tải thống kê trong 24 giờ qua
Tiếp theo, chúng tôi sẽ xem xét số liệu thống kê cơ bản cho từng loại tiền điện tử trong 24 giờ qua. Chúng tôi cũng sẽ thêm một cột tùy chỉnh "Hiệu suất" sẽ hiển thị hiệu suất của khoảng thời gian báo cáo từ đầu đến cuối. Phần còn lại của mã đảm nhận việc định dạng số.
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'])
Tải và định dạng dữ liệu thị trường 24 giờ cho tất cả các loại tiền điện tử từ Coinbase Pro
Mô tả hình ảnh

Dữ liệu và hiệu suất tiền điện tử trong 24 giờ
Bước 3: Tải dữ liệu lịch sử ở các mức độ chi tiết khác nhau
Tiếp theo, chúng tôi sẽ tải xuống dữ liệu thị trường lịch sử bằng cách sử dụng các mức độ chi tiết lát thời gian khác nhau. Vì vậy, chúng tôi cần lặp lại tất cả các loại tiền tệ như bước 2. Dưới đây là một ví dụ về cách truy xuất dữ liệu hàng ngày:
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')
Để truy xuất dữ liệu timelice, chúng tôi cần các thông tin sau:
Ngày bắt đầu ở định dạng ISO của khoảng thời gian mong muốn
Ngày kết thúc ở định dạng ISO trong khoảng thời gian mong muốn
Độ chi tiết tính bằng giây (trong trường hợp này là 86400 giây, tương đương với 24 giờ)
Nếu bạn muốn nhận dữ liệu hàng giờ trong 300 giờ qua, bạn có thể làm như sau:
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)
Mô tả hình ảnh

Dữ liệu thị trường lịch sử tiền điện tử với lát thời gian hàng ngày
Bước bốn: Thêm số liệu
Bây giờ đến phần thử thách nhất. Chúng tôi muốn thêm một số chỉ số đầu tư tùy chỉnh vào dữ liệu của mình. Điều này sẽ nâng cao thông tin chúng tôi nhận được từ dữ liệu thị trường đơn giản. Chúng tôi sẽ thêm các thông tin sau:
SMA3 và SMA7 (trung bình động đơn giản trong 3 và 7 lát thời gian): Đây là chỉ báo dựa trên giá, có độ trễ (hoặc phản ứng) cho thấy giá trung bình của chứng khoán trong một khoảng thời gian nhất định. Đường trung bình động loại bỏ "tiếng ồn" khi diễn giải biểu đồ. Tiếng ồn được tạo thành từ biến động giá cả và khối lượng. Đường trung bình động đơn giản là đường trung bình động không có trọng số. Điều này có nghĩa là mỗi khoảng thời gian trong tập dữ liệu đều có tầm quan trọng như nhau và có trọng số như nhau.
EMA12 và EMA26 (đường trung bình động hàm mũ trong 12 và 26 lát thời gian vừa qua): EMA có độ trễ ít hơn nhiều so với SMA vì nó đặt nặng hơn vào các mức giá gần đây. Do đó, nó quay nhanh hơn SMA. Chúng tôi có thể chọn một lát thời gian khác, nhưng 12 và 26 là khoảng thời gian thường được sử dụng và chúng tôi sẽ sử dụng chúng trong các ví dụ của mình.
MACD (Trung bình động hội tụ/phân kỳ): Một chỉ báo tốt để xác định xu hướng chung của bất kỳ chứng khoán nào. Nó có sự khác biệt giữa EMA ngắn hạn và EMA dài hạn. Giá trị MACD dương là một chỉ báo về xu hướng thị trường tích cực. Giá trị MACD âm là một chỉ báo về xu hướng thị trường tiêu cực.
Tín hiệu MACD: Đường tín hiệu MACD là EMA trên một nhóm lát cắt thời gian cụ thể của đường MACD. Thông thường, giá trị này được đặt thành 9 lát thời gian.
Biểu đồ MACD: Đây là sự khác biệt giữa Đường MACD và Đường Tín hiệu MACD. Bullish cross xảy ra khi đường MACD cắt lên trên đường tín hiệu MACD. Một giao cắt giảm giá xảy ra khi đường MACD cắt xuống dưới đường tín hiệu MACD. Chúng ta sẽ thấy chính xác điều này có nghĩa là gì sau, khi chúng ta trực quan hóa dữ liệu.
Hiệu suất từ mở đến đóng: Đối với mỗi lát thời gian, chênh lệch giữa giá đóng và giá mở trong một khoảng thời gian cụ thể được biểu thị bằng phần trăm.
High-Low Span: Độ lệch phần trăm giữa giá cao nhất và giá thấp nhất trong một khoảng thời gian. Điều này cho thấy sự dao động trong một lát cắt thời gian.
Hiệu suất tuyệt đối trong 3 khoảng thời gian gần nhất: Chỉ báo này lấy hiệu suất của 3 khoảng thời gian gần nhất làm giá trị tuyệt đối (được đo bằng đơn vị tiền tệ cơ sở mà chúng tôi xác định trong hằng số).
Tỷ lệ phần trăm hiệu suất trong 3 khoảng thời gian gần nhất: Chỉ báo này cung cấp hiệu suất của 3 lát thời gian gần nhất dưới dạng giá trị tương đối (phần trăm).
Bull hoặc Bear: Nếu biểu đồ MACD dương, hãy viết "bull"; nếu biểu đồ MACD âm, hãy viết "bear".
Xu hướng tiếp tục của thị trường: Để xác định quá trình chuyển đổi từ tăng sang giảm và ngược lại, cột này là "Đúng" nếu xu hướng từ phần thời gian trước tiếp tục và "Sai" nếu xu hướng đã thay đổi.
Nhờ các hoạt động véc tơ mạnh mẽ và các chức năng tích hợp sẵn của Panda, chúng tôi đã đạt được điều này chỉ với một vài dòng mã.
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())
Bước năm: Sử dụng thông tin để đưa ra quyết định
Mô tả hình ảnh

Hiệu suất của các loại tiền điện tử khác nhau trong 90 ngày qua
Bước sáu: Trực quan hóa dữ liệu thị trường tiền điện tử
Trong bước cuối cùng, chúng tôi muốn trực quan hóa dữ liệu cơ bản được xây dựng cho đến nay. Để trực quan hóa, chúng tôi sẽ sử dụng thư viện Plotly mạnh mẽ.
Trước khi có thể trực quan hóa dữ liệu, chúng ta cần tạo thêm một khung dữ liệu Pandas chứa thông tin cần thiết để vẽ các hộp giảm giá (màu đỏ) và tăng giá (màu xanh lá cây) trong hình ảnh bên dưới. Do đó, chúng ta cần xây dựng một bảng cung cấp các khoảng thời gian của thị trường giá lên và giá xuống, bao gồm cả khoảng thời gian bắt đầu và kết thúc. Nhờ có Pandas, chúng tôi có thể dễ dàng đạt được điều này bằng đoạn mã sau:
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)
Các hàm Pandas mạnh mẽ để biến đổi các lát cắt thời gian của chúng ta
Mô tả hình ảnh

Khung dữ liệu gấu trúc với các khoảng thời gian tăng và giảm được nén
Mô tả hình ảnh

Biểu đồ nến tiền điện tử tinh vi, bao gồm các chỉ báo hiệu suất và xu hướng thị trường
Biểu đồ này sử dụng hai trục y trong Plotly. Trục y bên phải được sử dụng để vẽ chân nến. Trục y bên trái được sử dụng để vẽ đường MACD và đường tín hiệu MACD.
bản tóm tắt
bản tóm tắt
liên kết gốc


