
Giá Bitcoin đang diễn biến thế nào? Nguyên nhân nào khiến giá tiền điện tử tăng vọt và giảm mạnh? Giá thị trường của các loại tiền điện tử thay thế khác nhau có liên kết chặt chẽ với nhau hay chúng khá độc lập? Làm sao chúng ta có thể dự đoán điều gì sẽ xảy ra tiếp theo?
Các bài viết về tiền kỹ thuật số, chẳng hạn như Bitcoin và Ethereum, hiện tràn ngập những suy đoán, với hàng trăm chuyên gia tự xưng ủng hộ các xu hướng mà họ mong đợi sẽ xuất hiện. Điều còn thiếu trong nhiều phân tích này là nền tảng vững chắc về dữ liệu cơ bản và mô hình thống kê.
Mục tiêu của bài viết này là cung cấp phần giới thiệu đơn giản về phân tích tiền điện tử bằng Python. Chúng ta sẽ tìm hiểu một tập lệnh Python đơn giản để thu thập, phân tích và trực quan hóa dữ liệu cho các loại tiền điện tử khác nhau. Trên đường đi, chúng ta sẽ khám phá những xu hướng thú vị trong hành vi của những thị trường biến động này và cách chúng phát triển.

Đây không phải là bài viết giải thích về tiền điện tử, cũng không phải là bài viết quan điểm về loại tiền cụ thể nào sẽ tăng và loại tiền nào sẽ giảm. Thay vào đó, trọng tâm của chúng tôi trong hướng dẫn này chỉ là lấy dữ liệu thô và khám phá những câu chuyện ẩn chứa trong các con số.
Hướng dẫn này được thiết kế dành cho những người đam mê, kỹ sư và nhà khoa học dữ liệu ở mọi cấp độ kỹ năng. Cho dù bạn là chuyên gia trong ngành hay người mới bắt đầu lập trình, kỹ năng duy nhất bạn cần là hiểu biết cơ bản về ngôn ngữ lập trình Python và kiến thức đầy đủ về các thao tác dòng lệnh. (Chỉ cần có khả năng thiết lập một dự án khoa học dữ liệu).
Ngoài việc cung cấp các nguồn dữ liệu chất lượng cao từ các sàn giao dịch chính thống, Inventor Quantitative Platform FMZ.COM còn cung cấp một bộ giao diện API phong phú để giúp chúng tôi thực hiện các giao dịch tự động sau khi hoàn tất phân tích dữ liệu. Bộ giao diện này bao gồm các công cụ thực tế như truy vấn thông tin tài khoản, truy vấn giá cao, giá mở cửa, giá thấp, giá đóng cửa, khối lượng giao dịch, nhiều chỉ báo phân tích kỹ thuật thường dùng của nhiều sàn giao dịch chính thống, v.v., đặc biệt là để kết nối với các sàn giao dịch chính thống lớn trong thực tế quy trình giao dịch. Giao diện API công khai cung cấp hỗ trợ kỹ thuật mạnh mẽ.
Tất cả các chức năng được đề cập ở trên đều được đóng gói trong một hệ thống tương tự như Docker. Tất cả những gì chúng ta phải làm là mua hoặc thuê dịch vụ điện toán đám mây của riêng mình và sau đó triển khai hệ thống Docker.
Trong tên chính thức của Inventor Quantitative Platform, hệ thống Docker này được gọi là hệ thống lưu trữ.
Để biết thêm thông tin về cách triển khai máy chủ và rô-bốt, vui lòng tham khảo bài viết trước của tôi: https://www.fmz.com/bbs-topic/4140
Bạn đọc muốn mua máy chủ triển khai điện toán đám mây riêng có thể tham khảo bài viết này: https://www.fmz.com/bbs-topic/2848
Sau khi triển khai thành công dịch vụ điện toán đám mây và hệ thống máy chủ, chúng ta sẽ cài đặt công cụ Python mạnh mẽ nhất: Anaconda
Để có được tất cả các môi trường chương trình có liên quan cần thiết cho bài viết này (thư viện phụ thuộc, quản lý phiên bản, v.v.), cách dễ nhất là sử dụng Anaconda. Đây là hệ sinh thái khoa học dữ liệu Python được đóng gói và trình quản lý phụ thuộc.
Vì chúng tôi đang cài đặt Anaconda trên dịch vụ đám mây nên chúng tôi khuyên bạn nên cài đặt hệ thống Linux cùng với phiên bản dòng lệnh của Anaconda trên máy chủ đám mây.
Để biết phương pháp cài đặt Anaconda, vui lòng tham khảo hướng dẫn chính thức của Anaconda: https://www.anaconda.com/distribution/
Nếu bạn là một lập trình viên Python có kinh nghiệm và không cảm thấy cần phải sử dụng Anaconda thì hoàn toàn không sao cả. Tôi sẽ cho rằng bạn không cần trợ giúp cài đặt các phụ thuộc cần thiết và bạn có thể chuyển sang Phần 2.
Sau khi Anaconda được cài đặt, chúng ta cần tạo một môi trường mới để quản lý các gói phụ thuộc. Trong giao diện dòng lệnh Linux, chúng ta nhập:
conda create --name cryptocurrency-analysis python=3
Hãy tạo một môi trường Anaconda mới cho dự án của chúng ta.
Tiếp theo, nhập
source activate cryptocurrency-analysis (linux/MacOS操作)
或者
activate cryptocurrency-analysis (windows操作系统)
Để kích hoạt môi trường này
Tiếp theo, nhập:
conda install numpy pandas nb_conda jupyter plotly
Để cài đặt các gói phụ thuộc khác nhau cần thiết cho dự án này.
Lưu ý: Tại sao nên sử dụng môi trường Anaconda? Nếu bạn dự định chạy nhiều dự án Python trên máy tính của mình, bạn nên tách biệt các phần phụ thuộc (thư viện và gói) của các dự án khác nhau để tránh xung đột. Ananconda tạo một thư mục môi trường đặc biệt cho mỗi gói phụ thuộc của dự án để tất cả các gói có thể được quản lý và phân biệt đúng cách.
Sau khi môi trường và các gói phụ thuộc được cài đặt, hãy chạy
jupyter notebook
để khởi động hạt nhân iPython, sau đó trỏ trình duyệt của bạn tới http://localhost:8888/ và tạo một sổ ghi chép Python mới, đảm bảo rằng nó sử dụng:
Python [conda env:cryptocurrency-analysis]
Hạt nhân

