
Bagaimanakah prestasi harga Bitcoin? Apakah yang menyebabkan harga mata wang kripto melambung dan menjunam? Adakah harga pasaran altcoin yang berbeza berkait rapat atau adakah ia sebahagian besarnya bebas? Bagaimana kita meramalkan apa yang akan berlaku seterusnya?
Artikel tentang mata wang digital, seperti Bitcoin dan Ethereum, kini penuh dengan spekulasi, dengan beratus-ratus pakar yang mendakwa diri mereka menyokong trend yang mereka jangka akan muncul. Apa yang hilang daripada kebanyakan analisis ini ialah asas yang kukuh dalam data asas dan model statistik.
Matlamat artikel ini adalah untuk memberikan pengenalan ringkas kepada analisis mata wang kripto menggunakan Python. Kami akan melalui skrip Python mudah untuk mendapatkan, menganalisis dan memvisualisasikan data untuk mata wang kripto yang berbeza. Sepanjang perjalanan, kami akan menemui arah aliran menarik dalam gelagat pasaran yang tidak menentu ini dan cara ia berkembang.

Ini bukan artikel yang menerangkan mata wang kripto, dan juga bukan satu pendapat tentang mata wang tertentu akan meningkat dan mana yang akan jatuh. Sebaliknya, tumpuan kami dalam tutorial ini hanyalah mengambil data mentah dan menemui cerita yang tersembunyi dalam nombor.
Tutorial ini direka bentuk untuk peminat, jurutera dan saintis data dari semua peringkat kemahiran Sama ada anda pakar industri atau pemula pengaturcaraan, satu-satunya kemahiran yang anda perlukan ialah pemahaman asas bahasa pengaturcaraan Python dan pengetahuan yang mencukupi tentang operasi baris arahan. (Dapat menyediakan projek sains data akan berjaya).
Selain menyediakan sumber data berkualiti tinggi daripada bursa arus perdana utama, Inventor Quantitative Platform FMZ.COM juga menyediakan set antara muka API yang kaya untuk membantu kami melakukan transaksi automatik selepas menyelesaikan analisis data. Set antara muka ini termasuk alat praktikal seperti menanyakan maklumat akaun, menanya harga tinggi, pembukaan, rendah, penutupan, volum dagangan, pelbagai penunjuk analisis teknikal yang biasa digunakan bagi pelbagai bursa arus perdana, dsb., terutamanya untuk menyambung ke bursa arus perdana utama secara sebenar. proses perdagangan Antara muka API awam menyediakan sokongan teknikal yang berkuasa.
Semua fungsi yang disebutkan di atas dirangkumkan dalam sistem yang serupa dengan Docker Apa yang perlu kita lakukan ialah membeli atau menyewa perkhidmatan pengkomputeran awan kita sendiri dan kemudian menggunakan sistem Docker.
Atas nama rasmi Platform Kuantitatif Inventor, sistem Docker ini dipanggil sistem hos.
Untuk mendapatkan maklumat lanjut tentang cara menggunakan hos dan robot, sila rujuk artikel saya sebelum ini: https://www.fmz.com/bbs-topic/4140
Pembaca yang ingin membeli hos penggunaan pelayan pengkomputeran awan mereka sendiri boleh merujuk artikel ini: https://www.fmz.com/bbs-topic/2848
Selepas berjaya menggunakan perkhidmatan pengkomputeran awan dan sistem hos, kami akan memasang alat Python yang paling berkuasa: Anaconda
Untuk mencapai semua persekitaran program yang berkaitan yang diperlukan untuk artikel ini (pustaka bergantung, pengurusan versi, dll.), cara paling mudah ialah menggunakan Anaconda. Ia adalah ekosistem sains data Python yang dibungkus dan pengurus pergantungan.
Memandangkan kami memasang Anaconda pada perkhidmatan awan, kami mengesyorkan anda memasang sistem Linux serta versi baris arahan Anaconda pada pelayan awan.
Untuk kaedah pemasangan Anaconda, sila rujuk panduan rasmi Anaconda: https://www.anaconda.com/distribution/
Jika anda seorang pengaturcara Python yang berpengalaman dan tidak merasakan keperluan untuk menggunakan Anaconda, itu tidak mengapa. Saya akan menganggap bahawa anda tidak memerlukan bantuan untuk memasang kebergantungan yang diperlukan dan anda boleh melangkau ke Bahagian 2.
Selepas Anaconda dipasang, kami perlu mencipta persekitaran baharu untuk menguruskan pakej pergantungan kami. Dalam antara muka baris arahan Linux, kami masukkan:
conda create --name cryptocurrency-analysis python=3
Mari cipta persekitaran Anaconda baharu untuk projek kami.
Seterusnya, masukkan
source activate cryptocurrency-analysis (linux/MacOS操作)
或者
activate cryptocurrency-analysis (windows操作系统)
Untuk mengaktifkan persekitaran ini
Seterusnya, masukkan:
conda install numpy pandas nb_conda jupyter plotly
Untuk memasang pelbagai pakej pergantungan yang diperlukan untuk projek ini.
Nota: Mengapa menggunakan persekitaran Anaconda? Jika anda merancang untuk menjalankan banyak projek Python pada komputer anda, adalah berguna untuk memisahkan kebergantungan (perpustakaan dan pakej) projek yang berbeza untuk mengelakkan konflik. Ananconda mencipta direktori persekitaran khas untuk pakej pergantungan setiap projek supaya semua pakej boleh diurus dan dibezakan dengan betul.
Selepas persekitaran dan pakej kebergantungan dipasang, jalankan
jupyter notebook
untuk memulakan kernel iPython, kemudian arahkan penyemak imbas anda ke http://localhost:8888/ dan buat buku nota Python baharu, pastikan ia menggunakan:
Python [conda env:cryptocurrency-analysis]
Inti

Cipta buku nota Jupyter kosong baharu dan perkara pertama yang perlu kita lakukan ialah mengimport pakej pergantungan yang diperlukan.
import os
import numpy as np
import pandas as pd
import pickle
from datetime import datetime
Kami juga perlu mengimport Plotly dan mendayakan mod luar talian
import plotly.offline as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
py.init_notebook_mode(connected=True)
Setelah persediaan selesai, kita boleh mula memperoleh data untuk dianalisis. Pertama, kita perlu menggunakan antara muka API Platform Kuantitatif Pencipta untuk mendapatkan data harga Bitcoin.
Ini akan menggunakan fungsi GetTicker Untuk butiran tentang penggunaan kedua-dua fungsi ini, sila lihat: https://www.fmz.com/api
Untuk memudahkan pemerolehan data, kita perlu menulis fungsi untuk memuat turun dan menyegerakkan data daripada Quandl (quandl.com). Ini adalah antara muka data kewangan percuma yang sangat terkenal di luar negara. Platform Kuantitatif Inventor juga menyediakan antara muka data yang serupa, yang digunakan terutamanya untuk dagangan masa nyata Memandangkan artikel ini adalah untuk analisis data, kami masih menggunakan data Quandl di sini.
Apabila berdagang dalam masa nyata, anda boleh menghubungi terus fungsi GetTicker dan GetRecords dalam Python untuk mendapatkan data harga Untuk penggunaannya, sila rujuk: 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
Pustaka acar digunakan di sini untuk mensirikan data dan menyimpan data yang dimuat turun sebagai fail, supaya program tidak memuat turun semula data yang sama setiap kali ia dijalankan. Fungsi ini akan mengembalikan data dalam format Pandas Dataframe. Jika anda tidak biasa dengan konsep bingkai data, anggap ia sebagai hamparan Excel yang berkuasa.
Mari gunakan pertukaran Bitcoin Kraken sebagai contoh dan mulakan dengan mendapatkan harga Bitcoinnya.
# 获取Kraken比特币交易所的价格
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')
Gunakan kaedah head() untuk melihat lima baris pertama bingkai data.
btc_usd_price_kraken.head()
Hasilnya ialah:
| 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 |
Seterusnya, kita perlu membuat jadual mudah untuk mengesahkan ketepatan data melalui visualisasi.
# 做出BTC价格的表格
btc_trace = go.Scatter(x=btc_usd_price_kraken.index, y=btc_usd_price_kraken['Weighted Price'])
py.iplot([btc_trace])