Tạo một sổ ghi chép Jupyter mới trống và điều đầu tiên chúng ta cần làm là nhập các gói phụ thuộc cần thiết.
import os
import numpy as np
import pandas as pd
import pickle
from datetime import datetime
Chúng ta cũng cần nhập Plotly và bật chế độ ngoại tuyến
import plotly.offline as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
py.init_notebook_mode(connected=True)
Bây giờ công tác chuẩn bị đã hoàn tất, chúng ta có thể bắt đầu thu thập dữ liệu để phân tích. Đầu tiên, chúng ta cần sử dụng giao diện API của Inventor Quantitative Platform để lấy dữ liệu giá Bitcoin.
Điều này sẽ sử dụng hàm GetTicker. Để biết chi tiết về cách sử dụng hai hàm này, vui lòng xem: https://www.fmz.com/api
Để thuận tiện cho việc thu thập dữ liệu, chúng ta cần viết một hàm để tải xuống và đồng bộ hóa dữ liệu từ Quandl (quandl.com). Đây là giao diện dữ liệu tài chính miễn phí rất nổi tiếng ở nước ngoài. Nền tảng định lượng Inventor cũng cung cấp giao diện dữ liệu tương tự, chủ yếu được sử dụng cho giao dịch thời gian thực. Vì bài viết này chủ yếu dành cho phân tích dữ liệu nên chúng tôi vẫn sử dụng dữ liệu của Quandl tại đây.
Khi giao dịch theo thời gian thực, bạn có thể gọi trực tiếp các hàm GetTicker và GetRecords trong Python để lấy dữ liệu giá. Để biết cách sử dụng, vui lòng tham khảo: https://www.fmz.com/api
def get_quandl_data(quandl_id):
# 下载和缓冲来自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
Thư viện pickle được sử dụng ở đây để tuần tự hóa dữ liệu và lưu dữ liệu đã tải xuống dưới dạng tệp để chương trình không tải lại cùng một dữ liệu mỗi lần chạy. Hàm này sẽ trả về dữ liệu theo định dạng Pandas Dataframe. Nếu bạn không quen với khái niệm khung dữ liệu, hãy nghĩ về nó như một bảng tính Excel mạnh mẽ.
Hãy lấy sàn giao dịch Bitcoin Kraken làm ví dụ và bắt đầu bằng cách lấy giá Bitcoin của sàn này.
# 获取Kraken比特币交易所的价格
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')
Sử dụng phương thức head() để xem năm hàng đầu tiên của khung dữ liệu.
btc_usd_price_kraken.head()
Kết quả là:
| BTC | Open | High | Low | Close | Volume (BTC) | Volume (Currency) | Weighted Price |
|---|---|---|---|---|---|---|---|
| 2014-01-07 | 874.67040 | 892.06753 | 810.00000 | 810.00000 | 15.622378 | 13151.472844 | 841.835522 |
| 2014-01-08 | 810.00000 | 899.84281 | 788.00000 | 824.98287 | 19.182756 | 16097.329584 | 839.156269 |
| 2014-01-09 | 825.56345 | 870.00000 | 807.42084 | 841.86934 | 8.158335 | 6784.249982 | 831.572913 |
| 2014-01-10 | 839.99000 | 857.34056 | 817.00000 | 857.33056 | 8.024510 | 6780.220188 | 844.938794 |
| 2014-01-11 | 858.20000 | 918.05471 | 857.16554 | 899.84105 | 18.748285 | 16698.566929 | 890.671709 |
Tiếp theo, chúng ta cần tạo một bảng đơn giản để xác minh tính chính xác của dữ liệu thông qua hình ảnh trực quan.
# 做出BTC价格的表格
btc_trace = go.Scatter(x=btc_usd_price_kraken.index, y=btc_usd_price_kraken['Weighted Price'])
py.iplot([btc_trace])

Ở đây, chúng tôi sử dụng Plotly để hoàn thiện phần trực quan hóa. Plotly là lựa chọn ít phổ biến hơn so với một số thư viện trực quan hóa dữ liệu Python tiên tiến hơn, chẳng hạn như Matplotlib, nhưng đây là lựa chọn tốt vì nó có thể sử dụng D3.js để tạo biểu đồ tương tác hoàn toàn. Các biểu đồ có thiết lập mặc định rất đẹp, dễ khám phá và rất tiện lợi để nhúng vào các trang web.
Mẹo: Bạn có thể so sánh biểu đồ được tạo với biểu đồ giá Bitcoin từ một sàn giao dịch lớn (như OKEX, Binance hoặc Huobi) như một cách kiểm tra nhanh để xác nhận rằng dữ liệu đã tải xuống có tương đối nhất quán hay không.
Những độc giả cẩn thận có thể nhận thấy rằng có một số dữ liệu bị thiếu trong số liệu trên, đặc biệt là vào cuối năm 2014 và đầu năm 2016. Khoảng cách dữ liệu này đặc biệt rõ ràng trong sàn giao dịch Kraken. Chúng tôi chắc chắn không muốn dữ liệu bị thiếu này ảnh hưởng đến việc phân tích giá cả của mình.
Đặc điểm của sàn giao dịch tiền kỹ thuật số là giá của loại tiền này được xác định bởi cung và cầu. Do đó, không có mức giá giao dịch nào có thể trở thành “mức giá chính thống” của thị trường. Để giải quyết vấn đề này, cũng như vấn đề thiếu dữ liệu vừa đề cập (có thể do sự cố kỹ thuật và lỗi dữ liệu), chúng tôi sẽ tải xuống dữ liệu từ ba sàn giao dịch Bitcoin lớn nhất thế giới và tính giá Bitcoin trung bình.
Chúng ta hãy bắt đầu bằng cách tải dữ liệu cho mỗi trao đổi vào một khung dữ liệu bao gồm một loại từ điển.
# 下载COINBASE,BITSTAMP和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
Tiếp theo, chúng ta sẽ định nghĩa một hàm đặc biệt để hợp nhất các cột chung từ mỗi khung dữ liệu thành một khung dữ liệu mới. Chúng ta hãy gọi nó là hàm 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)
Bây giờ, hãy kết hợp tất cả các khung dữ liệu lại với nhau dựa trên cột “giá có trọng số” của mỗi tập dữ liệu.
# 整合所有数据帧
btc_usd_datasets = merge_dfs_on_column(list(exchange_data.values()), list(exchange_data.keys()), 'Weighted Price')
Cuối cùng, chúng ta sử dụng phương thức “tail()” để xem năm hàng cuối cùng của dữ liệu đã hợp nhất để đảm bảo dữ liệu là chính xác và đầy đủ.
btc_usd_datasets.tail()
Kết quả là:
| BTC | BITSTAMP | COINBASE | ITBIT | KRAKEN |
|---|---|---|---|---|
| 2017-08-14 | 4210.154943 | 4213.332106 | 4207.366696 | 4213.257519 |
| 2017-08-15 | 4101.447155 | 4131.606897 | 4127.036871 | 4149.146996 |
| 2017-08-16 | 4193.426713 | 4193.469553 | 4190.104520 | 4187.399662 |
| 2017-08-17 | 4338.694675 | 4334.115210 | 4334.449440 | 4346.508031 |
| 2017-08-18 | 4182.166174 | 4169.555948 | 4175.440768 | 4198.277722 |
Như bạn có thể thấy từ bảng trên, dữ liệu này phù hợp với kỳ vọng của chúng tôi. Phạm vi dữ liệu gần như giống nhau, nhưng có một số khác biệt nhỏ dựa trên độ trễ hoặc đặc điểm của từng trao đổi.
Theo góc nhìn của logic phân tích, bước tiếp theo là so sánh những dữ liệu này thông qua hình ảnh trực quan. Để thực hiện điều này, trước tiên chúng ta cần định nghĩa một hàm trợ giúp sử dụng dữ liệu để tạo biểu đồ bằng cách cung cấp một lệnh dòng đơn. Hãy gọi đó là hàm 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'
# 每个系列的表格跟踪
trace_arr = []
for index, series in enumerate(series_arr):
trace = go.Scatter(
x=series.index,
y=series,
name=label_arr[index],
visible=visibility
)
# 为系列添加单独的轴
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)
Để bạn dễ hiểu, bài viết này sẽ không thảo luận chi tiết về nguyên lý logic của hàm phụ trợ này. Nếu bạn muốn tìm hiểu thêm, hãy xem tài liệu chính thức của Pandas và Plotly.
Bây giờ chúng ta có thể dễ dàng tạo biểu đồ dữ liệu giá Bitcoin!
# 绘制所有BTC交易价格
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')