Di sini, kami menggunakan Plotly untuk melengkapkan bahagian visualisasi. Plotly ialah pilihan yang kurang biasa berbanding menggunakan beberapa pustaka visualisasi data Python yang lebih matang, seperti Matplotlib, tetapi ia adalah pilihan yang baik kerana ia boleh menghubungi D3.js untuk carta interaktif sepenuhnya. Carta mempunyai tetapan lalai yang sangat bagus, mudah untuk diterokai dan sangat mudah untuk dibenamkan dalam halaman web.
Petua: Anda boleh membandingkan carta yang dijana dengan carta harga Bitcoin daripada bursa utama (seperti yang terdapat di OKEX, Binance atau Huobi) sebagai semakan kewarasan pantas untuk mengesahkan bahawa data yang dimuat turun adalah kira-kira konsisten.
Pembaca yang berhati-hati mungkin menyedari bahawa terdapat data yang hilang dalam data di atas, terutamanya pada akhir 2014 dan awal 2016. Jurang data ini amat ketara dalam pertukaran Kraken. Kami pastinya tidak mahu data yang hilang ini menjejaskan analisis harga kami.
Ciri pertukaran mata wang digital ialah harga mata wang ditentukan oleh penawaran dan permintaan. Oleh itu, tiada harga transaksi boleh menjadi “harga arus perdana” pasaran. Untuk menangani isu ini, serta masalah data yang hilang yang disebutkan di atas (mungkin disebabkan oleh gangguan teknikal dan ralat data), kami akan memuat turun data daripada tiga bursa Bitcoin utama di dunia dan mengira purata harga Bitcoin.
Mari mulakan dengan memuat turun data untuk setiap pertukaran ke dalam bingkai data yang terdiri daripada jenis kamus.
# 下载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
Seterusnya, kami akan mentakrifkan fungsi khas untuk menggabungkan lajur biasa daripada setiap bingkai data ke dalam bingkai data baharu. Mari kita panggil fungsi 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)
Sekarang, gabungkan semua bingkai data bersama-sama berdasarkan lajur “harga wajaran” bagi setiap set data.
# 整合所有数据帧
btc_usd_datasets = merge_dfs_on_column(list(exchange_data.values()), list(exchange_data.keys()), 'Weighted Price')
Akhir sekali, kami menggunakan kaedah “tail()” untuk melihat lima baris terakhir data yang digabungkan untuk memastikan data itu betul dan lengkap.
btc_usd_datasets.tail()
Hasilnya ialah:
| 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 |
Seperti yang anda boleh lihat daripada jadual di atas, data ini selaras dengan jangkaan kami Julat data adalah lebih kurang sama, tetapi terdapat sedikit perbezaan berdasarkan kependaman atau ciri setiap pertukaran.
Dari perspektif logik analitikal, langkah seterusnya ialah membandingkan data ini melalui visualisasi. Untuk melakukan ini, kita perlu terlebih dahulu mentakrifkan fungsi pembantu yang menggunakan data untuk membuat carta dengan menyediakan arahan baris tunggal Mari kita panggil fungsi 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)
Untuk pemahaman mudah anda, artikel ini tidak akan membincangkan prinsip logik fungsi tambahan ini secara terperinci. Jika anda ingin mengetahui lebih lanjut, lihat dokumentasi rasmi untuk Pandas dan Plotly.
Kini kita boleh membuat graf data harga Bitcoin dengan mudah!
# 绘制所有BTC交易价格
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')