Như bạn có thể thấy từ biểu đồ trên, mặc dù bốn chuỗi đều đi theo cùng một con đường nhưng vẫn có một số điểm bất thường mà chúng ta sẽ cố gắng làm rõ.
Trong giai đoạn 2012-2017, chúng ta biết rằng giá Bitcoin chưa bao giờ bằng 0, vì vậy trước tiên chúng ta loại bỏ tất cả các giá trị bằng 0 trong khung dữ liệu.
# 清除"0"值
btc_usd_datasets.replace(0, np.nan, inplace=True)
Sau khi xây dựng lại khung dữ liệu, chúng ta có thể thấy biểu đồ rõ ràng hơn nhiều mà không bị thiếu dữ liệu.
# 绘制修订后的数据框
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')

Bây giờ chúng ta có thể tính toán một cột mới: giá Bitcoin trung bình hàng ngày trên tất cả các sàn giao dịch.
# 将平均BTC价格计算为新列
btc_usd_datasets['avg_btc_price_usd'] = btc_usd_datasets.mean(axis=1)
Cột mới là chỉ số giá Bitcoin! Hãy vẽ lại đồ thị một lần nữa để kiểm tra xem có vấn đề gì sai sót trong dữ liệu không.
# 绘制平均BTC价格
btc_trace = go.Scatter(x=btc_usd_datasets.index, y=btc_usd_datasets['avg_btc_price_usd'])
py.iplot([btc_trace])

Có vẻ như không có vấn đề gì và chúng tôi sẽ tiếp tục sử dụng dữ liệu chuỗi giá tổng hợp này sau để có thể xác định tỷ giá hối đoái giữa các loại tiền điện tử khác và đồng đô la Mỹ.
Cho đến nay, chúng ta đã có dữ liệu chuỗi thời gian về giá Bitcoin. Tiếp theo, chúng ta hãy xem xét một số dữ liệu về các loại tiền kỹ thuật số không phải Bitcoin, cụ thể là tình hình của các altcoin. Tất nhiên, thuật ngữ altcoin có thể hơi quá mạnh, nhưng đối với sự phát triển hiện tại của các loại tiền kỹ thuật số, ngoài thứ hạng vốn hóa thị trường Hầu hết mười loại tiền tệ hàng đầu (như Bitcoin, Ethereum, EOS, USDT, v.v.) đều có thể được gọi là altcoin. Không có vấn đề gì. Chúng ta nên cố gắng tránh xa những loại tiền tệ này khi giao dịch vì chúng quá khó hiểu và lừa đảo. cao.
Đầu tiên, chúng tôi sử dụng API của sàn giao dịch Poloniex để lấy thông tin dữ liệu về các giao dịch tiền kỹ thuật số. Chúng tôi định nghĩa hai hàm phụ trợ để lấy dữ liệu liên quan của altcoin. Hai hàm này chủ yếu tải xuống và lưu trữ dữ liệu JSON thông qua API.
Đầu tiên, chúng ta định nghĩa hàm get_json_data, hàm này sẽ tải xuống và lưu trữ dữ liệu JSON từ một URL nhất định.
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
Tiếp theo, chúng ta định nghĩa một hàm mới sẽ thực hiện yêu cầu HTTP tới API Poloniex và gọi hàm get_json_data mà chúng ta vừa định nghĩa để lưu kết quả của cuộc gọi.
base_polo_url = 'https://poloniex.com/public?command=returnChartData¤cyPair={}&start={}&end={}&period={}'
start_date = datetime.strptime('2015-01-01', '%Y-%m-%d') # 从2015年开始获取数据
end_date = datetime.now() # 直到今天
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
Hàm trên sẽ trích xuất mã chuỗi của cặp tiền điện tử (chẳng hạn như “BTC_ETH”) và trả về một khung dữ liệu chứa giá lịch sử của cả hai loại tiền tệ.
Hầu hết các altcoin không thể mua trực tiếp bằng đô la Mỹ. Nếu cá nhân muốn có được các loại tiền kỹ thuật số này, họ thường phải mua Bitcoin trước rồi đổi chúng lấy altcoin dựa trên tỷ lệ giá giữa chúng. Do đó, chúng ta phải tải xuống tỷ giá hối đoái của từng loại tiền kỹ thuật số sang Bitcoin, sau đó sử dụng dữ liệu giá Bitcoin hiện có để chuyển đổi sang đô la Mỹ. Chúng tôi sẽ tải xuống dữ liệu giao dịch cho 9 loại tiền điện tử hàng đầu: Ethereum, Litecoin, Ripple, EthereumClassic, Stellar, Dash, Siacoin, Monero và 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
Hiện chúng ta có một từ điển chứa 9 khung dữ liệu, mỗi khung chứa dữ liệu giá trung bình hàng ngày theo lịch sử giữa các altcoin và Bitcoin.
Chúng ta có thể xác định dữ liệu có chính xác hay không bằng cách xem một vài hàng cuối cùng của bảng giá Ethereum.
altcoin_data['ETH'].tail()
| ETH | Open | High | Low | Close | Volume (BTC) | Volume (Currency) | Weighted Price |
|---|---|---|---|---|---|---|---|
| 2017-08-18 | 0.070510 | 0.071000 | 0.070170 | 0.070887 | 17364.271529 | 1224.762684 | 0.070533 |
| 2017-08-18 | 0.071595 | 0.072096 | 0.070004 | 0.070510 | 26644.018123 | 1893.136154 | 0.071053 |
| 2017-08-18 | 0.071321 | 0.072906 | 0.070482 | 0.071600 | 39655.127825 | 2841.549065 | 0.071657 |
| 2017-08-19 | 0.071447 | 0.071855 | 0.070868 | 0.071321 | 16116.922869 | 1150.361419 | 0.071376 |
| 2017-08-19 | 0.072323 | 0.072550 | 0.071292 | 0.071447 | 14425.571894 | 1039.596030 | 0.072066 |
Bây giờ chúng ta có thể kết hợp dữ liệu tỷ giá hối đoái BTC sang altcoin với Chỉ số giá Bitcoin để tính trực tiếp giá lịch sử của từng altcoin theo USD.
# 将USD Price计算为每个altcoin数据帧中的新列
for altcoin in altcoin_data.keys():
altcoin_data[altcoin]['price_usd'] = altcoin_data[altcoin]['weightedAverage'] * btc_usd_datasets['avg_btc_price_usd']
Tại đây, chúng tôi thêm một cột mới vào khung dữ liệu cho mỗi altcoin để lưu trữ giá USD tương ứng.
Tiếp theo, chúng ta có thể sử dụng lại hàm merge_dfs_on_column đã định nghĩa trước đó để tạo một khung dữ liệu hợp nhất tích hợp giá USD của từng loại tiền điện tử.
# 将每个山寨币的美元价格合并为单个数据帧
combined_df = merge_dfs_on_column(list(altcoin_data.values()), list(altcoin_data.keys()), 'price_usd')
Xong!
Bây giờ chúng ta hãy thêm giá Bitcoin làm cột cuối cùng vào khung dữ liệu đã hợp nhất.
# 将BTC价格添加到数据帧
combined_df['BTC'] = btc_usd_datasets['avg_btc_price_usd']
Bây giờ chúng ta có một khung dữ liệu duy nhất chứa giá USD hàng ngày cho mười loại tiền điện tử mà chúng ta đang xác thực.
Chúng ta gọi lại hàm trước đó df_scatter để hiển thị giá tương ứng của tất cả các altcoin dưới dạng biểu đồ.