Seperti yang anda boleh lihat daripada graf di atas, walaupun empat siri mengikut laluan yang hampir sama, terdapat beberapa penyelewengan di dalamnya, yang akan kami cuba selesaikan.
Dalam tempoh 2012-2017, kami tahu bahawa harga Bitcoin tidak pernah sama dengan sifar, jadi kami mula-mula mengalih keluar semua nilai sifar dalam bingkai data.
# 清除"0"值
btc_usd_datasets.replace(0, np.nan, inplace=True)
Selepas membina semula bingkai data, kita dapat melihat graf yang lebih jelas tanpa data yang hilang.
# 绘制修订后的数据框
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')

Kini kami boleh mengira lajur baharu: purata harga harian Bitcoin merentas semua bursa.
# 将平均BTC价格计算为新列
btc_usd_datasets['avg_btc_price_usd'] = btc_usd_datasets.mean(axis=1)
Lajur baharu ialah indeks harga Bitcoin! Mari kita rancang sekali lagi untuk memeriksa sama ada terdapat sesuatu yang salah dengan data.
# 绘制平均BTC价格
btc_trace = go.Scatter(x=btc_usd_datasets.index, y=btc_usd_datasets['avg_btc_price_usd'])
py.iplot([btc_trace])

Nampaknya tiada masalah, dan kami akan terus menggunakan data siri harga agregat ini kemudian untuk dapat menentukan kadar pertukaran antara mata wang kripto lain dan dolar AS.
Setakat ini, kami mempunyai data siri masa untuk harga Bitcoin. Seterusnya, mari kita lihat beberapa data mengenai mata wang digital bukan Bitcoin, iaitu altcoin Sudah tentu, istilah altcoin mungkin agak terlalu kuat, tetapi bagi perkembangan semasa mata wang digital, sebagai tambahan kepada kedudukan permodalan pasaran Kebanyakan. sepuluh teratas (seperti Bitcoin, Ethereum, EOS, USDT, dll.) boleh dipanggil altcoin Tidak ada masalah Kita harus cuba menjauhi mata wang ini apabila berdagang kerana ia terlalu mengelirukan dan menipu.
Pertama, kami menggunakan API pertukaran Poloniex untuk mendapatkan maklumat data mengenai transaksi mata wang digital. Kami mentakrifkan dua fungsi tambahan untuk mendapatkan data altcoin yang berkaitan Kedua-dua fungsi ini terutamanya memuat turun dan menyimpan data JSON melalui API.
Mula-mula, kami mentakrifkan fungsi get_json_data, yang akan memuat turun dan menyimpan data JSON daripada URL yang diberikan.
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
Seterusnya, kami mentakrifkan fungsi baharu yang akan membuat permintaan HTTP kepada API Poloniex dan memanggil fungsi get_json_data yang baru kami tentukan untuk menyimpan hasil panggilan.
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
Fungsi di atas akan mengekstrak kod rentetan pasangan mata wang kripto (seperti “BTC_ETH”) dan mengembalikan bingkai data yang mengandungi harga sejarah kedua-dua mata wang.
Kebanyakan altcoin tidak boleh dibeli secara langsung menggunakan dolar A.S. Jika individu ingin mendapatkan mata wang digital ini, mereka biasanya perlu membeli Bitcoin dahulu dan kemudian menukarnya dengan altcoin berdasarkan nisbah harga antara mereka. Oleh itu, kita perlu memuat turun kadar pertukaran untuk setiap mata wang digital kepada Bitcoin, dan kemudian menggunakan data harga Bitcoin sedia ada untuk menukar kepada dolar AS. Kami akan memuat turun data transaksi untuk 9 mata wang kripto teratas: Ethereum, Litecoin, Ripple, EthereumClassic, Stellar, Dash, Siacoin, Monero dan 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
Kami kini mempunyai kamus yang mengandungi 9 bingkai data, setiap satu mengandungi data harga purata harian sejarah antara altcoin dan Bitcoin.
Kita boleh menentukan sama ada data itu betul dengan melihat beberapa baris terakhir jadual harga 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 |
Kami kini boleh menggabungkan data kadar pertukaran BTC kepada altcoin dengan Indeks Harga Bitcoin kami untuk mengira secara langsung harga sejarah setiap altcoin dalam 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']
Di sini, kami menambah lajur baharu pada bingkai data bagi setiap altcoin untuk menyimpan harga USD yang sepadan.
Seterusnya, kami boleh menggunakan semula fungsi merge_dfs_on_column yang kami takrifkan sebelum ini untuk mencipta rangka data gabungan yang menyepadukan harga USD bagi setiap mata wang kripto.
# 将每个山寨币的美元价格合并为单个数据帧
combined_df = merge_dfs_on_column(list(altcoin_data.values()), list(altcoin_data.keys()), 'price_usd')
Selesai!
Sekarang mari kita tambahkan juga harga Bitcoin sebagai lajur terakhir pada bingkai data yang digabungkan.
# 将BTC价格添加到数据帧
combined_df['BTC'] = btc_usd_datasets['avg_btc_price_usd']
Kini kami mempunyai bingkai data unik yang mengandungi harga USD harian untuk sepuluh mata wang kripto yang kami sahkan.
Kami memanggil fungsi sebelumnya df_scatter sekali lagi untuk memaparkan harga yang sepadan bagi semua altcoin dalam bentuk carta.