Biểu đồ trông ổn và cung cấp cho chúng ta bức tranh toàn cảnh về sự thay đổi giá trao đổi của từng loại tiền điện tử trong vài năm qua.
Lưu ý: Ở đây chúng tôi sử dụng trục y logarit để so sánh tất cả các loại tiền điện tử trên cùng một biểu đồ. Bạn cũng có thể thử các giá trị tham số khác nhau (chẳng hạn như scale=‘linear’) để hiểu dữ liệu từ nhiều góc độ khác nhau.
Những độc giả cẩn thận có thể nhận thấy rằng giá của các loại tiền kỹ thuật số có vẻ tương quan với nhau, mặc dù giá trị tiền tệ của chúng thay đổi rất nhiều và có tính biến động cao. Đặc biệt kể từ đợt tăng nhanh vào tháng 4 năm 2017, thậm chí nhiều biến động nhỏ dường như cũng xảy ra đồng bộ với biến động của toàn bộ thị trường.
Tất nhiên, kết luận được hỗ trợ bởi dữ liệu có sức thuyết phục hơn trực giác dựa trên hình ảnh.
Chúng ta có thể sử dụng hàm Pandas corr() để xác minh giả thuyết tương quan ở trên. Bài kiểm tra này tính toán hệ số tương quan Pearson cho mỗi cột của khung dữ liệu với mọi cột khác.
Ghi chú sửa đổi ngày 22/8/2017: Phần này đã được sửa đổi để sử dụng lợi nhuận hàng ngày thay vì giá tuyệt đối khi tính toán hệ số tương quan.
Tính toán trực tiếp dựa trên chuỗi thời gian không cố định (chẳng hạn như dữ liệu giá thô) có thể dẫn đến độ lệch trong hệ số tương quan. Giải pháp của chúng tôi cho vấn đề này là sử dụng phương thức pct_change() để chuyển đổi giá trị tuyệt đối của mỗi mức giá trong khung dữ liệu thành tỷ lệ lợi nhuận hàng ngày tương ứng.
Ví dụ, hãy tính hệ số tương quan cho năm 2016.
# 计算2016年数字货币的皮尔森相关系数
combined_df_2016 = combined_df[combined_df.index.year == 2016]
combined_df_2016.pct_change().corr(method='pearson')
| Name | DASH | ETC | ETH | LTC | SC | STR | XEM | XMR | XRP | BTC |
|---|---|---|---|---|---|---|---|---|---|---|
| DASH | 1.000000 | 0.003992 | 0.122695 | -0.012194 | 0.026602 | 0.058083 | 0.014571 | 0.121537 | 0.088657 | -0.014040 |
| ETC | 0.003992 | 1.000000 | -0.181991 | -0.131079 | -0.008066 | -0.102654 | -0.080938 | -0.105898 | -0.054095 | -0.170538 |
| ETH | 0.122695 | -0.181991 | 1.000000 | -0.064652 | 0.169642 | 0.035093 | 0.043205 | 0.087216 | 0.085630 | -0.006502 |
| LTC | -0.012194 | -0.131079 | -0.064652 | 1.000000 | 0.012253 | 0.113523 | 0.160667 | 0.129475 | 0.053712 | 0.750174 |
| SC | 0.026602 | -0.008066 | 0.169642 | 0.012253 | 1.000000 | 0.143252 | 0.106153 | 0.047910 | 0.021098 | 0.035116 |
| STR | 0.058083 | -0.102654 | 0.035093 | 0.113523 | 0.143252 | 1.000000 | 0.225132 | 0.027998 | 0.320116 | 0.079075 |
| XEM | 0.014571 | -0.080938 | 0.043205 | 0.160667 | 0.106153 | 0.225132 | 1.000000 | 0.016438 | 0.101326 | 0.227674 |
| XMR | 0.121537 | -0.105898 | 0.087216 | 0.129475 | 0.047910 | 0.027998 | 0.016438 | 1.000000 | 0.027649 | 0.127520 |
| XRP | 0.088657 | -0.054095 | 0.085630 | 0.053712 | 0.021098 | 0.320116 | 0.101326 | 0.027649 | 1.000000 | 0.044161 |
| BTC | -0.014040 | -0.170538 | -0.006502 | 0.750174 | 0.035116 | 0.079075 | 0.227674 | 0.127520 | 0.044161 | 1.000000 |
Biểu đồ trên cho thấy hệ số tương quan. Hệ số gần 1 hoặc -1 có nghĩa là chuỗi có tương quan dương hoặc tương quan nghịch. Hệ số tương quan gần 0 có nghĩa là các đối tượng tương ứng không có tương quan và các biến động của chúng độc lập với nhau.
Để trực quan hóa kết quả tốt hơn, chúng tôi tạo một hàm trợ giúp trực quan hóa mới.
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")

Tại đây, giá trị màu đỏ sẫm biểu thị mối tương quan mạnh (mỗi đồng tiền rõ ràng có mối tương quan cao với chính nó) và giá trị màu xanh lam sẫm biểu thị mối tương quan nghịch. Tất cả các màu ở giữa - xanh nhạt/cam/xám/nâu - đều có giá trị biểu thị các mức độ tương quan yếu hoặc không tương quan khác nhau.
Bức ảnh này cho chúng ta biết điều gì? Ở mức độ cơ bản, nó cho thấy giá của các loại tiền điện tử khác nhau đã biến động như thế nào trong suốt năm 2016, với ít mối tương quan có ý nghĩa thống kê.
Bây giờ, để xác minh giả thuyết của chúng tôi rằng “tiền điện tử đã trở nên tương quan hơn trong những tháng gần đây”, chúng tôi sẽ lặp lại thử nghiệm tương tự bằng cách sử dụng dữ liệu từ năm 2017.
combined_df_2017 = combined_df[combined_df.index.year == 2017]
combined_df_2017.pct_change().corr(method='pearson')
| Name | DASH | ETC | ETH | LTC | SC | STR | XEM | XMR | XRP | BTC |
|---|---|---|---|---|---|---|---|---|---|---|
| DASH | 1.000000 | 0.384109 | 0.480453 | 0.259616 | 0.191801 | 0.159330 | 0.299948 | 0.503832 | 0.066408 | 0.357970 |
| ETC | 0.384109 | 1.000000 | 0.602151 | 0.420945 | 0.255343 | 0.146065 | 0.303492 | 0.465322 | 0.053955 | 0.469618 |
| ETH | 0.480453 | 0.602151 | 1.000000 | 0.286121 | 0.323716 | 0.228648 | 0.343530 | 0.604572 | 0.120227 | 0.421786 |
| LTC | 0.259616 | 0.420945 | 0.286121 | 1.000000 | 0.296244 | 0.333143 | 0.250566 | 0.439261 | 0.321340 | 0.352713 |
| SC | 0.191801 | 0.255343 | 0.323716 | 0.296244 | 1.000000 | 0.417106 | 0.287986 | 0.374707 | 0.248389 | 0.377045 |
| STR | 0.159330 | 0.146065 | 0.228648 | 0.333143 | 0.417106 | 1.000000 | 0.396520 | 0.341805 | 0.621547 | 0.178706 |
| XEM | 0.299948 | 0.303492 | 0.343530 | 0.250566 | 0.287986 | 0.396520 | 1.000000 | 0.397130 | 0.270390 | 0.366707 |
| XMR | 0.503832 | 0.465322 | 0.604572 | 0.439261 | 0.374707 | 0.341805 | 0.397130 | 1.000000 | 0.213608 | 0.510163 |
| XRP | 0.066408 | 0.053955 | 0.120227 | 0.321340 | 0.248389 | 0.621547 | 0.270390 | 0.213608 | 1.000000 | 0.170070 |
| BTC | 0.357970 | 0.469618 | 0.421786 | 0.352713 | 0.377045 | 0.178706 | 0.366707 | 0.510163 | 0.170070 | 1.000000 |
Những dữ liệu này có liên quan hơn không? Liệu nó có đủ để làm tiêu chí đầu tư không? Câu trả lời là không.
Tuy nhiên, điều đáng chú ý là hầu hết các loại tiền điện tử đều ngày càng có tính kết nối với nhau hơn.
correlation_heatmap(combined_df_2017.pct_change(), "Cryptocurrency Correlations in 2017")