Carta itu kelihatan baik, dan ia memberi kita gambaran lengkap tentang bagaimana harga pertukaran setiap mata wang kripto telah berubah sejak beberapa tahun lalu.
Nota: Di sini kami telah menggunakan paksi-y logaritma untuk membandingkan semua mata wang kripto pada graf yang sama. Anda juga boleh mencuba nilai parameter yang berbeza (seperti skala=‘linear’) untuk memahami data dari perspektif yang berbeza.
Pembaca yang berhati-hati mungkin menyedari bahawa harga mata wang digital kelihatan berkorelasi, walaupun nilai monetarinya berbeza-beza secara meluas dan sangat tidak menentu. Terutama sejak kenaikan pesat pada April 2017, malah banyak turun naik kecil nampaknya berlaku selari dengan turun naik keseluruhan pasaran.
Sudah tentu, kesimpulan yang disokong oleh data lebih meyakinkan daripada intuisi berdasarkan imej.
Kita boleh menggunakan fungsi Pandas corr() untuk mengesahkan hipotesis korelasi di atas. Ujian ini mengira pekali korelasi Pearson untuk setiap lajur bingkai data dengan setiap lajur lain.
2017.8.22 Nota Semakan: Bahagian ini telah diubah suai untuk menggunakan pulangan harian dan bukannya harga mutlak semasa mengira pekali korelasi.
Pengiraan langsung berdasarkan siri masa bukan pepejal (seperti data harga mentah) boleh membawa kepada penyelewengan dalam pekali korelasi. Penyelesaian kami kepada masalah ini ialah menggunakan kaedah pct_change() untuk menukar nilai mutlak setiap harga dalam bingkai data kepada kadar pulangan harian yang sepadan.
Sebagai contoh, mari kita hitung pekali korelasi untuk 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 |
Graf di atas menunjukkan pekali korelasi. Pekali hampir 1 atau -1 bermakna jujukan itu berkorelasi positif atau berkorelasi songsang, masing-masing Pekali korelasi hampir 0 bermakna objek yang sepadan tidak berkorelasi dan turun naiknya adalah bebas antara satu sama lain.
Untuk menggambarkan hasil dengan lebih baik, kami mencipta fungsi pembantu visualisasi baharu.
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")