Như bạn có thể thấy trong hình trên, mọi thứ đang trở nên ngày càng thú vị hơn.
Câu hỏi hay đấy! Nhưng sự thật là tôi không chắc lắm…
Phản ứng đầu tiên của tôi là các quỹ đầu cơ gần đây đã bắt đầu giao dịch công khai trên thị trường tiền điện tử. Các quỹ này nắm giữ nhiều vốn hơn so với nhà giao dịch trung bình. Nếu một quỹ phòng ngừa vốn đầu tư của mình giữa nhiều loại tiền điện tử và sau đó sử dụng các yếu tố rủi ro tương tự cho từng loại tiền tệ dựa trên một biến độc lập (ví dụ: thị trường chứng khoán), thì sẽ có lợi nhuận cao hơn. Giao dịch chiến lược. Nếu nhìn từ góc độ này, xu hướng tương quan ngày càng tăng là có lý.
Hiểu sâu hơn về XRP và STR
Ví dụ, từ biểu đồ trên, có thể thấy rõ rằng XRP (mã thông báo của Ripple) có mức tương quan thấp nhất với các loại tiền điện tử khác. Nhưng có một ngoại lệ đáng chú ý ở đây là STR (mã thông báo của Stellar, tên chính thức là “Lumens”), có mối tương quan mạnh với XRP (hệ số tương quan: 0,62).
Điều thú vị là Stellar và Ripple là những nền tảng công nghệ tài chính rất giống nhau, cả hai đều hướng đến mục tiêu giảm thiểu các bước rườm rà liên quan đến việc chuyển tiền giữa các ngân hàng xuyên biên giới. Có thể một số công ty lớn và quỹ đầu cơ sẽ sử dụng các chiến lược giao dịch tương tự cho khoản đầu tư của họ vào Stellar và Ripple, xét đến tính tương đồng của các mã thông báo được sử dụng bởi các dịch vụ blockchain. Đây có thể là lý do tại sao XRP có mối tương quan mạnh hơn với STR so với các loại tiền điện tử khác.
Những giải thích trên phần lớn chỉ mang tính suy đoán và bạn có thể đưa ra giải thích tốt hơn. Dựa trên nền tảng chúng tôi đã đặt ra, có hàng trăm cách khác nhau để bạn có thể tiếp tục khám phá những câu chuyện trong dữ liệu của mình.
Sau đây là một số gợi ý của tôi để độc giả cân nhắc khi nghiên cứu thêm:
Điểm tuyệt vời nhất về Bitcoin và tiền kỹ thuật số nói chung là bản chất phi tập trung của chúng, khiến chúng tự do và dân chủ hơn bất kỳ tài sản nào khác. Chia sẻ phân tích của bạn dưới dạng mã nguồn mở, tham gia vào cộng đồng hoặc viết bài đăng trên blog! Hy vọng rằng bây giờ bạn đã có đủ các kỹ năng cần thiết để tự phân tích và có thể suy nghĩ phản biện về bất kỳ bài viết đầu cơ tiền điện tử nào mà bạn đọc trong tương lai, đặc biệt là những dự đoán không có dữ liệu hỗ trợ. Cảm ơn bạn đã đọc. Nếu bạn có bất kỳ bình luận, đề xuất hoặc chỉ trích nào về hướng dẫn này, vui lòng để lại tin nhắn tại https://www.fmz.com/bbs.