Di sini, nilai merah gelap mewakili korelasi yang kuat (setiap syiling jelas sangat berkorelasi dengan dirinya sendiri), dan nilai biru tua mewakili korelasi songsang. Semua warna di antaranya - biru muda/oren/kelabu/coklat - mempunyai nilai yang mewakili pelbagai darjah korelasi lemah atau tiada korelasi.
Apakah gambar ini memberitahu kita? Pada peringkat asas, ia menunjukkan bagaimana harga mata wang kripto yang berbeza berubah-ubah sepanjang tahun 2016, dengan sedikit korelasi yang signifikan secara statistik.
Sekarang, untuk mengesahkan hipotesis kami bahawa “mata wang kripto telah menjadi lebih berkorelasi dalam beberapa bulan kebelakangan ini”, kami akan mengulangi ujian yang sama menggunakan data dari 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 |
Adakah data ini lebih relevan? Adakah ia mencukupi untuk dijadikan sebagai kriteria untuk pelaburan? Jawapannya tidak.
Walau bagaimanapun, perlu diingat bahawa hampir semua mata wang kripto telah menjadi semakin saling berkaitan.
correlation_heatmap(combined_df_2017.pct_change(), "Cryptocurrency Correlations in 2017")

Seperti yang anda boleh lihat dari gambar di atas, perkara-perkara semakin menarik.
Soalan yang bagus! Tetapi hakikatnya, saya tidak begitu pasti…
Reaksi pertama saya ialah dana lindung nilai baru-baru ini mula berdagang secara terbuka dalam pasaran mata wang kripto. Dana ini memegang lebih banyak modal daripada peniaga biasa Jika dana melindung nilai modal pelaburannya antara berbilang mata wang kripto dan kemudian menggunakan faktor risiko yang serupa untuk setiap mata wang berdasarkan pembolehubah bebas (cth., pasaran saham), ia akan menjadi lebih menguntungkan strategi. Jika dilihat dari perspektif ini, trend peningkatan korelasi masuk akal.
Pemahaman yang lebih mendalam tentang XRP dan STR
Sebagai contoh, daripada carta di atas, jelas bahawa XRP (token Ripple) adalah yang paling rendah berkorelasi dengan mata wang kripto lain. Tetapi satu pengecualian yang ketara di sini ialah STR (token Stellar, secara rasmi dipanggil “Lumens”), yang mempunyai korelasi yang kuat dengan XRP (pekali korelasi: 0.62).
Menariknya, Stellar dan Ripple adalah platform fintech yang hampir sama yang kedua-duanya bertujuan untuk mengurangkan langkah rumit yang terlibat dalam pemindahan wang antara bank merentasi sempadan. Adalah boleh dibayangkan bahawa beberapa pemain besar dan dana lindung nilai mungkin menggunakan strategi dagangan yang serupa untuk pelaburan mereka dalam Stellar dan Ripple, memandangkan persamaan token yang digunakan oleh perkhidmatan blockchain. Ini mungkin sebab XRP mempunyai korelasi yang lebih kuat dengan STR berbanding mata wang kripto lain.
Penjelasan di atas sebahagian besarnya adalah spekulatif, dan anda mungkin boleh melakukan yang lebih baik. Berdasarkan asas yang telah kami letakkan, terdapat ratusan cara berbeza anda boleh terus meneroka cerita dalam data anda.
Berikut adalah beberapa cadangan saya untuk dipertimbangkan oleh pembaca dalam hala tuju penyelidikan mereka:
Bahagian terbaik tentang Bitcoin, dan tentang mata wang digital secara amnya, adalah sifatnya yang terdesentralisasi, yang menjadikannya lebih bebas dan lebih demokratik daripada mana-mana aset lain. Kongsi analisis anda sebagai sumber terbuka, libatkan diri dalam komuniti atau tulis catatan blog! Mudah-mudahan, anda kini mempunyai kemahiran yang anda perlukan untuk menjalankan analisis anda sendiri dan dapat berfikir secara kritis tentang sebarang artikel mata wang kripto spekulatif yang anda baca pada masa hadapan, terutamanya ramalan yang tidak disandarkan oleh data. Terima kasih kerana membaca. Jika anda mempunyai sebarang komen, cadangan atau kritikan tentang tutorial ini, sila tinggalkan mesej di https://www.fmz.com/bbs.